Методичка по информатике. Практикум по дисциплине Информатика Допущено Редакционноиздательским советом угату в качестве учебного пособия для студентов, обучающихся по направлениям подготовки бакалавров 080100 Экономика
Скачать 8.99 Mb.
|
7. Методика выполнения заданий Для выполнения заданий необходимо: 1) изучить теоретическую часть (п.3) и нижеприведенные примеры (п. 7.1 и 7.2), воспользоваться указаниями (п. 7.3); 2) разработать алгоритмы для решения задач согласно выданному варианту, составить программы на языке Pascal, воспользовавшись приведенными примерами, протестировать и представить полученный результат преподавателю; 3) ответить на контрольные вопросы; 4) создать отчет по лабораторной работе в электронном виде. 102 7.1. Пример 1 Составить программу табулирования функции x x x F cos на отрезке b a, с шагом h. Решение. Вычисление значения функции оформим в виде функции. Program pr_3; Var a,b,h,x : real; Function f(t : real) : real; Begin f:=t*cos(t); End; Begin Write('Введите начало и конец отрезка: '); Readln(a,b); Writeln('Введите шаг табуляции: '); Readln(h); Writeln('Аргумент Функция f(x)=x cos(x) '); x:=a; Repeat Writeln (x:6:3, f(x):20:3); x:=x+h; Until x>b; End. 7.2. Для реализации данного задания воспользоваться примером 2. Массив заполнить случайными действительными числами из интервала [-10;12). Пример 2. Составить программу, содержащую функцию нахождения максимального элемента двумерного массива. Решение. В основной программе размерность массива n и m зададим именованными константами, определим тип – массив из n m элементов, массив этого типа и переменную для хранения максимального элемента: Const n=5; m=8; Type MyMass = array[l..n, 1..m] of Real; Var A : MyMass; Max : Real; Функция в этом случае может иметь вид: 103 function Maximum (Var Nmax, Mmax : Byte; Var Mas : MyMass): Real; var max_el : Real; i, j: Byte; begin max_el := Mas[1, 1]; for i := 1 to Nmax do for j := 1 to Mmax do if max_el < Mas[i, j] then max_el := Mas[i, j]; Maximum := max_el; end; Теперь для записи максимального элемента массива A в переменную Max можно использовать оператор: Маx := Maximum (n, m, A); Данная подпрограмма может работать только с массивами типа MyMass. 7.3. Указание При составлении программы для решения задачи оформить основную подпрограмму в виде функции, а подпрограммы ввода и вывода элементов массива – в виде отдельных процедур. Размерности массивов следует задать именованными константами. Воспользоваться примером 3. Все необходимые данные должны передаваться подпрограммам в качестве параметров; все величины, используемые только внутри подпрограмм, должны быть описаны как локальные. Использование глобальных переменных в подпрограммах не допускается! Вывод результатов работы подпрограмм должен выполняться в главной программе. Заполнение массивов следует производить с помощью генератора случайных чисел. Пример 3. Даны два массива из N целых элементов из интервала 30 , 20 . В каждом массиве найти максимальный элемент и затем сравнить их. Решение. В программе будем использовать процедуры заполнения случайными числами, вывода матрицы и нахождения максимального элемента. 104 Program SravMas; {сравнение максимальных и минимальных элементов} Const n=15; Type massiv=Array[1..n] оf Integer; Var m1, m2 : massiv; max1, max2 : Integer; Procedure RandomMas(Var x:massiv); Var i:Integer; Begin For i:=1 To n Do x[i] := -20+Random(50); End; Procedure VivodMas(Var x:massiv); Var i:Integer; Begin For i:=1 To n Do write(x[i]:5); End; Procedure MaxMas(Var x:massiv; Var MX:Integer); Var i:integer; Begin MX:=x[1]; For i:=2 to n do if x[i]>MX then MX:=x[i]; End; Begin {основная программа} Randomize; RandomMas(m1); Writeln('Первый массив:'); VivodMas(m1); RandomMas(m2); Writeln('Второй массив:'); VivodMas(m2); MaxMas(m1,max1); MaxMas(m2, max2); {вызов процедуры нахождения максимального элемента} if max1>max2 then writeln('В 1-м массиве максимальный элемент больше и =',max1) else if max1 105 End. 8. Требования к содержанию и оформлению отчета Отчет о проделанной работе должен содержать: название и цель работы; номер и условие своего варианта; описание основных этапов задания; тексты разработанных программ; полученные при расчетах результаты (скриншоты); анализ полученных результатов и вывод по проделанной работе; ответы на контрольные вопросы в соответствии с указаниями преподавателя. 9. Критерии результативности лабораторного практикума Лабораторная работа считается выполненной, если: задание к лабораторной работе выполнено в полном объеме; студент представил тексты программ и результаты их выполнения, соответствующие поставленным задачам; при устном ответе на 2-3 контрольных вопроса по указанию преподавателя студент демонстрирует знание основных операторов и определений изученной темы и умение применить их при решении соответствующих задач; представленный отчет по лабораторной работе соответствует требованиям п. 8. Контрольные вопросы 1. Дайте определение подпрограммы. 2. Приведите пример описания процедуры. 3. Приведите пример описания функции. 4. Объясните отличие процедуры от функции. 5. Какие переменные называются локальными? Чем глобальные переменные отличаются от локальных? Можно ли локальной переменной дать имя, совпадающее с именем глобальной переменной? 6. Какую роль при работе с подпрограммой выполняют фактические параметры? 106 7. Сколько элементов может содержать список формальных параметров? Сколько элементов должен содержать список фактических параметров? 8. Можно ли в программе формальным параметрам давать имена, совпадающие с именами фактических параметров? Почему? 9. Могут ли фактические параметры быть выражениями? А именами других процедур, функций? 10. В чем отличие параметра-переменной и параметра-значения? 11. Может ли в качестве параметра при вызове подпрограммы, имеющей формальный параметр-значение, выступать: переменная, выражение, константа? 12. Существуют ли ограничения на тип возвращаемого функцией значения? 107 Лабораторная работа № 6 ФАЙЛЫ И ИХ ПРИМЕНЕНИЕ В PASCAL-ПРОГРАММАХ 1. Цель работы Ознакомление с разновидностями файлов в Паскале. Принципы организации и порядок работы с типизированными файлами. Принципы организации и порядок работы с нетипизированными файлами. Организация текстовых файлов, операции чтения и записи текстовых файлов. 2. Задачи работы Овладение основным навыкам организации и порядком работы с типизированными и нетипизированными файлами; получение навыков организации текстовых файлов, операции чтения и записи текстовых файлов. 3. Теоретическая часть 3.1. Основные понятия и определения Файл – именованная область памяти на устройстве хранения информации. Файловая переменная – внутренняя структура данных Паскаля, используемая для всех операций с файлами. Связывание файловой переменной – установка соответствия между файловой переменной и файлом на диске. Требуется для любых операций с файлом. Указатель файла – маркер, показывающий, с какой позиции будет производиться чтение/запись в файле. Признак начала файла – состояние, при котором указатель файла находится перед первым элементом файла. Признак конца файла – состояние, при котором указатель файла находится за последним элементом файла. Признак конца строки – состояние, при котором указатель файла находится перед символами конца строки в текстовом файле. Блочная операция чтения/записи – операция чтения/записи, при выполнении которой считывается/записывается несколько элементов данных. 108 3.2. Теоретические сведения Как правило, пользователь работает с компьютером не один раз. Зачастую информация, с которой работает пользователь, требуется многократно в течение длительного времени. Держать эту информацию постоянно в оперативной памяти нерационально. Для долговременного хранения информации ее требуется организовать. Для долгосрочного хранения информации применяются файлы. Файл – это именованная область памяти на долгосрочном запоминающем устройстве, например, на жестком диске или дискете. Язык Паскаль предлагает несколько способов для работы с файлами. В Паскале выделяют три типа файлов: текстовые, типизированные, нетипизированные. Текстовый файл – содержит строки текста различной длины, чтение или запись осуществляется (как правило) построчно. Типизированный файл – с точки зрения Паскаля содержит элементы одного типа, единицей обмена информацией является один элемент. Т.е. за одну операцию чтения или записи можно прочитать или записать только один элемент файла. Нетипизированный файл – содержит любые данные, Паскалем никак не интерпретируемые. Позволяет производить за одну операцию чтение/запись сразу нескольких элементов. Для файлов с произвольным доступом есть понятие файлового указателя. Принцип организации указателя приведен на рис. 1. компоненты файла файл указатель файла Рис. 1. Принцип организации указателя Фактически указатель располагается между компонентами файла. В общем случае можно говорить о том, что указатель находится перед компонентой, которая будет считана или записана следующей операцией чтения/записи. 109 Доступ к файлу в программе происходит с помощью переменных файлового типа. Переменную файлового типа описывают одним из трех способов: file of <тип> типизированный файл (указан тип компоненты); text текстовый файл; file нетипизированный файл. Примеры описания файловых переменных: var f1: file of integer; {файл с целыми числами} f3: file; {нетипизированный файл} t: text; {текстовый файл} 3.2.1. Стандартные процедуры и функции. Любые дисковые файлы становятся доступными программе после связывания их с файловой переменной, объявленной в программе. Все операции в программе производятся только с помощью связанной с ним файловой переменной. Процедура Assign связывает файловую переменную f с физическим файлом, полное имя которого задано в строке FileName. Установленная связь будет действовать до конца работы программы, или до тех пор, пока не будет сделано переназначение. Assign(f, FileName); После связи файловой переменной с дисковым именем файла в программе нужно указать направление передачи данных (открыть файл). В зависимости от этого направления говорят о чтении из файла или записи в файл. Процедура ReSet(f) открывает для чтения файл, с которым связана файловая переменная f. После успешного выполнения процедуры ReSet файл готов к чтению из него первого элемента. Процедура завершается с сообщением об ошибке, если указанный файл не найден. Процедура ReWrite(f) открывает для записи файл, с которым связана файловая переменная f. После успешного выполнения этой процедуры файл готов к записи в него первого элемента. Если указанный файл уже существовал, то все данные из него уничтожаются. 110 Процедура Close(f) закрывает открытый до этого файл с файловой переменной f. Вызов процедуры Close необходим при завершении работы с файлом. Если по какой-то причине процедура Close не будет выполнена, файл все-таки будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено. Процедура EOF(f) возвращает значение TRUE, когда при чтении достигнут конец файла. Это означает, что уже прочитан последний элемент в файле или файл после открытия оказался пуст. Процедура Rename(f, NewName) позволяет переименовать физический файл на диске, связанный с файловой переменной f. Переименование возможно после закрытия файла. Процедура Erase(f) уничтожает физический файл на диске, который был связан с файловой переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт. 3.2.2. Текстовые файлы. Текстовый файл это совокупность строк, разделенных метками конца строки. Сам файл заканчивается меткой конца файла. Доступ к каждой строке возможен лишь последовательно, начиная с первой. Одновременная запись и чтение запрещены. Текстовый файл содержит строки текста различной длины. Каждая строка завершается символами «Возврат каретки» (код 13) и «Перевод строки» (код 10). При обычном просмотре эти символы на экране не отображаются, а интерпретируются компьютером как признак окончания одной строки и начала следующей. Текстовый файл не эквивалентен объявлению типизированного файла с элементами типа «строка». Объявление текстового файла выглядит следующим образом: Var FT: Text; Как и в случае других типов файлов, перед работой с текстовым файлом, предварительно необходимо связать файловую переменную с файлом на диске: Assign(FT,’log.txt’); При работе с текстовым файлом разрешается либо чтение, либо запись. Открытие файла для чтения или записи выполняется 111 процедурами ReSet или ReWrite. Для текстовых файлов, помимо процедур ReSet/ReWrite, определена еще одна процедура открытия: Append(F); Данная процедура открывает файл для записи, при этом новые данные добавляются в конец файла, прежнее содержимое файла сохраняется (в отличие от процедуры ReWrite). Далее в зависимости от способа открытия файла можно либо читать из него данные, применив операторы Read(FT, i,j), ReadLn(FT, s), либо записывать в него данные, применяя операторы Write(FT, a,b,c), WriteLn(FT, Result). При чтении/записи данных применяются те же правила, что и при вводе/выводе с клавиатуры/на экран, т.е. можно использовать форматирование: WriteLn(F, x:5:2, y:10:3). Процедуры считывают информацию из файла f и записывают соответственно в указанные переменные. Способ чтения зависит от типа переменных, стоящих в списке. В переменную char помещаются символы из файла. В числовую переменную: пропускаются символы- разделители, начальные пробелы и считывается значение числа до появления следующего разделителя. В переменную типа string помещается количество символов, равное длине строки, но только в том случае, если раньше не встретились символы конца строки или конца файла. Отличие опрератора ReadLn от Read в том, что в случае применения оператора ReadLn после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки. Если список переменных отсутствует, то процедура ReadLn(f) пропускает строку при чтении текстового файла. Диаграмма последовательности вызываемых процедур для текстовых файлов: 112 Assign ReSet ReWrite Append Write / WriteLn Read / ReadLn Close Рис. 2. Последовательность вызываемых процедур для текстовых файлов 3.2.3. Типизированные файлы. Типизированный файл – это последовательность компонент любого заданного типа (кроме типа «файл»). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту. Типизированный файл, содержит компоненты одного конкретного типа. Это могут быть простые или сложные типы данных Паскаля (числа, строки, символы, массивы, записи и т.д.). Объявление типизированного файла выглядит следующим образом: Type FInt = file of Integer; { файл с целыми числами } Var F: FInt; F2: File of Real; FT: File of String[70]; { файл со строками } После объявления файловой переменной для работы с файлом необходимо связать ее с реальным файлом на диске. Это выполняется процедурой Assign: Assign(F,’c:\test\testfile.dat’); Первый параметр – имя файловой переменной, используемой в дальнейшем для обращения к файлу. Может иметь любой файловый тип. Второй параметр – строка, указывающая на путь и имя файла, с которым Паскаль далее будет оперировать. Имя файла рекомендуется 113 задавать по правилам MS-DOS (не более 8 символов имя, не более 3 – расширение, англ. буквы). Если файл будет считываться, он должен присутствовать на диске. Если создается новый файл, он может отсутствовать. Процедура Assign не проверяет наличие файла на диске! Для создания нового файла на диске после выполнения процедуры Assign необходимо открыть файл в режиме записи: ReWrite(F), где F – это файловая переменная. Если файл с таким именем не существовал, он создается. Если он существовал, вся информация из этого файла стирается и файл становится пустой. При этом никаких предупреждений не выдается! Для открытия файла в режиме чтения он должен быть открыть процедурой: Reset(F); После этого можно выполнять чтение или запись, используя соответствующую файловую переменную: Read(F,i,j); Write(F,n); В первом примере из файла, связанного с переменной F, считывается два значения, во втором – записывается одно. Эти операции можно выполнять многократно. Например, можно считать из открытого файла все значения и вывести их на экран: Var F: file of Integer; { объявление файловой переменной } N: Integer; Begin Assign(F,’data.dat’); { связать F с файлом на диске} ReSet(F); { открыть файл } While not EOF(F) do begin { пока не конец файла} Read(F,N); { считать число из файла } WriteLn(N); { вывести число на экран } End; Close(F); { закрыть файл } End. В данном примере показана типовая последовательность действий при работе с файлами. Цепочка вызовов «Assign – 114 ReSet/ReWrite – Read/Write – Close» должна присутствовать в любой программе, использующей типизированные файлы. Последовательность вызываемых процедур при работе с типизированными файлами представлена на рис. 3. Assign ReSet Read/Write ReWrite Write Close Рис. 3. Последовательность вызываемых процедур для типизированных файлов При любой операции чтения/записи указатель текущей позиции смещается на одну единицу. Для определения текущей позиции указателя применяется функция FilePos: N := FilePos(F); Эта функция возвращает положение указателя относительно начала файла. Самая первая позиция имеет номер 0. Переместить указатель в требуемую позицию можно, используя функцию Seek: Seek(F,5); Seek(F,FilePos(F)-1); Первый оператор устанавливает позицию указателя в файле после 5 элемента (и перед 6-м). Следующий оператор вызывает смещение указателя файла на 1 элемент назад относительно текущего положения указателя. Дополнительно для проверки положения указателя есть функция EOF. Эта функция возвращает логическое значение, показывающее, находится ли указатель файла после последнего элемента файла. Чаще всего эта функция применяется в задачах полного перебора элементов файла: While not EOF(F) do Read(F,i); Этот оператор считывает элементы файла, пока не доберется до конца файла. 115 Общее число компонент файла можно определить, вызвав функцию FileSize: Count := FileSize(F); Эта функция возвращает целое число, равное количеству компонент в указанном файле. Отсечение последних компонент файла: Truncate(f); Процедура отсекает конец файла, начиная с текущей позиции включительно. |