Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Реализация функции просмотра БД

Поиск

Постановка задачи

Просмотр на экране содержимого файла типа tfileinfstud. Имя физического файла для просмотра задает пользователь.

Метод решения

При выводе информации на экран будем использовать алгоритм вывода большого количества значений.

1) получить от пользователя имя физического файла, который будем просматривать readln(namebd);

2) если физический файл с таким именем отсутствует, то сообщить об этом пользователю и прекратить выполнение программы

3) связать логический и физический файлы assign(fbd,namebd);

4) открыть файл в режиме работы с существующим файлом (в данном методе будем только последовательно читать информацию из файла) reset(fbd);

5) очистить экран clrscr;

6) вывести шапку таблицы
writeln('ФАМИЛИЯ ':20,' ДАТА РОЖД.',' ГП ',' БАЛЛ');

7) в счетчик заполненных строк экрана занести 1 k:= 1;

8) пока не достигли признака конца в файле fbd повторять (not eof(fbd) )

a) чтение очередного компонента файла read(fbd,r);

b) вывод на экран компонентов записи r с информацией об учащемся;

c) увеличение счетчика выведенных строк на 1 k:=k+ 1;

d)

9) закрыть файл для работы close(fbd).

Предложенный метод решения позволяет выводить на экран содержимое любого файла типа tfileinfstud. Причем файл может быть прямого доступа, так и последовательным, потому что в методе решения не используются ни какие особенности файлов прямого доступа.

Информационная модель

Таблица 24.6. Информационная модель

Статус Назначение Имя Тип
Вход имя физического файла с компонентами типа tinfstud namebd string
Пром имя логического файла fbd tfileinfstud
Пром информация об очередном учащемся r tinfstud
Вход счетчик заполненных строк экрана k integer

Программная модель

{программа просмотра файлов с компонентами типа tinfstud (файл z2.pas)}

program z2;

uses CRT;

{$I FILE0.PAS}

var k:integer;

begin

writeln('Введите имя просматриваемого файла ');

readln(namebd);

if not fs(namebd) then

begin

writeln('ОШИБКА!!! Файл с именем ',namebd,' не существует');

halt

end;

assign(fbd,namebd);

reset(fbd);

clrscr;

writeln('ФАМИЛИЯ ':20,' ДАТА РОЖД.',' ГП ',' БАЛЛ');

k:=1;

while not eof(fbd) do

begin

read(fbd,r);

with r do

begin

fam:=copy(fam+' ',1,20);

writeln(fam:20, dr.d:3,'.',dr.m:2,'.', dr.g:4, gp:5, sb:5:2)

k:=k+1;

if k=23 then

begin

writeln('Для продолжения нажмите Enter');

readln;

clrscr;

writeln('ФАМИЛИЯ ':20,' ДАТА РОЖД.',

' ГП ',' БАЛЛ');

k:=1;

end

end

end;

close(fbd);

writeln('Информация исчерпана!!!')

end.

Реализация функции сортировки БД

Постановка задачи

Сортировка файла прямого доступа с информацией об учащихся. Фамилии упорядочиваются по алфавиту, если фамилии совпадают, то информация об однофамильцах упорядочивается по возрастанию дат рождения. Имя сортируемого физического файла определяет пользователь. Компоненты файла представляют собой записи типа tinfstud.

Метод решения

Так как файл прямого доступа в полной мере является аналогом массива, то для сортировки можно использовать любой метод сортировки массива. Выбираем метод сортировки выбором с перестановкой:

1) получить от пользователя имя физического файла, который будем сортировать readln(namebd);

2) если физический файл с таким именем отсутствует, то сообщить об этом пользователю и прекратить выполнение программы

3) связать логический и физический файлы assign(fbd,namebd);

4) формируем все компоненты файла с начального по предпоследний. В файлах прямого доступа начальный компонент имеет номер 0. Количество существующих компонентов файла прямого доступа определяется с помощью функции filesize(<илф>), так как нумерация с 0, то номер предпоследнего компонента файла на 2 меньше, чем количество компонентов
" i:=0..filesize(fbd)-2:

5) для каждого формируемого компонента i:

a) выбираем экстремальный компонент, начиная с формируемого компонента по последний элемент файла и определяем его местоположение;

b) осуществляем перестановку значений с формируемого места и места экстремального значения;

6) закрываем файл для работы close(fbd).

a) Выбор экстремального компонента осуществляем следующим образом:

1) читаем из файла очередной компонент (он находится на формируемом месте i) и принимаем его значение за экстремальное read(fbd,extr);

2) фиксируем место экстремального значения nm:=i;

3) перебираем все остальные компоненты файла. Пока не достигли конца файла not eof(fbd) повторяем

- чтение очередного компонента файла в переменную r read(fbd,r);

- если (r.fam<extr.fam) (r.fam=extr.fam)&(r.dr<extr.dr)

b) Перестановка значений

Перед выполнением этой подзадачи сложилась ситуация показанная на рис.24.3

Рис. 24.3. – Результат выбора

1 шаг перестановки – на место экстремального значения помещается значение с формируемого места:

- позиционирование на компонент i seek(fbd,i);

-.чтение из файла в промежуточную переменную r read(fbd,r);

- позиционирование на компонент nm seek(fbd,nm);

- запись значения переменной r в файл write(fbd,r);

2 шаг перестановки – на формируемое место записывается экстремальное значение

- позиционирование на компонент i seek(fbd,i);

- запись значения переменной extr в файл write(fbd,extr);

Обратите внимание, что после выполнения действий по перестановке, буфер связан с i+1 компонентом, то есть для выполнения п.5. буфер файла связан с необходимым компонентом.

Информационная модель

Таблица 24.7. Информационная модель

Статус Назначение Имя Тип
Вход имя физического файла с компонентами типа tinfstud namebd string
Пром имя логического файла fbd tfileinfstud
Пром номер формируемого компонента файла i longint
Пром экстремальное значение extr tinfstud
Пром номер компонента с экстремальным значением nm longint
Пром информация об учащемся r tinfstud

Программная модель

{программа сортировки (файл Z3.PAS)}

program z3;

{$I FILE0.PAS}

var i,nm:longint;

extr:tinfstud;

begin

writeln('Введите имя файла с информацией о студентах');

readln(namebd);

if not fs(namebd) then

begin

writeln('ОШИБКА!!! Файл с именем ',namebd,' не существует');

halt

end;

assign(fbd,namebd);

reset(fbd);

for i:=0 to filesize(fbd)-2 do

begin

read(fbd,extr);

nm:=i;

while not eof(fbd) do

begin

read(fbd,r);

with r do

if (fam<extr.fam)or

(fam=extr.fam)and((dr.g<extr.dr.g)or

(dr.g=extr.dr.g)and((dr.m<extr.dr.m)or

(dr.m=extr.dr.m)and(dr.d<extr.dr.d)))

then

begin

extr:=r;

nm:=filepos(fbd)-1

end

end;

seek(fbd,i);

read(fbd,r);

seek(fbd,nm);

write(fbd,r);

seek(fbd,i);

write(fbd,extr)

end;

close(fbd);

end.



Поделиться:


Последнее изменение этой страницы: 2016-06-26; просмотров: 248; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.128.171 (0.007 с.)