Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_po_programmirovaniyu.doc
Скачиваний:
23
Добавлен:
09.12.2018
Размер:
2.5 Mб
Скачать

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.