Упорядочить сведения по фамилиям абонентов методом быстрой сортировки - Pascal
Формулировка задачи:
Помогите, пожалуйста, с задачей. Даже не знаю, с чего начать...
Условие: В файле создать последовательность из данных об абонентах телефонной сети. Формат сведений: фамилия, адрес, номер телефона. Все сведения в файле не упорядочены. Упорядочить сведения по фамилиям абонентов методом быстрой сортировки. Обеспечить добавление нового абонента на правильное место в последовательности действий. Вывести все сведения на экран.
Решение задачи: «Упорядочить сведения по фамилиям абонентов методом быстрой сортировки»
textual
Листинг программы
//тип данных
type abon=record
fam:string[15];
adr:record
ul:string[15];
dm:integer;
kv:integer;
end;
nom:string[15];
end;
tfile=file of abon; //тип файла
//рекурсивная процедура быстрой сортировки (сортировка Хоара) файла
procedure Hoar(var f:tfile;l,r:integer);
var i,j,m:integer;
a,b,x:abon;
begin
reset(f);
i:=0;
j:=filesize(f)-1;
m:=(l+r)div 2;//средний элемент
seek(f,m);
read(f,x);
repeat
seek(f,i);
read(f,a);
seek(f,j);
read(f,b);
if a.fam<x.fam then
begin
inc(i);
seek(f,i);
read(f,a);
end;
if b.fam>x.fam then
begin
dec(j);
seek(f,j);
read(f,b);
end;
if i<=j then //если левый и правый срослись
begin
seek(f,i);
write(f,b);
seek(f,j);
write(f,a);
inc(i); //левый вправо
dec(j); //правый влево
end;
until i>j;//конец одной перестановки
if l<j then Hoar(f,l,j);//рекурсивно сортируем
if i<r then Hoar(f,i,r);//или левую или правую части
close(f);
end;
//процедура вставки записи на место
procedure Vstav(var f:tfile);
var i,i1:integer;
a,x:abon;
begin
reset(f);
writeln('Добавьте 1 запись');
with x do
begin
write('Фамилия абонента: ');readln(fam);
writeln('Введите адрес');
write('Улица: ');readln(adr.ul);
write('Номер дома: ');readln(adr.dm);
write('Номер квартиры: ');readln(adr.kv);
write('Номер телефона: ');readln(nom);
seek(f,filesize(f));
end;
reset(f);
//найдем место для вставки
i1:=-1;
i:=0;
while(i<filesize(f))and(i1=-1)do
begin
seek(f,i);
read(f,a);
if a.fam>=x.fam then i1:=i
else i:=i+1;
end;
if i1=-1 then //если нет больше чем х, то вставим в конец
begin
seek(f,filesize(f));
write(f,x);
end
else
begin
for i:=filesize(f) downto i1+1 do
begin
seek(f,i-1);
read(f,a);
seek(f,i);
write(f,a);
end;
seek(f,i1);
write(f,x);
end;
close(f);
end;
//печать файла
procedure Print(var f:tfile);
var x:abon;
begin
writeln('-----------------------------------------------------------');
writeln('| Фамилия | Адрес | Номер телефона|');
writeln('-----------------------------------------------------------');
reset(f);
while not eof(f) do
begin
read(f,x);
with x do
writeln('|',fam:15,'|',adr.ul:15,' ',adr.dm:4,' ',adr.kv:4,'|',nom:15,'|');
end;
writeln('-----------------------------------------------------------');
close(f);
end;
var f:tfile;
x:abon;
n,i:integer;
begin
assign(f,'abonenty');
rewrite(f);
write('Сколько абонентов записать в файл n=');
readln(n);
for i:=1 to n do
with x do
begin
writeln('Запись ',i);
write('Фамилия абонента: ');readln(fam);
writeln('Введите адрес');
write('Улица: ');readln(adr.ul);
write('Номер дома: ');readln(adr.dm);
write('Номер квартиры: ');readln(adr.kv);
write('Номер телефона: ');readln(nom);
write(f,x);
end;
Hoar(f,0,filesize(f)-1);
writeln('Список абонентов по алфавиту');
Print(f);
Vstav(f);
writeln('Список абонентов после вставки записи');
Print(f);
end.
Объяснение кода листинга программы
- Объявляется тип данных
abonсо следующими полями:- fam - фамилия (строка длиной до 15 символов)
- adr - запись с полями:
- ul - улица (строка длиной до 15 символов)
- dm - номер дома (целое число)
- kv - номер квартиры (целое число)
- nom - номер телефона (строка длиной до 15 символов)
- Объявляется тип файла
tfileдля данных типаabon. - Описывается рекурсивная процедура быстрой сортировки файла с именем
Hoarи параметрамиvar f:tfile;l,r:integer. В процедуре реализуется сортировка Хоара. - Процедура
Vstavдля вставки записи в файл, имеет параметрvar f:tfile. Внутри процедуры происходит ввод новой записи, поиск места для вставки и реализация вставки. - Процедура
Printдля печати файла, ее параметром являетсяvar f:tfile. Внутри процедуры происходит вывод информации о каждом абоненте в виде таблицы. - Объявляются переменные: f (типа
tfile), x (типаabon), n и i (целые числа). - В основной программе происходит открытие файла
abonenty, запись в него информации о абонентах, сортировка абонентов по фамилии, печать списка абонентов до и после вставки новой записи.