- •Федеральное агенство по образованию российской федерации
- •1. Основные категории и понятия информатики
- •Предмет информатики как науки
- •1.2. Информация: структура, форма, измерение
- •2. Техническое и программное обеспечение пэвм
- •2.1. Структура аппаратных средств пэвм
- •2.2. Программное обеспечение пэвм
- •3. Основы алгоритмизации
- •Этапы разработки программ
- •3.2.Формы представления алгоритмов
- •Действие 1
- •Действие 2
- •Классификация и примеры алгоритмических структур
- •3.2.1. Алгоритм линейной структуры.
- •3.2.2. Алгоритм разветвляющейся структуры.
- •Да нет да да Рис 3.11
- •3.2.3. Алгоритмы циклической структуры.
- •4.2. Структура программы на языке Паскаль
- •4.3. Скалярные стандартные типы данных
- •4.4. Скалярные, пользовательские типы данных
- •5. Структурные типы данных
- •Массивы
- •5.3. Записи
- •5.4. Записи с вариантами
- •Множества
- •5.6.Файлы
- •6. Операции над данными скалярных типов. Выражения
- •7. Операторы языка Паскаль
- •7.1. Простые операторы
- •7.2. Структурные операторы
- •Оператор 2
- •8. Примеры программ на языке Паскаль
- •8.1. Пример 1. Арифметические выражения. Оператор присваивания
- •Пример 2. Условные операторы
- •Ввод чисел х, а
- •8.3. Пример 3. Программа обработки одномерного массива
- •8.4. Пример 4. Программа обработки двумерного массива
- •True False True False False
- •8.5. Пример 5. Программа обработки символьных строк
- •8.6. Пример 6. Программа обработки двумерного массива с вводом элементов матрицы из текстового файла
- •9.Разработка программ сложной структуры
- •9.1. Процедуры и функции
- •9.2. Область действия идентификаторов при использовании процедур и функций. Локальные и глобальные переменные
- •9.3. Передача данных в подпрограмму с помощью параметров. Формальные и фактические параметры
- •9.4. Использование процедур и функций
- •True False Рис. 9.4
- •9.5. Массивы – параметры процедур и функций
- •True False True False Рис. 9.7
- •True False True False True False Рис 9.9
- •9.6. Рекурсивные процедуры и функции
- •True False Рис. 9.10 True False
- •True False Рис. 9.12
- •9.7. Модули
- •10. Динамические структуры данных
- •Основные определения
- •10.2. Объявление и создание динамических структур данных. Указатели
- •Операции над указателями
- •Программа создания и обработки линейного списка
- •Приложение. Контрольные вопросы
- •Литература
Множества
Тип-множество, используемый в языке Паскаль, соответствует понятию множества в математике, и создается с помощью следующего конструктора типа:
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– переменная, в которую помещается фактическое число записанных компонент.