Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Раздел 3_2.pdf
Скачиваний:
23
Добавлен:
11.02.2016
Размер:
1.22 Mб
Скачать

что 100 больше чем mmax и поэтому будет вызвана скрытая процедура error}

end.

Результат работы программы, (для удобства чтения, ввод пользователя показан жирным шрифтом):

Введите количество элементов в массивах I= 4<Enter>

AA[ 1] = 5<Enter> AA[ 2] = 8<Enter> AA[ 3] = 3<Enter> AA[ 4] = 10<Enter> BB[ 1] = 4<Enter> BB[ 2] = 14<Enter> BB[ 3] = 254<Enter> BB[ 4] = 7<Enter>

Сумма 4 элементов массива AA равна 26 Макс. колич. элементов массива AA Mmax= 10 Ошибка в процедуре Sum

N=100 ошибка: N>Mmax

В данной программе использован модуль myunit.tpu, который в интерфейсном разделе содержит две процедуры доступные пользователю: Vvod и Sum. Процедура Vvod позволяет вводить данные в массивы aa и bb. Тип этих массивов - mas1 и их максимальный размер - Mmax также определены в интерфейсном разделе этого модуля и, значит, доступны пользователю.

Если из использующей модуль программы попытаться обратиться к скрытой процедуре Error или к скрытой переменной Proc, то при компиляции программы компилятор выдаст сообщение об ошибке, так как они не доступны пользователю.

Стандартные модули

Турбо-Паскаль имеет шесть стандартных (являющихся частью системы про-

граммирования) модулей: system, dos, crt, printer, overlay, graph.

Программные ресурсы, сосредоточенные в стандартных модулях, образуют мощные пакеты системных средств, которые обеспечивают высокую эффективность и широкий спектр применений языка.

Для того, чтобы воспользоваться ресурсами стандартного модуля, необходимо указать его имя в разделе uses. Исключение сделано для модуля system, имя которого указывать не надо, так как содержащиеся в нем ресурсы подключаются автоматически к любой программе. В этот модуль входят все процедуры и функции стандартного Паскаля, а также много дополнительных подпрограмм общего характера.

Работа с файлами

Любая программа взаимодействует со своим окружением с помощью операторов Read и Write, будь это внешнее устройство (например, клавиатура или дисплей), набор данных на дискете или жестком диске. Другими словами, с помощью операторов Read и Write можно управлять потоками данных, указывая, откуда следует считывать данные и куда их необходимо записать. Для реализации этих целей используется такая структура данных как файл (file).

Файл объединяет данные, количество которых при описании файла жестко не фиксируется. Поэтому файл может оставаться открытым (доступным для записи-

66

чтения).

Для упорядочения данных в файле имеется указатель записи, который показывает, какая запись обрабатывается (должна обрабатываться) в данный момент. При каждом обращении к файлу (для чтения или записи) указатель автоматически перемещается - обычно от начала файла к его концу (при работе с дисплеем это соответствует просмотру сверху вниз).

Такой доступ к данным называется последовательным и позволяет просматривать и обрабатывать файлы не только от начала к концу, но и начиная с любой записи, либо в обратном порядке. В Паскале определены три типа файлов:

типизированные файлы, записи в которых имеют жесткую структуру (в данном пособии не рассматриваются);

нетипизированные файлы, при работе с которыми действует только одно ограничение - в них могут передаваться блоки данных длиной 128 байт каждый (в данном пособии не рассматриваются);

текстовые файлы, состоящие из символов и строковых структур, работа с которыми рассматривается далее.

Объявление файловой переменной производится в следующих форматах:

имя_файловой_переменной : file of тип_записи; имя_текстовой_файловой_переменной : text;

Общие правила работы с файлами.

Для всех типов файлов в Паскале существует набор общих правил, определяющих приемы работы с ними. Далее рассмотрены основные правила из этого набора.

Для Паскальпрограммы файл является некоторой переменной, аналогичной рассмотренным ранее, и, следовательно, ему может быть присвоено имя (например file_name) и он должен быть соответствующим образом описан в программе. Для операционной системы файл есть единица хранения данных на магнитных дисках (элемент файловой системы) и, в свою очередь, должен иметь имя, образуемое по правилам, принятым в этой системе (например, exampl.pas или rezalt.dat или tabl.lst и т.д.). Поэтому для организации взаимодействия программы и операционной системы при работе с файлом необходимо вначале установить связь между упомянутыми выше именами. Для этой цели в Паскале имеется стандартная процедура Assign вида

Assign(file_name, dos_name);

которая устанавливает соответствие между файловой переменной Паскаля file_name и системным файлом dos_name (имена файловой переменной и системного файла могут быть выбраны пользователем произвольно, либо сообразуясь с содержанием роботы). В результате все операции, выполняемые в программе над переменной file_name, будут выполняться над файлом dos_name;

Перед обработкой файла он должен быть открыт. Для этой цели используются три стандартные процедуры:

процедура reset(file_name); - открывает существующий файл для чтения (открывает существующий файл, т.е. устанавливает с ним связь и переводит указатель файла на первую запись);

процедура rewrite(file_name); - создает новый (пустой) файл, пригодный для записи информации, указатель файла устанавливается на начало файла. В случае если такой файл уже существует, он будет стерт и информация содержащаяся в нем будет уничтожена;

процедура append(file_name); - открывает существующий файл для дозаписи и устанавливает указатель файла на eof (в конец файла), после чего вводимые (допол-

67

няющие файл символы) будут записываться в конец файла; После позиционирования файла данные могут быть прочитаны из файла или за-

писаны в него с помощью стандартных процедур read и write: read(file_name, ...); {прочесть данные из файла file_name} write(file_name, ...); {записать данные в файл file_name}

Следует помнить, что процедуры ReadLn и WriteLn не могут применяться для любых типов файлов кроме текстового.

Установить, достигнут ли конец файла при чтении (прочтена ли последняя запись) можно с помощью стандартной процедуры eof, имеющей булев тип и формат вида eof(file_name);

После завершения записи данных в файл его следует закрыть, т.е. разместить в нем после последней записи метку "конец файла" имеющую вид EOF, прекратить с ним связь и в порядке, принятом в операционной системе, включить его в каталог дискеты или жесткого диска. Эти действия осуществляются с помощью стандартной процедуры close(file_name);

В результате работы с файлами могут возникать ошибки. Они могут быть вызваны различными причинами: неправильно задано имя файла или его путь, диск может быть защищен от записи или отсутствовать, недостаточно места на диске и др.

Для перехвата ошибок ввода-вывода служит функция IOResult, которая возвращает целое значение, представляющее собой состояние последней выполненной операции ввода-вывода.

Для работы с файлами и каталогами (создание, удаление, переименование) в Паскале предусмотрен набор функций, которые включены в модуль DOS и описаны в приложении.

Файловые переменные в параметрах процедур могут передаваться только по ссылке, т.е. должны быть объявлены в списках формальных и фактических параметров как переменные (в форме var file_name:file). Переменные типа файл не могут входить в состав выражений Паскаля, а также выступать в качестве операндов в операциях сравнения или стоять в левой части оператора присваивания.

Текстовые файлы

Текстовыми называются файлы, состоящие из строк символов ASCII. Строки символов в таких файлах отделяются друг от друга управляющими символами конец строки, генерируемыми при нажатии клавиши [Enter] и представляемыми внутри файла символами ASCII-кода carriage return (CR)/line feed (LF) #13#10. Сам файл за-

вершается как обычно управляющим символом "конец файла". Указанные управляющие символы используются прикладными программами, работающими с такими файлами.

Объявление текстового файла в программе осуществляется включением в раздел объявления переменных имени переменной типа text, например так:

var f: text;

где f есть выбранное (назначенное) пользователем "паскалевское" имя файла (file_name), а служебное слово text объявляет файл с именем f текстовым. Если текстовый файл объявлен указанным образом, то запись информации в файл и чтение ее из файла организуется так же, как ввод данных с клавиатуры и вывод их на экран при работе с простыми переменными.

Для этой цели используются те же процедуры – Read, ReadLn, Write и WriteLn, работа которых рассматривалась ранее при организации взаимодействия программ с клавиатурой и экраном. Для того, чтобы эти процедуры начали работать с файлом, достаточно определить (указать) в соответствующем списке ввода/вывода, что данный объект (имя) есть файл. Например: оператор write('Одесса'); выводит

68

слово Одесса на экран, а оператор write(file1, 'Одесса'); записывает слово "Одесса" в конец (после последней существующей записи) файла с именем file1, если этот имя объявлено как имя текстового файла (т.е. в форме var file1:text).

При работе с текстовыми файлами, используются рассмотренные стандартные процедуры Паскаля, выполняющие функции связывания, открытия, проверки состояния и закрытия файла.

В отличие от остальных, текстовые файлы допускают использование форматированного ввода-вывода в процедурах Read, ReadLn, Write и WriteLn.

Процедура readln(имя_файла, список_ввода); выполняет процедуру read из текущей строки файла, т.е. читает (передает в поля памяти, которые выделены объектам списка_ввода) содержащиеся в строке значения, а затем переводит указатель файла на следующую строку. Требования к формированию списка_ввода аналогичны, рассмотренным ранее, для операторов ввода Read и Readln;

Процедура writeln(имя_файла, список_вывода); выполняет процедуру write для переменных из списка_вывода (т.е. последовательно записывает их значения в файл), затем заносит маркер end-of-file (конец_файла) после последней компоненты этого файла. Требования к формированию списка_вывода аналогичны рассмотренным ранее для операторов ввода Write и Writeln;

Необходимо отметить, что в Паскале, как и в других языках, определены так называемые стандартные вводной и выводной текстовые файлы с именами input(ввод с клавиатуры) и output(вывод на дисплей) соответственно. Эти файлы не требуют описания в программах и не указываются в операторах типа read и write. Поэтому:

Read(input, v1,...,vn);

эквивалентно

Read(v1,...,vn);

Readln(input, v1,...,vn);

эквивалентно

Readln(v1,...,vn);

Write(output, e1,...,en);

эквивалентно

Write(e1,...,en);

Writeln(output, e1,...,en); эквивалентно Writeln(e1,...,en);

Далее, в качестве примера, приведены две программы, первая из которых создает текстовый файл, а вторая выводит информацию, записанную в этот файл, на экран: program fileex1;

var

Myfile: text; begin

assign(Myfile,'primer.txt');{назначает файлу Myfile имя в форме, принятой в MS-DOS (в данном случае это primer.txt)}

rewrite(Myfile);{создает новый пустой файл с именем Myfile и открывает его для записи}

writeln(Myfile, 'Очень удобно изучать'); writeln(Myfile, 'Tурбо-Паскаль в среде'); writeln(Myfile, 'Турбо-Паскаль 7.0....');

{Этот текст записывызывается на диск в файл с dos_именем primer.txt }

close(Myfile); {закрывает файл} end.

После выполнения этой программы в рабочей директории магнитного диска будет создан текстовый файл с именем primer.txt, в котором в трех первых строках

будет записан текст:

Очень удобно изучать Tурбо-Паскаль в среде Турбо-Паскаль 7.0....

program fileex2;

69