Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции(ЯВУ)-Паскаль.doc
Скачиваний:
62
Добавлен:
31.03.2015
Размер:
1.08 Mб
Скачать
    1. Множества

Тип-множество, используемый в языке Паскаль, соответствует понятию множества в математике, и создается с помощью следующего конструктора типа:

Type T = set of T0;

где T0 – базовый тип или тип элементов множества.

Значением переменной XтипаTявляются множества элементов типаT0. Например, тип-множество целых чисел от 1 до 31 может быть описан следующим образом:

Type intset = set of 1..31;

Переменной Xтипаintsetможно присвоить значения с помощью оператора присваивания, например:

Var X: intset;

………………..

X:=[1,4,9,16,25];

Элементы множества записываются в квадратных скобках. Оператор

X;=[]; присваивает переменной Х значение пустого множества.

Операции над переменными типа-множества выполняются по правилам теории множеств.

Операция

Действие

Тип операндов

Тип результата

+

Объединение

множеств

Множество

Множество

-

Разность

множеств

Множество

Множество

*

Пересечение

множеств

Множество

Множество

=

Сравнение на

равенство

Множество

Булевский тип

<>

Сравнение на

неравенство

Множество

Булевский тип

A>=B

B – подмножество A

Множество

Булевский тип

in

Определение

принадлежности

множеству

Левый операнд – базовый

тип; правый – множество

элементов базового типа

Булевский тип

5.6.Файлы

Любая программа должна взаимодействовать с внешней средой, выдавая (сохраняя) результаты своей работы и, возможно, получая исходные данные для работы. Под внешней средой понимаются любые устройства, позволяющие осуществлять ввод, вывод и запоминание информации. Взаимодействие с внешней средой, или ввод-вывод данных, в программе выполняется посредством обработки специальных объектов данных – файлов, а точнее, переменных типа «файл».

Файлом называется конечное множество компонент одного и того же типа, расположенных во внешней памяти. Компоненты файла могут быть любого типа. Число компонент не объявляется заранее и может изменяться. Новая компонента добавляется только в конец файла. У понятия файл есть две стороны. С одной стороны , файл – это именованная область внешней памяти, содержащая некоторую информацию. Файл в таком понимании называется физическим файлом. Физический файл имеет имя файла во внешней памяти, которое регистрируется в некотором каталоге (папке) на диске средствами операционной системы.

С другой стороны, файл – это тип данных, определенный в программе как последовательность компонент заданного типа. Файл в таком понимании называется логическим файлом. Тип «файл» в Паскаль – программе можно объявить в разделе TYPEследующим образом:

TYPE<имя типа «файл»>=fileof<тип компонент файла>;

Например,

TYPE NumberFL = file of integer;

Объявив тип «файл», можно описывать файловые переменные заданного типа в разделе VAR:

VAR F1: NumberFL;

Тип «файл» можно определять непосредственно при описании файловой переменной, тогда ее объявление имеет следующий вид:

VAR F1: file of integer;

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

С файлами выполняются следующие операции:

  • связывание файловой переменной с конкретным физическим файлом на внешнем устройстве;

  • открытие файла для работы в заданном режиме: для чтения, для записи или для добавления;

  • чтение информации из файла;

  • запись информации в файл;

  • закрытие файла.

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

Способ объявления файловой переменной определяет вид файла, способ хранения информации в файле и стандартные процедуры и функции, используемые для обработки файла. Файловую переменную можно задать одним из трех способов:

VAR F1: file of <тип компонент>;

F2: text;

F3: file;

где F1 – типизированный файл; каждая его компонента имеет заданный тип;

F2 – текстовый файл; его компоненты – строки символов;

F3 – нетипизированный файл; тип его компонент не указан, что делает его совместимым с любыми файлами.

Доступ к компонентам файлов.

Любой программе на Паскале5доступны без каких-либо предварительных объявлений два файла со стандартными файловыми переменными:

Input– для чтения данных со стандартного устройства ввода (клавиатуры);

Output– для вывода на стандартное устройство вывода (видеомонитор).

Все другие файлы становятся доступными программе после объявления файловой переменной и ее связывания с физическим файлом.

Процесс обработки файла можно представить в виде блок-схемы, показанной на рис. 5.1.

Рис. 5.1

Связывание файловой переменной с физическим файлом выполняет процедура Assign, обращение к которой имеет вид:

Assign(<имя файловой переменной>,<имя файла на внешнем устройстве>);

где <имя файловой переменной> - это переменная типа «файл», объявленная в программе;

<имя файла на внешнем устройстве> - это строка символов, содержащая полное имя файла на диске и, возможно, путь к этому файлу.

Например,

Assign(F1,’c:\prog1.txt’);

Assign(F2,’a:\c1\data1.txt’);

Имя физического файла может вводиться пользователем с клавиатуры. Например,

VAR Name: string;

F2: file of integer;

………………………..

write(‘Введите имя файла: ’);

readln(Name);

assign (F2,Name);

…………………………

В этом фрагменте программы в качестве второго аргумента процедуры assignиспользуется переменнаяName, значение которой - строка, содержащая имя физического файла.

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

reset(<имя файловой переменной>).

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

Для открытия файла в режиме записи используется стандартная процедура rewrite, обращение к которой имеет вид:

rewrite(<имя файловой переменной>).

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

Процедура открытия существующего файла в режиме добавления appendприменима только к файлам типаtext. Обращение к процедуреappendимеет следующий вид:

append(<имя файловой переменной типаtext>). Если открываемый файл отсутствует, то при выполнении процедурыappendвозникает ошибка ввода-вывода. При открытии файла в режиме добавления новые данные записываются в конец файла.

Завершение действий с любым файлом выполняется процедурой close(<имя файловой переменной>). Работа с файлами осуществляется с использованием буферов в оперативной памяти. Одним из действий процедурыcloseявляется очистка буферов ввода-вывода. Без выполнения этой процедуры часть информации, предназначенная для записи в файл, может быть потеряна.

При работе с файлами автоматически проверяются ошибки ввода-вывода. Если проверка включена по умолчанию или с помощью директивы компилятора{$I+}, то при возникновении ошибки выполнение программы автоматически завершается. Если проверка выключена с помощью директивы{$I-}, то программа продолжает работу и проверить результат можно с помощью стандартной функцииIOResult. ФункцияIOResultвозвращает код завершения последней операции ввода-вывода. ЕслиIOResultравно нулю, то завершение операции – успешно. Например, в записанном ниже фрагменте программы проверяется корректность открытия существующего файла:

VAR

F1: text;

Fn: string;

……………..

begin

……………….

write(‘Введите имя файла: ’);

readln(Fn);

assign (F2,Fn);

{$I-}

reset(F1);

{$I+}

If IOResult<>0 then begin

Writeln(‘файл не найден!’);Halt;

end;

……………………………..

Процедура Haltпроизводит немедленное завершение выполнения программы.

Процедуры ввода-вывода для текстовых файлов.

Текстовый файл в программе объявляется через файловую переменную типа textи представляет собой последовательность символьных строк переменной длины, разделенных специальным символом«конец строки». В конце текстового файла размещается признак «конец файла».

Эти признаки проверяются соответствующими стандартными функциями, возвращающими логическое значение:

  • Eoln(<имя файловой переменной типаtext>) – возвращает значениеtrue, если достигнут конец строки;

  • Eof(<имя файловой переменной типаtext>) – возвращает значениеtrue, если достигнут конец файла.

Текстовый файл содержит символьную информацию, которая считывается из файла с помощью стандартных процедур:

  • Read(<имя файловой переменной >,< список ввода >) ;

  • Readln(<имя файловой переменной >,< список ввода >).

Процедура Readlnв отличие от процедурыReadпосле ввода всех переменных в списке игнорирует непрочитанные данные до конца текущей строки, и последующее чтение осуществляется с новой строки. ПроцедураReadln<имя файловой переменной > (без списка ввода) производит переход к следующей строке файла.

Запись данных в текстовый файл осуществляется с помощью стандартных процедур:

  • write(<имя файловой переменной >,< список вывода >) ;

  • writeln(<имя файловой переменной >,< список вывода >).

Процедура writelnв отличие от процедураwriteвыполняет запись символа «конец строки» и может вызывать без списка вывода:writeln<имя файловой переменной >. Пример программы ввода элементов матрицы из текстового файла приведен в разделе 8.6 данного учебного пособия.

Процедуры ввода-вывода для типизированных файлов

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

Read(<имя файловой переменной >,< список ввода >).

В списке ввода содержатся переменные того же типа, что и тип файла. При считывании в каждую переменную данных из файла указатель текущей позиции перемещается на следующую компоненту файла. Если указатель текущей позиции файла находится за последним компонентом файла, то достигнут конец файла, и стандартная функция Eof(<имя файловой переменной >) возвратит значениеTrue.

Запись данных в типизированный файл осуществляется с помощью стандартной процедуры:

write(<имя файловой переменной >,< список вывода >) ;

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

Для работы с файлом в режиме прямого доступа предназначены следующие стандартные процедуры и функции:

FilePos– функция, возвращающая номер текущей позиции указателя в файле;

FileSize– функция, возвращающая текущий размер файла;

Seek– процедура, перемещающая указатель файла на заданную позицию;

Truncate– процедура, которая усекает размер файла до текущей позиции.

Процедуры ввода-вывода для нетипизированных файлов.

При объявлении нетипизированного файловой переменной указывается только ключевое слово file. С помощью файловых переменных без типа можно обращаться к файлам любого типа и логической структуры. В нетипизированных файлах нет жестко установленной единицы чтения/записи, в отличие от типизированных файлов. При работе с файлами без типа для ввода-вывода используются стандартные процедурыBlockReadиBlockWrite, соответственно.

Чтение компонент из файла производится процедурой: BlockRead(F,Buf,N,Result),

где F– имя файловой переменной;

Buf– переменная любого типа, являющаяся буфером для размещения вводимой информации;

N– число компонент, которое нужно прочитать;

Result– переменная, в которую помещается фактическое число прочитанных компонент.

Запись компонент в файл производится процедурой: BlockWrite(F,Buf,N,Result),

где F– имя файловой переменной;

Buf– переменная любого типа, являющаяся буфером для размещения выводимой информации;

N– число компонент, которое нужно записать;

Result– переменная, в которую помещается фактическое число записанных компонент.