Упорядочить сведения по фамилиям абонентов методом быстрой сортировки - 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
, запись в него информации о абонентах, сортировка абонентов по фамилии, печать списка абонентов до и после вставки новой записи.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д