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




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

Сортировка файла прямого доступа с информацией об учащихся. Фамилии упорядочиваются по алфавиту, если фамилии совпадают, то информация об однофамильцах упорядочивается по возрастанию дат рождения. Имя сортитруемого физического файла определяет пользователь. Компоненты файла представляют собой записи типа 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) Перестановка значений

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

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

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. буфер файла связан с необходимым компонентом.

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

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

Статус Назначение Имя Тип
Вход имя физического файла с компонентами типа 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.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: