| ReInitStack(St,SizeOf(Real)); {изменяется тип данных }
| { Поместить в стек 100 вещественных значений: }
| for I := 1 to 100 do begin
| R := I; { перевод в тип Real }
| Push( St, R ); {и поместить его в стек }
| end; { for I }
| WriteLn( ' ':20, 'Первые 100 чисел' );
| WriteLn( ' ': 17, '(вещественные значения)' );
| WriteLn;
| while not Empty(St) do begin { Пока стек не пуст: }
| for B:=1 to 10 do begin { порциями по 10 элементов: }
| Pop( St,R ); { вытолкнуть следующее зна- }
| Write( R : 5 : 1 ) { чение и напечатать его }
| end; { for В }
| WriteLn { закрытие строки 10 чисел }
| end; { while }
| ReadLn { пауза до нажатия клавиши ввода }
| END.
Рис. 11.11
Обращаем внимание на рекурсивность в определении списка (вернее, его узла типа Node на рис. 11.10). В самом деле, тип ссылки на узел (NodePtr) определен, до того как задан сам тип узла Node.
- 219 -
Но в то же время поле Next узла имеет тот же тип NodePtr. Этот парадокс типов Паскаля разрешается самим компилятором. Можно определять ссылки на данные, содержащие элементы того же типа ссылки. Рекомендуется именно такой способ их задания, как в примере. Однако можно было бы перенести описание типа NodePtr за описание типа Node — ничего страшного не произошло бы.
- 220 -
Глава 12. Ввод-вывод данных и файловая система
Любой обмен данными подразумевает наличие источника информации, канала передачи и ее приемника. В случае обмена данными между программой и периферийными устройствами одним концом канала обмена данными всегда является оперативная память ПВЭМ. Другой конец этого канала в Турбо Паскале определен как файл.
Понятие файла достаточно широко. Это может быть обычный файл данных на диске или коммуникационный порт, устройство печати или что-либо другое. Файл может быть источником информации – тогда мы читаем из файла (ввод данных из файла) или приемником – в этом случае мы записываем в файл (вывод данных в файл).
Операция вывода данных означает пересылку данных из рабочей памяти (ОЗУ) в файл, а операция ввода – заполнение ячеек памяти данными, полученными из файла.
Файловая система, реализуемая в Турбо Паскале, состоит как бы из двух уровней: логических файлов и физических файлов.
12.1. Понятие логического файла
Логический файл описывается как переменная одного из файловых типов, определенных в Турбо Паскале. После того как в программе в разделе описания переменных объявлена файловая переменная, она может быть использована как средство общения с любым физическим файлом, независимо от природы последнего. Само имя физического файла может появиться в программе только один раз, когда специальной процедурой устанавливается, что объявленный логический файл будет служить средством доступа именно к этому физическому файлу (данным на диске, портам, печати и т.п.) Если, например, мы хотим работать с текстовым файлом 'A:\TEXT.DOC', то в программе должны быть такие строки:
- 221 -
VAR
f : Text; { объявляем файловую переменную f (вводим
логический файл типа текст) }
BEGIN
Assign( f, 'A:\TEXT.DOC' ); { связываем физический файл 'a:\text.doc'
на диске А: с логическим файлом f }
...
END.
После этого все обращения к файлу на диске будут производиться через файловую переменную f.
Введение логического файла позволяет программисту не задумываться о технических проблемах организации обмена данными, а заняться программированием самого потока данных. Различные физические файлы имеют различные механизмы ввода и вывода информации. Все особенности физических файлов «спрятаны» в механизме логических файлов, которые сами определяют, как наладить обмен данными со связанными физическими файлами. Иными словами, логические файлы унифицируют работу с файлами, позволяя работать не непосредственно с устройствами ПЭВМ, а с их логическими обозначениями.
12.2. Физические файлы в MS-DOS
Что такое физические файлы? Ответ на этот вопрос лучше искать не в руководствах по Турбо Паскалю, а в описаниях MS-DOS. Все, что является файлом в MS-DOS, является физическим файлом в Турбо Паскале. Банальный пример — файл с данными на диске (гибком, жестком, виртуальном — все равно). Определяется физический файл строкой с его названием (именем). В Турбо Паскале имена могут быть строковыми константами или храниться в строковых переменных. Имя файла на диске может иметь адресную часть, оформленную в соответствии с правилами MS-DOS:
'C:\PAS\TESTFILE.PAS' ,
'A:TEST.TXT'
'..\PRIMER.BAS'