2. Разработать программу для обработки данных

advertisement
всякого предупреждающего сообщения), а затем будет создан новый
(пустой) файл с тем же именем. Поэтому при использовании данной
процедуры следует проявлять осторожность. Что касается устройства
с символическим именем, то это обязательно должно быть
устройство, способное служить приемником записываемых данных.
Собственно этому условию отвечают все устройства, за которыми в
MS DOS зарезервированы символические имена.
Файл, открытый с помощью процедуры Rewrite, изображен на
рис.5.
Рис.5. После применения процедуры Rewrite открывается пустой файл, в
котором указатель текущей позиции расположен, перед маркером конца файла
2.3.2. Ввод-вывод. Для осуществления ввода информации в файл
и вывода из файла в Turbo Pascal для текстовых и типизированных
файлов предназначены процедуры Read и Write, а для
нетипизированных – BlockRead и BlockWrite. Причем использование
процедур Read и Write имеет особенности, зависящие от вида файла
(текстовый это файл или типизированный). Поэтому сведения об
упомянутых процедурах вы найдете в разделах, посвященных
соответствующим видам файлов.
Помимо Read и Write, для текстовых файлов применимы
процедуры ReadLn и WriteLn.
Кроме подпрограмм, осуществляющих ввод-вывод, имеется
функция, которая осуществляет контроль за вводом-выводом. Речь
идет о функции IOResult.
2.3.2.1. Функция IOResult. Возвращает код ошибки, возникшей
при выполнении последней операции ввода-вывода. Заголовок:
Function IOResult : Integer;
Если ошибки не было, функция возвращает нуль.
Для того чтобы контролировать ошибки ввода-вывода с
15
помощью функции IOResult, должен быть выключен автоконтроль
(директива компилятора {$I-}).
2.3.3. Ориентирование в файле. К этой категории относятся
процедуры и функции, позволяющие определять или изменять
положение указателя текущей позиции в файле (или близкие к ним).
Здесь рассматриваются две процедуры (Seek и Truncate) и три
функции (FileSize, FilePos и EoF).
2.3.3.1. Процедура Seek. Эта процедура позиционирует указатель
на определенный элемент в файле. Файл, к которому применяется
процедура Seek, должен быть открыт. Вот как выглядит заголовок
этой процедуры:
Procedure Seek(Var f; n ; Longint);
где F – файловая переменная любого типа, за исключением Text;
N – номер элемента в файле, (выражение, имеющее тип Longint).
Например, для того чтобы переместить указатель текущей позиции к
третьему элементу файла, процедуру Seek следует применить так:
Seek(f,3);
Файл, к которому таким образом применена процедура Seek,
изображен на рис.6.
Рис.6. Процедура Seek позиционировала указатель к третьему элементу
файла
2.3.3.2. Процедура Truncate. Данная процедура, будучи
применена к открытому файлу, удаляет его содержимое от текущей
позиции и до конца. Заголовок процедуры:
Procedure Truncate(Var f);
16
где F – файловая переменная любого типа, за исключением Text.
Программа, в которой используется процедура Truncate, содержится
в примере 1.
Пример1
program Trunc;
var f : file of char;
i ; integer;
j:char;
procedure out;
begin Reset(f);
while not EoF(f) do
begin
Read(f;j);
Write(j)
end
end; {Out}
begin {Program}
Assign(f, 'FILE.TXT');
Rewrite(f);
{Ввод A,B,C,D,E,F}
for j:='A' to 'F' do Write(f, j);
WriteLn('Файл до усечения:');
Out; {Вывод содержимого файла}
Reset(f);
{Считывание 3-х записей}
for i:=1 to 3 do Read(f, j);
Truncate (f); {Усечение файла}
WriteLn;
WriteLn ('Файл после усечения:');
Out; {Вывод содержимого файла}
Close(f);
Erase(f)
end. {Program}
В этой программе объявлена типизированная файловая
переменная F, которая затем (с помощью процедуры Assign)
ассоциируется с файлом FILE.TXT. (Имя выбрано произвольно;
17
такого файла в данный момент еще нет.) После этого данный файл
открывается с помощью процедуры Rewrite. Из раздела "Открытие
файла" мы уже знаем, что если файла с таким именем в указанном
каталоге нет, при попытке открыть его с помощью процедуры Rewrite
будет создан новый пустой файл. О каком каталоге речь, если с
именем файла FILE.TXT никакой каталог указан не был? Если при
связывании файловой переменной с файлом каталог не указывается,
по умолчанию используется текущий каталог. А текущим при работе
с интегрированной средой разработки Turbo Pascal 7.0 всегда
является каталог BIN, если только вы не изменили текущий каталог с
помощью команды Change dir из меню File. Итак, файл FILE.TXT
окажется создан в каталоге, в котором содержатся файлы Turbo
Pascal. В принципе ничего страшного в этом нет, поскольку в конце
программы Trunc вызывается процедура Erase, которая его удаляет,
однако на всякий случай лучше указать иной каталог – например
С: \WINDOWS\TEMP.
Таким образом, файл создан, открыт и после этого в него
вводятся шесть элементов – символы А, В, С, D, Е, F, и содержимое
файла выводится на экран. Затем организуется считывание трех
элементов файла и проводится усечение файла с помощью процедуры
Truncate (эта единственная строка программы является целью всего
примера). Затем содержимое файла вновь выводится на экран, чтобы
продемонстрировать последствия использования процедуры Truncate.
Наконец, созданный вначале файл FILE.TXT закрывается
(процедура Close) и удаляется (процедура Erase). Вывод на экран
содержимого файла FILE.TXT реализован в виде процедуры Out,
которая в теле программы используется дважды (для вывода полного
и усеченного содержимого файла).
Вот как выглядит вывод на экран программы Trunc:
Файл до усечения:
ABCDEF
Файл после усечения:
АВС
Действие программы Trunc изображено на рис.7.
18
Рис.7. Программа Тrunc удалила вторую половину файла
2.3.3.3. Функция FileSize. Возвращает значение (имеющее тип
Longint), соответствующее текущей длине файла (т.е. числу
содержащихся в нем элементов). При этом файл должен быть открыт.
Если файл пустой (в нем нет ни одного элемента), функция вернет
значение, равное нулю. Вот как выглядит заголовок этой функции:
Function FileSize(Var f) : Longint;
где F – файловая переменная любого типа, за исключением Text.
2.3.3.4. Функция FilePos. Возвращает значение (имеющее тип
Longint), соответствующее положению указателя текущей позиции в
файле. При этом файл должен быть открыт. Заголовок этой функции
выглядит так:
Function FilePos(Var f) : Longint;
где F – файловая переменная любого типа, за исключением Text.
Если к файлу, изображенному на рис.8, применить функцию FilePos,
данная функция возвратит значение 3.
Рис.8. Функция FilePos возвратит значение, соответствующее положению
указателя текущей, позиции
Программу, в которой используются функции FilePos и FileSize,
a также процедура Seek, можно видеть в примере 2.
19
Пример 2
Program ProcFunc;
Var f : file of char;
Volume : LongInt;
Begin
Assign (f,’a.pas’);
Reset(f);
Volume:=FileSize(f);
WriteLn(‘Размер файла ‘,volume, ‘ байт’);
{устанавливаем указатель на середину файла}
Seek(f, volume div 2);
WriteLn(‘Позиция в середине: ‘, FilePos(f));
Close(f);
end.
В этой программе объявлена типизированная файловая
переменная F, которая затем (с помощью процедуры Assign)
ассоциируется с файлом А.РАS из каталога BIN. A.PAS – это файл с
текстом программы на Turbo Pascal, который имеется в составе
интегрированной среды программирования и содержится в указанном
каталоге. В принципе, для нашего примера подходит любой файл, а
A.PAS под рукой у всех, у кого на компьютере установлен Turbo
Pascal 7.0. Более того, каталог, в котором расположен данный файл,
является текущим, если только вы не изменили текущий каталог с
помощью команды Change dir из меню File. Иными словами, при
связывании файла с файловой переменной можно даже не указывать
путь.
После связывания файловой переменной с файлом данный файл
открывается процедурой Reset. Затем с помощью функции FileSize
определяется размер файла и с помощью процедуры Seek указатель
устанавливается в середину файла. Причем второй операнд
процедуры Seek, указывающий, куда следует позиционировать
указатель, имеет вид volume div 2, т.е. здесь берется целая часть от
деления числа элементов файла (Volume) на 2.
Естественно, по ходу выполнения программы на экран
выводятся необходимые сообщения и в заключение файл, связанный
с файловой переменной F, закрывается с помощью процедуры Close.
20
2.3.3.5. Функция EoF. Данная функция возвращает значение
TRUE, если указатель текущей позиции находится за последним
элементом файла, либо если файл пустой. В противном случае
функция возвращает значение FALSE. Вот как выглядит заголовок
этой функции.
Для типизированных или нетипизированных файлов:
Function Eof(Var f) : Boolean;
Для текстовых файлов:
Function Eof(Var f : Text) : Boolean;
где F – файловая переменная (текстовая, типизированная или
нетипизированная).
Присмотримся к трем изображениям на рис.9.
Рис.9. Указатель текущей позиции расположен в начале, в середине и в
конце файла
Для представленных здесь трех ситуаций функция EoF в первом
и во втором случае вернет значение FALSE, а в третьем – TRUE.
Программу, в которой используется функция EoF, можно видеть
в примере 3.
Пример 3
Program EndOfFile;
Var f : text;
Symb : char;
Begin
Assign(f, ‘c:\autoexec.bat’);
Reset(f);
Repeat
Read(f, symb);
Write(symb)
21
Until EoF(f)
End.
В этой программе объявляется файловая переменная F типа
Text, которая затем (с помощью процедуры Assign) ассоциируется с
файлом AUTOEXEC.BAT из корневого каталога диска С. (Здесь этот
файл выбран потому, что такой файл имеется на каждом компьютере
и именно в этом каталоге.)
После связывания файловой переменной с файлом данный файл
(процедурой Reset) открывается для чтения. Затем с помощью
оператора цикла REPEAT организуется циклическое считывание
содержащихся в нем символов. Составной оператор, служащий телом
цикла, включает оператор считывания очередного символа
(процедура Read) и оператор вывода этого символа на экран
(процедура Write). В результате все содержимое файла
AUTOEXEC.BAT оказывается выведено на экран.
Вместо AUTOEXEC.BAT можно задать в качестве параметра
процедуры Assign любой другой текстовый файл (т.е. файл,
содержимое которого представляют собой строки текста), например,
A.PAS из предыдущего примера. В результате содержимое этого
файла тоже окажется выведено на экран.
2.3.4. Специальные операции. К этой группе относятся
процедуры и функции, имеющие различное назначение, но в
основном связанные с организацией структуры диска.
Здесь мы рассмотрим пять процедур: Rename, ChDir, MkDir,
RmDir, GetDir. Первая применима к файлам любого вида. Остальные
четыре процедуры манипулируют не файлами, а каталогами, поэтому
вопроса об их применимости к тому или иному виду файлов не
возникает.
2.3.4.1. Процедура Rename. Данная процедура переименовывает
файл. Файл, к которому применяется процедура Rename, должен быть
закрыт. Вот как выглядит заголовок этой процедуры:
Procedure Rename(var f; NewName);
где F – файловая переменная любого типа;
NewName – параметр, имеющий тип STRING.
22
Файлу, ассоциированному с переменной F, присваивается новое
имя, которое указывается при вызове процедуры как параметр
NewName. С этого момента с файловой переменной F ассоциируется
файл с новым именем.
2.3.4.2. Процедура ChDir. Данная процедура изменяет текущий
каталог на каталог, который указывается в качестве параметра
процедуры. Заголовок этой процедуры выглядит так:
Procedure ChDir(s : String);
где S – выражение типа STRING, содержащее путь к новому
каталогу.
2.3.4.3. Процедура MkDir. Данная процедура создает новый
подкаталог. Заголовок:
Procedure MkDir(s : String);
где S – выражение типа STRING, содержащее путь и имя нового
каталога.
Для вновь создаваемого каталога не подходят имена,
совпадающие с именами уже существующих каталогов.
2.3.4.4. Процедура RmDir. Данная процедура удаляет пустой
каталог. Вот как выглядит заголовок этой процедуры:
Procedure RmDir(s : String);
где S – выражение типа STRING, содержащее путь и имя
удаляемого каталога.
Каталог, который указывается в качестве параметра процедуры
RmDir, должен существовать, быть пустым и не быть текущим
каталогом.
2.3.4.5. Процедура GetDir. Данная процедура позволяет
выяснить, какой каталог на указанном диске текущий. Заголовок этой
процедуры выглядит так:
Procedure GetDir(d : Byte; Var s : String);
где D – выражение типа Word, определяющее диск. Если D
23
равно нулю, подразумевается устройство по умолчанию; если D = 1 –
диск А; 2 – диск В; 3 – диск С и т. д.;
S – выражение типа STRING, возвращаемое процедурой и
определяющее путь и имя текущего каталога на заданном диске.
2.3.5. Завершающие операции. К этой категории относятся три
процедуры, которыми, как правило, завершается работа с файлами –
Close, Flush и Erase. Процедуры Close и Erase, поскольку они
применимы к файлам любого вида, рассматриваются здесь. Сведения
о процедуре Flush подходят только для текстовых файлов.
2.3.5.1. Процедура Close. Данная процедура закрывает файл,
открытый процедурой Reset, Rewrite или Append. Вот как выглядит
заголовок процедуры Close:
Procedure Close(Var f);
где F – файловая переменная любого типа.
В принципе, процедуру Close для закрытия файлов применять
не обязательно – все открытые файлы при нормальном завершении
программы закрываются автоматически, однако использование
процедуры Close все же считается признаком хорошего тона.
Пример использования процедуры Close имеется в программе
ProcFunc выше.
2.3.5.2. Процедура Erase. Данная процедура удаляет файл с
диска. Процедура Erase отнесена к завершающим, поскольку в конце
работы временно созданные файлы часто приходится удалять. Вызов
процедуры Erase выглядит так:
Erase(f);
где F – файловая переменная, принадлежащая любому типу.
2.4. Виды файлов
Turbo
Pascal
оперирует
с
файлами
трех
видов:
типизированными, текстовыми и нетипизированными. Примеры
объявлений файловых переменных для каждого из трех видов
представлены в табл.2.
Рассмотрим каждый из упомянутых видов файлов подробнее
24
Таблица 2
Объявления файловых переменных для различных видов файлов
Вид файла
Содержимое файла
Типизированный
Примеры
объявлений
переменных
f1:file of integer;
f2:file of real;
f3:file of boolean;
Совокупность элементов,
принадлежащих любому
типу, за исключением
файлового
Текстовый
Совокупность строк
f:text;
Нетипизированный Последовательность
f:file;
элементов произвольного
типа
2.4.1. Типизированные файлы. Итак, типизированный файл
содержит совокупность элементов, принадлежащих типу, который
определен в объявлении файловой переменной. Доступ к элементам
файла, как правило, организуется последовательно. Можно также
переместить указатель текущей позиции (с помощью процедуры
Seek) к любому элементу файла.
Для того чтобы файл открыть как типизированный, его
необходимо ассоциировать с файловой переменной, имеющий тип
FILE OF ... Вместо трех точек здесь может присутствовать любой из
простых или структурированных типов, как стандартных, так и
созданных пользователем, за исключением файлового типа, либо
структурированного элементами которого являются файлы, т.е.
существование "файла файлов" не допускается.
Для манипулирования типизированными файлами подходят все
процедуры, о которых шла речь выше (если только при описании той
или иной процедуры не было указано обратное). Здесь необходимо
заметить, что использование процедур Read и Write для
типизированных файлов имеет особенности.
2.4.1.1. Процедура Read. Использование процедуры Read для
типизированных файлов заключается в считывании одного или
нескольких компонентов файла и присвоении считанного значения
(значений) некоторой переменной (переменным).
Вот как выглядит заголовок процедуры Read для
25
типизированных файлов:
Procedure Read(f , V1 [, V2, ..., Vn]);
Здесь F – файловая переменная, имеющая тип FILE OF...;
V1–Vn – одна или несколько переменных, принадлежащих
любому типу, за исключением файлового.
Пример программы, в которой используется процедура Read
(для текстовых файлов), находится в разделе "Функция EoF".
2.4.1.2. Процедура Write. Запись в файл осуществляет процедура
Write. Использование данной процедуры для типизированных файлов
заключается в присвоении значения некоторой переменной (или
переменных) компоненту (компонентам) файла.
Заголовок процедуры Write для типизированного файла
выглядит так:
Procedure Write(f, V1 [, V2, ..., Vn ] );
Здесь F – файловая переменная, имеющая тип FILE OF...
V1–Vn – одна или несколько переменных, принадлежащих
любому типу, за исключением файлового. Кроме того, эти
переменные должны быть того же типа, что и компоненты файла.
После записи каждой переменной (очередному элементу файла
при этом присваивается значение переменной, т.е. старое значение
элемента заменяется новым), указатель текущей позиции файла
перемещается к следующему элементу. Если указатель находится в
конце файла, то при записи очередного элемента этот элемент
дополняет файл.
2.4.2. Текстовые файлы. Текстовый файл представляет собой
последовательность строк разной длины, состоящих из символов.
Каждая строка текстового файла оканчивается маркером конца
строки (End of Line – EoLn), а завершает текстовый файл, как и любой
другой, маркер конца файла (End of File – EoF). К элементам
текстового файла возможен только последовательный доступ,
начиная с первого.
Для того чтобы файл открыть как текстовый, его необходимо
ассоциировать с файловой переменной, имеющий тип Техt.
26
Для манипулирования текстовыми файлами подходят только те
из рассматриваемых процедур, в описании которых это указывается
прямо. Необходимо заметить, что использование процедур Read и
Write с текстовыми файлами имеет особенности. Кроме того, к
текстовым файлам (и только к текстовым) применимы процедуры
ReadLn и WriteLn. Специально для использования с текстовыми
файлами предназначены процедура Append и функция EoLn. Однако
прежде поговорим о так называемых стандартных текстовых
файлах.
2.4.2.1. Стандартные текстовые файлы. Выше были использованы операторы ввода-вывода, которые выглядели так:
Read(а, b, с);
или
Write(х,у,'Вывод на экран')
Первый оператор позволяет ввести с клавиатуры значения,
которые будут присвоены переменным А, В и С. Второй оператор
выводит на экран значения переменных Х и Y, а также строку текста.
Возникает вопрос, не имеют ли эти операторы какого-либо
отношения к процедурам ввода-вывода, применимым к файлам?
Оказываются, имеют, и самое непосредственное. Дело в том, что в
Turbo Pascal существует два стандартных идентификатора, играющие
роль текстовых файловых переменных, ассоциируемых вместо
файлов с конкретными физическими устройствами компьютера. Речь
идет об идентификаторах INPUT и OUTPUT, которые ассоциируются
соответственно с клавиатурой и экраном компьютера. Указанные
файлы считаются постоянно открытыми (т.е. для них не нужно
использовать процедуры Rewrite и Reset), и эти идентификаторы
можно использовать в программах. Так, операторы ввода-вывода, о
которых шла речь выше, можно представить и иначе:
Read(Input,а,b,с);
Write(Output,x,у,'Вывод на экран')
Первый оператор считывает из файла INPUT значения (т.е.
позволяет ввести их с клавиатуры), которые будут присвоены
переменным А, В и С. Второй оператор записывает в файл OUTPUT
27
(т.е. выводит на экран) значения переменных Х и Y , а также строку
текста. Первая и вторая пары операторов эквивалентны.
Иными словами, в процедурах Read и Write, когда требуется
осуществить ввод с клавиатуры или вывод на экран, указывать файл
(INPUT или OUTPUT) необязательно. Если в процедуре Read или
Write файл не указан, по умолчанию подразумевается файл INPUT
или OUTPUT, в зависимости от того, ввод или вывод инициируется.
Упомянутые стандартные файлы можно "переассоциировать".
Для этого достаточно воспользоваться процедурой Assign, например:
Assign (Output,' text. txt')
Если после этого в данной программе вызвать процедуру Write
без указания файла, соответствующая информация окажется записана
в файл ТЕХT.ТХТ.
2.4.2.2. Процедура Read. Использование процедуры Read для
текстовых файлов заключается в считывании одного или нескольких
значений файла и присвоении считанного значения (значений)
переменной (переменным), указанной при вызове процедуры.
Значения, о которых идет речь, могут принадлежать типам Char,
STRING, а также любым целочисленным или вещественным типам.
Вот как выглядит заголовок процедуры Read для текстового
файла:
Procedure Read([Var f : Text; ] V1[, V2, ..., Vn]);
Здесь F – файловая переменная, имеющая тип Техt.
V1–Vn – одна или несколько переменных, принадлежащих типу
Char, STRING, а также любому целочисленному или вещественному
типу.
Для того чтобы лучше понять, как функционирует процедура
Read, будучи применена к текстовым файлам, целесообразно
воспользоваться файлом INPUT.
Вот как происходит считывание из текстового файла.
Считывание значений типа Char
Если это переменная (переменные) типа Char, из файла
считывается символ и присваивается переменной, затем считывается
28
следующий символ и присваивается следующей переменной – и так
до тех пор, пока всем переменным типа Char, указанным при вызове
процедуры Read, не будут присвоены считанные из файла значения.
(При вводе с клавиатуры между вводимыми значениями требуется
вводить некоторый разделитель – пробел, символ табуляции
(клавиша <Таb>) или конец строки (клавиша <Enter>).) Если
очередной считанный символ окажется маркером конца строки EoLn
(при вводе с клавиатуры для этого достаточно нажать клавишу
<Enter>), считывание будет продолжено из новой строки. Если
очередной считанный символ окажется маркером конца файла EoF
(при вводе с клавиатуры для этого достаточно воспользоваться
комбинацией клавиш <Ctrl+Z>), выполнение процедуры Read будет
прекращено и программа перейдет к следующему оператору.
Считывание значений типа STRING
Если это строковая переменная (переменные), из файла будут
считаны все символы до ближайшего маркера конца строки. Если
длина считанной строки превзойдет допустимую для значений типа
STRING величину (255 символов), все оставшиеся до конца строки
байты отбрасываются. Затем при каждом новом обращении к
процедуре Read будет считываться маркер конца строки, т.е. строка
нулевой длины. Иными словами, с помощью процедуры Read не
удастся считать несколько строк подряд. Для того чтобы считать
несколько строковых значений, следует несколько раз обратиться к
процедуре ReadLn.
Считывание числовых значений
Если это значение типа Integer или Real, процедура Read будет
пропускать любые пробелы, символы табуляции или маркеры конца
строки, предшествующие числовой строке. Когда будет обнаружена
первая значащая цифра, процедура Read начнет формировать
числовое значение, пока не встретится один из перечисленных
символов (пробел, символ табуляции или маркер конца строки).
Считанная таким образом последовательность цифр рассматривается
как символьное представление соответствующего числа и полученное
значение присваивается соответствующей переменной. Если
числовая строка не соответствует ожидаемому формату, имеет место
ошибка ввода-вывода. Следующая процедура Read начнет
29
считывание с пробела, символа табуляции или маркера конца строки,
которым была завершена предыдущая числовая строка.
2.4.2.3. Процедура ReadLn. От Read процедура ReadLn
отличается только тем, что после выполнения действий, присущих
процедуре Read, осуществляется переход к следующей строке файла.
2.4.2.4. Процедура Write. Использование процедуры Write для
текстовых файлов сводится к записи значения (значений) одной или
нескольких переменных, указанных при вызове процедуры, в файл.
Значения, о которых идет речь, могут принадлежать типам Char,
STRING, Boolean, а также любым целочисленным или вещественным
типам. Кроме того, это могут быть значения перечислимых типов,
созданных на основе Char или одного из целочисленных типов. При
этом файл непременно должен быть открыт для записи.
Если указатель текущей позиции расположен в начале файла,
новая информация записывается поверх старой. Если же указатель
находится в конце файла, то новая информация дополняет
содержимое файла.
Запишем заголовок процедуры Write для текстового файла:
Procedure Write([Var f : Text;] V1 [,V2, ..., Vn]);
Здесь f – файловая переменная, имеющая тип Техt;
V1–Vn – одна или несколько переменных или выражений,
принадлежащих типу Char, STRING, Boolean а также любому
целочисленному или вещественному типу.
Каждая из переменных или выражений V1–Vn имеет следующий
формат:
v[:a[:b]]
где V – переменная (или выражение), значение которой
записывается в файл.
А – спецификатор ширины поля (необязательный параметр).
Если записываемое значение не заполнит всю ширину поля, оно
будет слева дополнено пробелами. Если ширины поля для
записываемого значения не хватит, данный параметр игнорируется.
B – спецификатор количества знаков после десятичной точки.
Данный параметр присутствует только в паре с параметром А и
30
только в том случае, если значение V принадлежит одному из
вещественных типов.
Указанные спецификаторы при вызове процедуры предваряются
двоеточиями. Как это выглядит, позволяет судить пример 4. Для
наглядности запись происходит в файл OUTPUT (т.е. имеет место
вывод на экран). Кроме того, вместо Write здесь использована
процедура WriteLn, которая отличается только тем, что после
выполнения действий, присущих Write, осуществляет запись маркера
конца строки (при выводе на экран – переход к следующей строке).
Представлена программа ParamWrite. В этой программе
переменным I и К, принадлежащим соответственно типам Integer и
Real, присваиваются некоторые произвольные значения, которые
затем выводятся на экран при различных значениях спецификаторов
ширины поля и количества знаков после десятичной точки.
Пример 4
Program Paramwrite;
Var I:integer;
K:real;
Begin
I:=55;
Writeln(i);
Writeln(I:5);
Wrileln(I:15);
K:=4.7; writeln;
Writeln(k);
Writeln(k:2:2);
Writeln(k:4:4)
End.
2.4.2.5. Процедура WriteLn. Как указывалось выше, от Write
процедура WriteLn отличается тем, что после выполнения действий,
присущих процедуре Write, осуществляется запись в файл маркера
конца строки. При этом файл, к которому применяется процедура
WriteLn, должен быть открыт для записи.
2.4.2.6. Процедура SetTextBuf. Создает буфер для операций
ввода-вывода с текстовым файлом. Заголовок:
31
Procedure SetTextBuf(Var f : Text; Var Buf [ ; Size : Word ] );
где F – файловая переменная типа Техt;
Buf – переменная любого типа;
Size – необязательная переменная типа Word, определяющая
объем буфера.
Процедуру SetTextBuf нельзя применять к открытому файлу,
хотя ее и можно вызывать сразу после обращения к процедуре Reset,
Rewrite или Append.
2.4.2.7. Процедура Append. Для открытия файлов, помимо Reset
и Rewrite, можно воспользоваться процедурой Append, однако с ее
помощью можно открыть только текстовый файл. Заголовок
процедуры Append выглядит следующим образом:
Procedure Append(Var f : Text);
где F – файловая переменная (типа Техt), с которой
ассоциирован файл, который требуется открыть как текстовый.
Данная процедура предназначена для добавления информации в
уже существующий файл – она открывает файл и позиционирует
указатель в его конец. Если файла с указанным именем не
существует, то имеет место ошибка ввода-вывода. Если процедуру
Append применить к открытому (с помощью процедуры Reset или
Rewrite) файлу, файл будет закрыт, а затем вновь открыт (только для
записи) с указателем, позиционированным в его конец. Файл, к
которому была применена процедура Append, изображен на рис.10.
Рис.10
Процедура Append открыла файл и позиционировала указатель в
его конец.
2.4.2.8. Процедура Flush. Данная процедура очищает буфер
текстового файла. Это делается для того, чтобы гарантировать
перенос последних символов из буфера в файл. Вот как выглядит
заголовок процедуры Flush:
32
Procedure Flush(Var f : Text);
где F – файловая переменная, принадлежащая типу Техt. Если
текстовый файл был открыт для записи (с использованием процедур
Rewrite или Append), то процедура Flush, в случае обращения к ней,
очистит буфер файла. В результате последние символы, отправленные для записи в файл (и, возможно, каким-то образом
"застрявшие" в буфере), будут принудительно записаны на диск. На
файлы, открытые для чтения, процедура Flush никакого действия не
оказывает.
В принципе, без процедуры Flush можно обойтись и используют
ее редко, поскольку процедура Close (см. выше) при закрытии файла
автоматически делает то же самое.
2.4.2.9. Функция EoLn. Данная функция возвращает значение
TRUE, если указатель текущей позиции файла находится на маркере
конца строки или на маркере конца файла. В противном случае
функция EoLn возвращает значение FALSE.
Заголовок функции EoLn:
Function Eoln [(Var f : Text)] : Boolean;
где F – файловая переменная, имеющая тип Техt. Если функция
EoLn вызвана без параметра, то подразумевается стандартный файл
INPUT.
2.4.2.10. Функция SeekEoln. Возвращает значение TRUE, если
указатель текущей позиции находится на маркере конца строки или
на маркере конца файла. В противном случае возвращается значение
FALSE.
Заголовок:
Function SeekEoln [ (Var f : Text) ] : Boolean;
где F – файловая переменная, имеющая тип Техt.
Функция SeekEoln, в отличие от функции EoLn, пропускает все
пробелы и знаки табуляции.
2.4.2.11. Функция SeekEof. Данная функция возвращает значение
TRUE, если указатель текущей позиции находится за последним
элементом файла, либо если файл пустой. В противном случае
функция возвращает значение FALSE. Вот как выглядит заголовок
33
этой функции:
Function SeekEof[(Var f : Text)] : Boolean;
где F – файловая переменная типа Техt;
Функция SeekEof отличается от функции EoF следующим:
• функция SeekEof применима только к текстовым файлам (EoF
подходит для любых файлов);
• функция SeekEof, в отличие от функции EoF, пропускает все
пробелы и знаки табуляции.
2.4.3. Нетипизированные файлы. Нетипизированные файлы
отличаются тем, что для них при объявлении не определяется тип
компонентов. Это позволяет получать доступ к файлам с любой
структурой. При открытии файла (процедурами Reset или Rewrite)
необходимо только указать размер элементов (записей), которыми
будет проводиться обмен с файлом. При этом файл трактуется как
последовательность этих записей (т.е. элементов произвольного
типа).
Вот как может выглядеть обращение к процедурам Reset и
Rewrite для открытия нетипизированного файла:
Reset(f,512)
Rewrite(f,256)
Здесь F – файловая переменная, имеющая тип FILE (что
соответствует нетипизированным файлам). А в качестве второго
параметра процедур Reset и Rewrite указаны размеры записей (в
байтах), которыми будет производиться считывание из файла или
запись в файл данных. Поскольку это значение представляет собой
выражение типа Word, его максимальная величина равна 65 535 байт
(предельное значение для этого целочисленного типа). Если второй
параметр процедур Reset и Rewrite не задан, по умолчанию длина
записи считается равной 128 байт.
При определении длины записи следует принять во внимание,
что длина файла может оказаться не кратна этой величине. В этом
случае последняя запись окажется неполной и несколько последних
байтов файла могут быть не считаны. Чтобы этого не случилось,
34
можно установить длину записи равной единице.
Для манипулирования нетипизированными файлами подходят
те же процедуры, что и для типизированных, за исключением Read и
Write. Для обмена данными с нетипизированными файлами
применяются специальные процедуры: BlockRead и BlockWrite.
Познакомимся с ними подробнее.
2.4.3.1. Процедура BlockRead. Данная процедура считывает из
файла указанное количество записей. При этом количество
считываемых байтов равно числу считываемых записей,
умноженному на размер записи, определенный при открытии файла
процедурой Reset или Rewrite (если размер записи определен не был,
по умолчанию он принимается равным 128 байтам). В случае, если
это значение окажется больше 64К (или 65 535 байт – предел для
значений типа Word), будет зафиксирована ошибка. Иными словами,
если при открытии файла длина записи была определена максимальной (65 535 байт), то считывание возможно только по одной
записи.
Файл, из которого происходит считывание, предварительно
должен быть открыт. Вот как выглядит заголовок процедуры
BlockRead:
Procedure BlockRead (Var f : File; Var Buf; Count : Word
[; Var Result : Word]);
Здесь F – нетипизированная файловая переменная (имеющая
тип FILE), ассоциированная с файлом, из которого требуется
осуществить считывание;
Buf – переменная, ранее объявленная в программе и
используемая в качестве рабочего буфера. Размер этого буфера,
который предназначен для обменов, не должен быть меньше длины
записи, определенной при открытии файла процедурой Reset или
Rewrite. Имя этой переменной в качестве параметра указывается при
вызове процедуры BlockRead.
Count – выражение или значение (имеющее тип Word),
соответствующее количеству записей, которые следует считать из
файла;
Result – значение (имеющее тип Word), возвращаемое
процедурой и соответствующее количеству считанных записей.
35
(Необязательный параметр.)
Количество считанных записей (параметр Result) может быть
меньше или равно значению параметра Count. Если при вызове
процедуры параметр Result не определен, то в случае, если
количество считанных записей окажется не равно значению
параметра Count, будет зафиксирована ошибка ввода-вывода. По
завершении действия процедуры BlockRead указатель текущей
позиции файла оказывается перемещен на количество записей,
соответствующее значению параметра Result.
Пример программы, в которой используется процедура
BlockRead, приводится далее.
2.4.3.2. Процедура BlockWrite. Данная процедура добавляет в
файл одну или несколько записей. При этом, как и для процедуры
BlockRead, количество записываемых байтов равно числу
добавляемых записей, умноженному на размер записи, определенный
при открытии файла процедурой Reset или Rewrite. В случае, если это
значение окажется больше 64 Кбайт (или 65 535 байт), будет
зафиксирована ошибка. Иными словами, если при открытии файла
длина записи была определена максимальной (65 535 байт), то добавлять можно только по одной записи.
Файл, в который проводится запись, предварительно должен
быть открыт. Вот как выглядит заголовок процедуры BlockWrite:
Procedure BlockWrite (Var f : File; Var Buf; Count : Word
[; Var Result : Word]);
Здесь F – нетипизированная файловая переменная (имеющая
тип FILE), ассоциированная с файлом, в который требуется
осуществить запись;
Buf – переменная, ранее объявленная в программе и
используемая в качестве рабочего буфера. Размер этого буфера,
который предназначен для обменов, не должен быть меньше длины
записи, определенной при открытии файла процедурой Reset или
Rewrite. Имя этой переменной в качестве параметра указывается при
вызове процедуры BlockWrite.
Count – выражение или значение (имеющее тип Word),
соответствующее количеству записей, которые следует добавить в
файл;
36
Result – значение (имеющее тип Word), возвращаемое
процедурой и соответствующее количеству добавленных записей.
(Необязательный параметр.)
Количество добавленных записей (параметр Result) может быть
меньше или равно значению параметра Count. Если при вызове
процедуры параметр Result не определен, то в случае, если
количество добавленных записей окажется не равно значению
параметра Count, будет зафиксирована ошибка ввода-вывода.
Программа, в которой используется процедура BlockWrite (а
также BlockRead), содержится в примере 5.
Пример 5
Program CopyFile;
Var F, F1 : File;
BytesR, BytesWr : Word;
I, j, buf : integer;
B: char;
Begin
Assign(F, ‘a.pas’);
Reset(F, 1);
Assign(F1, ‘a2.pas’);
Rewrite(F1, 1);
J:=1;
For I:=1 to FileSize(F) do
Begin
BlockRead(F, Buf, 1, j);
BlockWrite(F1, Buf, 1, j);
Write(chr(buf))
End;
Close(f);
Close(F1);
End.
В этой программе создается новый файл A1.PAS, в который
копируется (побайтно) содержимое файла A.PAS (с файлом A.PAS мы
уже имели дело). Считывание очередного байта из A.PAS и
копирование его в A1.PAS осуществляется с помощью процедур
BlockRead и BlockWrite. Это считывание-запись организовано
37
циклически с помощью оператора цикла с параметром
FOR..TO..DO. В составной оператор, являющийся телом цикла,
помимо процедур BlockRead и BlockWrite, добавлен также оператор
Write(chr(buf)), который выводит на экран каждый копируемый байт
(для контроля за происходящим). Это позволяет видеть нам в окне
Output содержимое скопированного файла (пример 5).
Для того чтобы убедиться, что копирование выполнено
должным образом, по завершении работы программы можно открыть
каталог BIN и проверить, появился ли там файл A1.PAS (обратив при
этом особое внимание на время и дату его создания). Можно также
открыть этот файл и сравнить его содержимое с тем, что отображает
окно Output.
3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
Для выполнения работы необходимо:
1. Повторить правила техники безопасности при работе с
вычислительной техникой.
2. Изучить раздел "Файлы" лекционного курса, а также
теоретическую часть настоящих методических указаний.
3. Получить у преподавателя вариант задания
(варианты
заданий приведены в разделе 6 настоящих методических указаний).
4. Написать программу на Турбо Паскале (при необходимости
используя предварительно разработанный алгоритм).
5. Ввести программу в компьютер, отладить и результаты
выполнения показать преподавателю.
6. В соответствии с требованиями, приведенными в разделе 4,
оформить отчет по лабораторной работе.
7. Защитить лабораторную работу, продемонстрировав преподавателю:
отчет по лабораторной работе;
умение решать аналогичные задачи;
теоретические знания.
При подготовке к защите для самопроверки рекомендуется
ответить на контрольные вопросы, приведенные в разделе 5.
38
4. ТРЕБОВАНИЯ К ОТЧЕТУ
Отчет по выполненной лабораторной работе должен содержать:
титульный лист;
условие задания;
текст программы на языке Турбо Паскаль.
5. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Что такое файл?
2. Какие существуют файловые типы?
3. Какие существуют файловые переменные?
4. Какие существуют операции над файлами?
5. Какими процедурами осуществляется доступ к файлам?
6. Как осуществляется ввод-вывод информации в файл и из
файла?
7. Какими процедурами осуществляется ориентирование в
файле?
8. Какие существуют специальные операции для работы с
файлами?
9. Какие существуют виды файлов?
10. Каковы особенности типизированных файлов и процедуры
для работы с ними?
11. Каковы особенности текстовых файлов и процедуры для
работы с ними?
12. Каковы особенности нетипизированных файлов и процедуры
для работы с ними?
6. ВАРИАНТЫ ЗАДАНИЙ
Вариант 1
1. Дана непустая последовательность слов, содержащая от 1 до
8 букв; между соседними словами – запятая, за последним словом –
точка. Напечатать все слова, отличные от последнего слова.
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
39
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
Структура файла:
Легковые автомобили
Марка
Цвет
Стоимость Изготовитель Максимальная
скорость
Поисковые признаки: автомобиль зарубежного производства;
автомобиль красного цвета.
3. Имеется нетипизированный файл длиной 50 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора FOR..TO..DO. Длина блоков 2 байта. В цикле
выводить содержимое каждого скопированного блока.
Вариант 2
1. Дана непустая последовательность слов, содержащих от 1 до
8 букв; между соседними словами – запятая, за последним словом –
точка. Напечатать все слова наименьшей длины.
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
40
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
Структура файла:
Абонентская плата за телефон
Ф.И.О.
Телефон Год
Количество Плата за
абонента
установки
абонентов телефон
Поисковые признаки: абоненты, имеющие задолженность; год
установки до 1980 года.
3. Имеется нетипизированный файл длиной 50 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора FOR..TO..DO. Длина блоков 5 байтов. В цикле
выводить содержимое каждого скопированного блока.
Вариант 3
1. Напечатать таблицу значений функций sin x и tg x на отрезке
[0,3] с шагом 0.1. Значения x печатать с одной цифрой в дробной
части, значения синуса – с пятью, а значения тангенса – в
экспоненциальной форме.
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
Структура файла:
41
Сотрудники
Ф.И.О.
Табельный Дата
Оклад
Стаж
номер
рождения тыс.руб.
работы
Поисковые признаки: сотрудники моложе 30 лет; оклад более
3000 рублей.
3. Имеется нетипизированный файл длиной 50 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора FOR..DOWNTO..DO. Длина блоков 2 байта. В
цикле выводить содержимое каждого скопированного блока.
Вариант 4
1. Напечатать первые 10 строк «треугольника Паскаля» в
следующем виде:
1
11
121
1331
14641
…
1 9 … 126 126 … 9 1
В этом «треугольнике» крайние числа равны 1, а каждое
внутреннее – сумме двух чисел над ним.
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
42
Структура файла:
Музеи
Наименование Назначение Адрес
Время
Стоимость
работы
билета
Поисковые признаки: художественные музеи; стоимость билета
менее 50 рублей.
3. Имеется нетипизированный файл длиной 50 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора FOR..DOWNTO..DO. Длина блоков 5 байтов. В
цикле выводить содержимое каждого скопированного блока.
Вариант 5
1. Напечатать первые 10 строк «треугольника Паскаля» в
следующем виде:
1
11
121
1331
14641
…
19
…
91
В этом «треугольнике» крайние числа равны 1, а каждое
внутреннее – сумме двух чисел над ним.
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
43
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
Структура файла:
Расписание
Номер
Наименование Тип
Стоимость Протяженность
рейса
рейса
самолета билета
линии
Поисковые признаки: рейс сообщением с городом Москва;
стоимость билета менее 1500 рублей.
3. Имеется нетипизированный файл длиной 50 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора REPEAT. Длина блоков 2 байта. В цикле
выводить содержимое каждого скопированного блока.
Вариант 6
1.
Напечатать
картинку,
изображающую
умножение
«столбиком» двух заданных натуральных чисел. Возможный пример:
39624
×
8503
118872
+ 198120
316992
336922872
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
44
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
Структура файла:
Экскурсии
Наименование Страна Стоимость Продолжительность Транспорт
Поисковые признаки: продолжительность 7 дней; поездка
автобусом.
3. Имеется нетипизированный файл длиной 50 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора REPEAT. Длина блоков 5 байтов. В цикле
выводить содержимое каждого скопированного блока.
Вариант 7
1. Имеется внешний текстовый файл BOOK. Написать
программу, которая, игнорируя исходное деление этого файла на
строки, переформатирует его так, чтобы каждая строка оканчивалась
точкой либо содержала ровно 60 литер, если среди них нет точки.
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
Структура файла:
Кинофильмы
Наименование Стоимость Время
Адрес
Количество
кинотеатра
билета
сеансов
мест
Поисковые признаки: сеансы после 19 часов; стоимость билета
45
менее 200 рублей.
3. Имеется нетипизированный файл длиной 50 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора WHILE. Длина блоков 2 байта. В цикле
выводить содержимое каждого скопированного блока.
Вариант 8
1. Имеется текстовый файл T. Напечатать первую из самых
коротких его строк.
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
Структура файла:
Книга почтой
Наименование Ф.И.О.
Номер по Издательство Стоимость
книги
автора
каталогу
книги
Поисковые признаки: книги издательства «Наука»; книги автора
Иванова В.Б.
3. Имеется нетипизированный файл длиной 50 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора WHILE. Длина блоков 5 байтов. В цикле
выводить содержимое каждого скопированного блока.
Вариант 9
1. Пусть текстовый файл t разбит на непустые строки. Написать
46
программу, использующую функцию count(t) для подсчета числа
строк, которые начинаются и оканчиваются одной и той же литерой.
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
Структура файла:
Города
Наименование Количество Площадь, Год
Количество
жителей
Кв. км
основания школ
Поисковые признаки: город с количеством жителей не менее 1
млн.; год основания до 1900 года.
3. Имеется нетипизированный файл длиной 50 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора FOR..TO..DO. Длина блоков 10 байтов. В цикле
выводить содержимое каждого скопированного блока.
Вариант 10
1. Пусть текстовый файл t разбит на непустые строки. Написать
программу, использующую функцию count(t) для подсчета числа
строк, которые оканчиваются буквой z..
2.
Разработать
программу
для
обработки
данных
типизированного файла. Обработка данных должна включать
процедуры без параметров:
для вывода шапки таблицы;
для вывода данных одной записи;
47
для создания файла;
для дополнения файла новыми записями;
для записи данных в файл;
для чтения данных файла;
для модификации ряда записей файла;
для поиска записей файла с выводом найденных записей или
сообщения о неуспешном поиске по поисковому признаку;
удаления записей из типизированного файла следующим
образом: поиск удаляемой записи; сдвиг (в случае успешного поиска)
всех записей, расположенных после удаляемой записи, к началу
файла; после удаления производится усечение файла.
Структура файла:
Телевизоры на складе магазина
Наименование Фирма
Стоимость Размер
Количество
изготовитель
экрана
на складе
Поисковые признаки: телевизоры фирмы SONY; телевизоры с
размером экрана 25 дюймов.
3. Имеется нетипизированный файл длиной 100 байт. Вывести
его содержимое на экран. Скопировать его содержимое в другой файл
с помощью оператора FOR..TO..DO. Длина блоков 20 байтов. В цикле
выводить содержимое каждого скопированного блока.
СПИСОК ЛИТЕРАТУРЫ
1. Меженный О.А. Turbo Pascal: учитесь программировать. – М.:
Издательский дом «Вильямс». 2001.– 448 с.
2. Милов А.В. Основы программирования в задачах и примерах.–
Харьков: Фолио. 2002.– 397 с.
3. Климова Л.М. Pascal 7.0 практическое программирование.
Решение типовых задач.– М.: Кудиц-Образ, 2000.– 425 с.
48
Download