- •1.1. Основные этапы создания программы
- •1.2. Алгоритмы
- •2.1. Структура типов в Turbo Pascal
- •Стандартные скалярные типы. Типы целых чисел
- •2.3. Операции побитовой обработки
- •2.4. Представление вещественных чисел в эвм
- •2.5. Символьный тип
- •2.6. Булевский тип
- •2.7. Перечисленный тип
- •2.8. Интервальный тип (диапазон)
- •3.1. Структура программы на turbo pascal
- •3.2. Основные операторы языка
- •3.2.1. Простые операторы
- •3.2.2. Операторы ввода-вывода
- •3.2.3. Структурные операторы
- •3.2.4. Условные операторы
- •3.2.5. Операторы повтора (цикла)
- •4.1. Массивы
- •4.2. Строковый тип
- •4.3. Множества
- •5.1. Процедуры и функции
- •5.2. Процедуры и функции пользователя
- •5.3. Передача параметров по значению и по ссылке
- •5.4. Рекурсивные процедуры и функции
- •6.1. Структура модулей
- •6.2. Компиляция и использование модулей
- •7.1. Записи
- •7.2. Вложенные записи
- •7.3. Записи с вариантами (вариантные записи)
- •7.4. Файлы
- •7.5. Подпрограммы для работы с файлами
- •7.5.1. Процедуры
- •7.5.2. Функции
- •7.6. Примеры программ для обработки файлов
- •7.7. Текстовые файлы
- •8.1. Структура оперативной памяти для программ на Turbo Pascal
- •8.2. Динамические структуры данных
- •8.3. Основные процедуры и функции для работы с динамическими переменными
- •8.4. Динамика выделения памяти в куче
- •8.5. Линейные списки. Способы создания и обработки
- •8.6. Нелинейные списки. Способы создания и обработки
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
7.5.2. Функции
Eof(var f:file of тип): boolean – возвращает значение true, если текущий указатель стоит сразу за последним компонентом в файле, и false – в противном случае.
FilePos(var f:file of тип):longInt - возвращает номер позиции, на которой в данный момент находится текущий указатель.
FileSize(var f:file of тип):longInt – возвращает текущий размер файла, если файл пустой, то возвращает нулевое значение.
7.6. Примеры программ для обработки файлов
Применим полученные сведения для решения следующих задач:
- создать файл типа запись (структура записи: номер, фамилия, балл);
- вывести на экран содержимое созданного файла;
- добавить компоненту в конец файла;
- удалить компоненту с конца файла;
- удалить из файла компоненты с заданными характеристиками;
- отсортировать компоненты файла по значению заданного поля записи;
118
- переставить заданные элементы.
Рассмотрим алгоритм удаления заданного элемента из файла. Сначала в файле отыскивается элемент с заданными характеристиками. Допустим, что таким элементом является Эл. 2. Текущий указатель файла будет ссылаться на элемент Эл.3, поскольку после считывания Эл. 2 текущий указатель перемеcтится на следующую позицию.
Эл. 0 |
Эл. 1 |
Эл. 2 |
Эл. 3 |
Эл. 4 |
↑
Удаление заданного элемента сводится к перезаписи всех элементов файла, следующих за данным, на одну позицию влево.
Эл. 0 |
Эл. 1 |
Эл. 3 |
Эл. 3 |
Эл. 4 |
↑
Эл. 0 |
Эл. 1 |
Эл. 3 |
Эл. 4 |
Эл. 4 |
↑
После такой перезаписи остается удалить последний элемент.
Сортировать элементы файла будем методом отбора: выбираем элемент с максимальным значением поля и переставляем местами нулевой элемент и элемент с максимальным значением. Повторим эту процедуру для ряда,
начинающегося с первого элемента файла, затем для ряда, начинающегося со второго элемента ряда и так далее.
0 1 2 3 4
12 |
8 |
23 |
16 |
9 |
↑
119
23 |
8 |
12 |
16 |
9 |
↑
23 |
16 |
12 |
8 |
9 |
↑
23 |
16 |
12 |
8 |
9 |
↑
23 |
16 |
12 |
9 |
8 |
↑
program d1;
type
zap = record
nomer: integer;
fam: string;
ball: integer;
end;
var a, b, c: zap; {Определение переменных типа запись}
f: file of zap; {Определение файла типа запись}
i, j, z, q, max, flag, kol, d, n,k1,k2: unteger;
begin
assign(f, ‘a.dat’); {Установление связь между}
{логическим и физическим файлами}
(‘Режимы работы);
writeln('1 – создание файла');
writeln(‘2 – простотр содержимого файла');
writeln(‘3 – добавление элементов в конец файла');
writeln(‘4 – удаление элементов с конца файла');
writeln(‘5 – удаление произвольного элемента');
writeln(‘6 – сортировка');
writeln(‘7 – перестановка заданных элементов в файле');
writeln('Введите режим работы');
120
readln(q);
case(q) of ;
{Создание исходного файла}
1: begin
rewrite(f); {Открытие файла для записи}
while true do
begin
with a do
begin
writeln(‘Введите номер’);
readln(nomer);
if (nomer = 9999) then exit;
writeln(‘Введите фамилию’);
readln(fam);
writeln(‘Введите балл’);
readln(ball);
write(f, a); {Переменная} {типа запись записывается в файл целиком, а не} {по полям}
end; {with}
end; {while}
end;
{Просмотр содержимого файла}
2: begin
reset(f); {Устанавливаем текущий указатель}
{файла на нулевую позицию}
while not eof(f) do
begin
with a do
begin
read(f,a); {Считываем из}
{ файла всю запись}
{ целиком, а не полям}
121
writeln(nomer, ‘ ‘, fam, ‘ ‘, ball);
end; {with}
end; {while}
end;
{Добавление новых элементов в конец файла}
3: begin
reset(f); {Возвращаем текущий указатель}
{на начало файла}
seek(f,filesize(f)); {Устанавливаем указатель}
{на позицию за последним }
{элементом в файле}
{Вводим нужное количество дополнительных записей}
while true do
begin
with a do
begin
writeln(‘Введите номер’);
readln(nomer);
if (nomer = 9999) then exit;
writeln(‘Введите фамилию’);
readln(fam);
writeln(‘Введите балл’);
readln(ball);
write(f, a);
end; {with}
end; {while}
end;
{Удаление заданного кол-ва элементов с конца записи}
4: begin
reset(f);
writeln(‘Сколько записей надо удалить’);
readln(kol);
122
{Устанавливаем указатель на первую удаляемую запись}
seek(f, filesize(f)-kol);
{Удаляем все записи до конца файла , начиная с заданной}
truncate(f);
end;
{Удаление произвольного элемента из файла}
5: begin
reset(f);
writeln(‘Укажите позицию удаляемой записи’);
readln(d);
n: =1; reset(f);
while((d+n)<(filesize(f))) do
begin
{Устанавливаем указатель на позицию, следующую за данной}
seek(f, d+n);
{Считываем значение с этой позиции}
read(f,a);
{Возвращаем указатель на позицию удаляемого элемента}
seek(f, d+n-1)
write(f, a);
n:=n+1;
end;
truncate(f);
end;
{Сортировка файла по заданному полю}
6: begin
reset(f);
for i:=0 to filesize(f)-1 do
123
begin
{Выбор максимального элемента}
flag:=0;
seek(f, i);
read(f,a);
b: = a;
max: = a.ball;
for j: = i+1 to filesize(f)-1 do
begin
read(f,a);
if(a.ball > max) then begin
flag:=1;
c: = a;
max:=a.ball;
z: = filepos(f) -1;
end;
end;
{Перестановка максимального элемента и элемента, стоящего в {начале анализируемого ряда}
if flag = 1 then begin
seek(f,i);
write(f,c);
seek(f,z);
write(f,b);
end;
end;
end;
{Перестановка заданных элементов}
7: begin
reset(f);
writeln(‘Введите номера переставляемых элементов’);
readln(k1,k2);
124
{Устанавливаем указатель на позицию первого элемента}
seek(f,k1);
{Считываем значение первого элемента и запоминаем в}
{переменной a }
read(f,a);
{Повторяем все операции для второго переставляемого}
{элемента}
seek(f,k2);
read(f,b);
seek(f,k2);
{На место второго элемента записываем значение первого}
write(f,a);
seek(f,k1);
{На место первого элемента записываем значение второго}
write(f,b);
end;
end; {case}
close(f);
end.