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