программирование. Сборник методических указаний по выполнению практических работ по учебной дисциплине основы алгоритмизации и программирования структурное программирование
Скачать 0.68 Mb.
|
ТЕМА: ОРГАНИЗАЦИЯ ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ТЕКСТОВЫХ ФАЙЛОВ Цель работы: научиться объявлять текстовые файлы в программе, научиться создавать и обрабатывать текстовые файлы с помощью языка программирования Паскаль. Оборудование: ПК, ИСР Pascal ABC ТЕОРЕТИЧЕСКИЕ ДАННЫЕ В Паскале понятие файла употребляется в двух смыслах: 1. как поименованная информация на внешнем носителе (внешний файл); 2. как переменная файлового типа (внутренний файл) Файловый тип переменной — это структурированный тип, представляющий собой совокупность однотипных элементов Файл можно представить как последовательную цепочку элементов, пронумерованных от 0, заканчивающуюся специальным кодом, который называется маркер конца Эл. 0 Эл. 1 …. Эл. n Маркер конца Структура описания файловой переменной Var <имя переменной>: File of <тип элемента> Например: Var F1: file of Integer; F2: file of Real; F3: file of Char; Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре ASSIGN: ASSIGN (<ф.п.>, <имя файла или л.у.>); Здесь <ф.п.> - файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа); <имя файла> - текстовое выражение, содержащее имя файла Инициализация файла Инициировать файл означает указать для этого файла направление передачи данных. В Турбо Паскале можно открыть файл для чтения, для записи информации, а также для чтения и записи одновременно. Процедура APPEND инициирует запись в ранее существовавший текстовый файл для его расширения, при этом указатель файла устанавливается в его конец. Процедура APPEND применима только к текстовым файлам, т.е. их файловая переменная должна иметь тип TEXT . Процедурой APPEND нельзя инициировать запись в типизированный или нетипизированный файл. Если текстовый файл ранее уже был открыт с помощью RESET или 56 REWRITE, использование процедуры APPEND приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей. Процедура CLOSE Закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой ASSIGN, сохраняется. Формат обращения: CLOSE (<ф.п.>) При создании нового или расширении старого файла процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Функции процедуры CLOSE выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Поскольку связь файла с файловой переменной сохраняется, файл можно повторно открыть без дополнительного использования процедуры ASSIGN. Типы файлов В Паскале различают текстовые, типизированные и нетипизированные файлы Текстовые файлы предназначены для хранения текстовой информации. Для доступа к записям применяются процедуры READ, READLN, WRITE, WRITELN. В этом случае осуществляется обращение к дисковому файлу или логическому устройству, связанному с переменной процедурой ASSIGN. Приступая к решению задач этого раздела, следует вспомнить, что: 1. в программе, которая выводит результаты в файл или читает исходные данные из файла, должна быть объявлена файловая переменная типа text; 2. для доступа к конкретному файлу файловую переменную нужно связать с этим файлом (делается это при помощи инструкции assign); 3. для того, чтобы файл был доступен, его надо открыть (для ЧТЕНИЯ С ПОМОЩЬЮ ИНСТРУКЦИИ reset, ДЛЯ ЗАПИСИ — rewrite, для добавления — append); 4. при работе с файлами возможны ошибки, например, из-за того, что программа пытается открыть файл, которого нет, поэтому после каждой инструкции, которая может привести к возникновению ошибки, желательно, используя функцию iOResuit, проверять код завершения операции с файлом: чтобы программа могла контролировать результат выполнения операции с файлом, в ее текст надо поместить директиву 5. запись в файл выполняют инструкции write и writein, чтение — read и readin, причем в качестве первого параметра этих инструкций следует указывать файловую переменную; 6. по завершении работы с файлом его нужно обязательно закрыть инструкцией close; файл, созданный программой, в которой тип файловой переменной объявлен как text, можно просмотреть при помощи редактора текста. Пример 1. Написать программу, которая на сменном диске компьютера (А:) создает файл numbers.txt и записывает в него 5 введенных пользователем целых чисел. { Создает на диске А: файл и записывает в него5 целых чисел, введенных пользователем } var f: text; { текстовый файл } n: integer; { число } i: integer; { счетчик чисел } begin writeln('Создание файла'); writeln('Введите пять целых чисел.1); writeln('После ввода каждого числа нажимайте 57 Assign(f,'а:\numbers.txt'); Rewrite(f); { открыть в режиме перезаписи } for i:=l to 5 do begin write('->'); readln(n); writeln(f,n); end; close(f); { закрыть файл } writeln('Введенные числа записаны в файл ','а:\numbers.txt'); readln; end. Пример 2. Написать программу, которая выводит на экран содержимое файла a:\numbers.txt. { Выводит на экран содержимое файла а:\numbers.txt } var f: text; { текстовый файл } n: integer; { число } begin writeln('Содержимое файла a:\nunibers.txt1); writeln ('-----------------------------') ; Assign(f,'a:\numbers.txt'); Reset(f); { открыть файл для чтения } While not EOF(f) do { пока не достигнут конец файла } begin readln(f,n); { прочитать число из файла } writeln(n); { вывести прочитанное число на экран } end; Close(f); writeln ('-readln; закрыть файл end. Пример 3. Вычисляет среднее арифметическое чисел, находящихся в файле a:\numbers.txt var f: text; { текстовый файл } n: integer; { число, прочитанное из файла } kol: integer; { кол-во прочитанных чисел } sum: integer; { сумма прочитанных чисел ) sa: real; { среднее арифметическое } begin writeln('Вычисление среднего арифметического чисел, writeln('находящихся в файле a:\numbers.txt'); writeln('Чтение из файла. Подождите.'); sum:=0; kol:-0; Assign(f,'a:\numbers.txt'); Reset (f); { открыть файл для чтения } While not EOF(f) do { пока не достигнут конец begin readln(f,n); { прочитать число из файла } sum:=sum+n; kol:=kol+l; end; Close(f); { закрыть файл } sa:=sum/kol; writeln('Прочитано чисел: ',kol); writeln('Сумма чисел: ',sum) ; writeln('Среднее арифметическое: ',sa:9:2); readln; end. ЗАДАНИЕ 1. Создать файл, состоящий из вещественных чисел. Определить количество нулевых значений в этом файле 2. Дан текстовый файл, содержащий произвольный текст. Определить чего в нем больше: русских букв или цифр. 3. Дан файл, содержащий текст на русском языке. Определить, входит ли заданное слово в указанный текст. 58 КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Что такое файловая переменная? 2. Какова структура файла? 3. Как описывается файловая переменная в программе? 4. Что такое типизированный файл? 5. Что такое нетипизированный файл? 6. Что такое текстовый файл? 7. Как объявляется текстовый файл в программе? 8. Назовите алгоритм работы с текстовым файлом 59 ПРАКТИЧЕСКАЯ РАБОТА 13 ТЕМА: ОРГАНИЗАЦИЯ ПРОГРАММ С ИСПОЛЬЗОВАНИЕ ТИПИЗИРОВАННЫХ И НЕТИПИЗИРОВАННЫХ ФАЙЛОВ Цель работы: научиться описывать в программе типизированные файлы, обрабатывать типизированные и нетипизированные файлы. Оборудование: ПК, ИСР Pascal ABC ТЕОРЕТИЧЕСКИЕ ДАННЫЕ Типизированные файлы Длина любого компонента типизированного файла строго постоянна, что дает возможность организовать прямой доступ к каждому из них (т.е. доступ к компоненту по его порядковому номеру). Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные в списках ввода-вывода должны иметь тот же тип, что и компоненты файла. Если этих переменных в списке несколько, указатель будет смещаться после каждой операции обмена данными между переменными и дисковым файлом. Процедура READ Обеспечивает чтение очередных компонентов типизированного файла. Формат обращения: READ (<ф.п.>,<сп.ввода>) Здесь Файловая переменная <ф.п.> должна быть объявлена предложением FILE OF... и связана с именем файла процедурой ASSIGN. Файл необходимо открыть процедурой RESET. Если файл исчерпан, обращение к READ вызовет ошибку ввода-вывода. Процедура WRITE Используется для записи данных в типизированный файл. Формат обращения: WRITE (<ф.п.>,<сп.вывода>) Здесь <сп.вывода> - список вывода, содержащий одно или более выражений того же типа, что и компоненты файла. Процедура SEEK Смещает указатель файла к требуемому компоненту. Формат обращения: SEEK (<ф.п.>, Здесь Первый компонент файла имеет номер 0. Процедуру нельзя применять к текстовым файлам. Функция FILEPOS Возвращает значение типа LONGINT, содержащее порядковый номер компонента файла, который будет обрабатываться следующей операцией ввода-вывода. Формат обращения: FILEPOS (<ф.п.>) Функцию нельзя использовать для текстовых файлов. Первый компонент файла имеет порядковый номер 0. 60 2. Нетипизированные файлы Нетипизированные файлы объявляются как файловые переменные типа FILE и отличаются тем, что для них не указан тип компонентов. Отсутствие типа делает эти файлы, с одной стороны, совместимыми с любыми другими файлами, а с другой - позволяет организовать высокоскоростной обмен данными между диском и памятью. Чтение файла осуществляется с помощью стандартной процедуры RESET: RESET (<ф.п.>); Здесь <ф.п.> - файловая переменная, связанная ранее процедурой ASSIGN с уже существующим файлом При выполнении этой процедуры дисковый файл подготавливается к чтению информации. В результате специальная переменная-указатель, связанная с этим файлом, будет указывать на начало файла, т.е. на компонент с порядковым номером 0. Стандартная процедура REWRITE (<ф.п.>). инициирует запись информации в файл, связанный ранее с файловой переменной <ф.п.>. Процедурой REWRITE нельзя инициировать запись информации в ранее существовавший дисковый файл: при выполнении этой процедуры старый файл уничтожается и никаких сообщений об этом в программу не передается. Новый файл подготавливается к приему информации и его указатель принимает значение 0. При инициации нетипизированного файла процедурами RESET или REWRITE можно указать длину записи нетипизированного файла в байтах. Например, так: var f: file; begin assign(f, 'myfile.dat') reset(f,512); end. Длина записи нетипизированного файла указывается вторым параметром при обращении к процедурам RESET или REWRITE, в качестве которого может использоваться выражение типа WORD. Если длина записи не указана, она принимается равной 128 байтам. При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением READ и WRITE Работа с файлам записей Пример1. Сформировать файл Fm.dat, содержащий экзаменационную ведомость одной студенческой группы. Записи файла состоят из следующих полей: фамилия, имя, отчество, номер зачетной книжки, оценка. Program examen; Uses crt; Type stud=record fio:string[30]; Nz:string[6]; mark:integer end; Var Fstud:file of stud; S:stud; N,I:byte; Begin clrscr; 61 Assign(Fstud, 'Fm.dat'); Write('kolvo studentov'); Readln(n); For I:=1 To n do Begin Write('vvedite fio:'); readln(s.fio); Write('vvedite nomer zachetki:'); readln(s.Nz); Write('vvedite ocenka:'); readln(s.mark); Write(Fstud,s) end; Writeln('Formirovanie zaversheno'); Close(Fstud) End. Прямой доступ к записям файла В стандарте языка Паскаль допустим только последовательный доступ к элементам файла. Одной из дополнительных возможностей, реализованный в Паскале, является прямой доступ к записям файла Задав номер элемента файла, можно непосредственно установить указатель на него. После этого можно читать или перезаписывать данный элемент. Установка указателя на нужный элемент файла производится процедурой: Процедура SEEK Смещает указатель файла к требуемому компоненту. Формат обращения: SEEK (<ф.п.>, Здесь Первый компонент файла имеет номер 0. Процедуру нельзя применять к текстовым файлам. ЗАДАНИЕ 1. Записать в файл последовательного доступа N действительных чисел. Вычислить произведение компонентов файла. 2. В типизированном файле, компонентами которого являются целые числа, подсчитать количество отрицательных чисел. 3. В типизированном файле, компонентами которого являются вещественные числа, вычислить произведение положительных чисел. 62 ПРАКТИЧЕСКАЯ РАБОТА 14 ТЕМА: ПРОГРАММИРОВАНИЕ МОДУЛЯ Цель работы: научиться применять в программах стандартные библиотеки подпрограмм, создавать собственные библиотеки подпрограмм. Оборудование: ПК, ИСР Pascal ABC ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ Стандартный Паскаль не располагает средствами разработки и поддержки библиотек программиста, которые компилируются отдельно и в дальнейшем могут быть использованы не только самим разработчиком. Если программист имеет достаточно большие наработки и если те или иные подпрограммы могут быть использованы при написании новых приложений, приходится эти подпрограммы целиком включать в новый текст. В Паскале это ограничение преодолевается, во-первых, внедрением внешних подпрограмм, а, во- вторых, созданием и использованием модулей. Внедрение внешних подпрограмм В этом случае исходный текст каждой процедуры или функции хранится в отдельном файле и при необходимости с помощью специальной директивы компилятора включается в текст создаваемой программы. Пример1. Дано число n, требуется найти сумму первой и последней цифр этого числа. Создаем функцию: Function Digits(N: LongInt): Byte; Var Kol: Byte; Begin Kol:=0; While N<>0 Do Begin Kol:=Kol + 1; N:=N Div 10 End; Digits:=Kol End; Сохраним этот текст в файле с расширением .inc (расширение внешних подпрограмм), например digits.inc. Опишем также функцию возведения числа в степень a n : Function Power (A,N: LongInt): LongInt; {файл power.inc} Var I, St: LongInt; Begin St:=1; For I:=1 To N Do St:=St*A; 63 Power:=St End; Основная программа, решающая поставленную задачу с использованием описанных подпрограмм: Program Example1; Var N, S: Integer; {$I digits.inc} {Подключение внешней функции из файла digits.inc, вычисляющей количество цифр в записи числа} {$I power.inc} {Подключение внешней функции из файла power.inc, вычисляющей результат возведения числа а в степень n } Begin Write (‘Введите целое число: ’); Readln(n); {Для определения последней цифры числа N берется остаток от деления этого числа на 10, а для определения первой цифры число N делится на число 10, возведенное в степень, на единицу меньшую, чем количество цифр в записи числа N} S:= N Mod 10 + N Div Power(10, Digits(N)-1); Writeln(‘Искомая сумма=’, S) End. Директива компилятора {$I <имя файла>} позволяет в данное место текста программы вставить содержимое файла с указанным именем. Файлы с расширением .inc можно накапливать на жестком диске, формируя таким образом личную библиотеку подпрограмм. Создание и использование модулей Модуль – это набор ресурсов (функций, процедур, констант, переменных, типов и т.д.), разрабатываемых и хранимых независимо от использующих программ. В отличие от внешних подпрограмм, модуль может содержать достаточно большой набор процедур и функций, а также других ресурсов для разработки программ. Стандартные модули: System Crt Graph и др. Например, стандартный модуль CRT в паскале поддерживает 16 цветов, нумерация которых начинается с 0 (от 0 до 15 включительно). Также можно просто прописывать названия цветов не используя цифры. Для того чтобы использовать модуль CRT его нужно подключить с помощью следующей строчки: uses crt; Для того чтобы закрасить фон нужно использовать такую команду: textbackground (2); //Фон залит зелѐным цветом textbackground следует применять вместе с процедурой очистки экрана, которая описана ниже. Для очистки экрана (1) и установки позиции курсора (2) используются соответственно следующие команды: clrscr; {(1) – очистка курсора} gotoxy (9,6); {(2) –Курсор установлен в точку (9;6)} Цвет текста определяет процедура: textcolor (13); Для временной задуржки существует процедура delay delay (1500); Запускать программу в Pascal с использованием модуля CRT нужно при помощи клавиш Shift+F9. 64 Пример 2. Программа на Паскаль с использованием модуля CRT: uses {Подключение модуля} crt; begin textbackground (2); {Перекраска фона в зелѐный} clrscr; {Очистка экрана и применение цвета фона} textcolor (13); {Текст будет розовым цветом} gotoxy (9,6); {Курсор будет перемещѐн в точку (9;6)} write ('Программирование'); {Вывод текста} delay (1500); {Задержка} textbackground (3); {Фон будет салатного цвета} clrscr; {Очистка экрана } gotoxy (20,20); {Курсор перемещѐн в точку (20;20)} textcolor (red); {Цвет текста – красный} write ('Алгоритмизация'); {Вывод текста} readln; end. Структура модуля: Unit <имя модуля>; {Заголовок модуля} |