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

Объяснение кода листинга программы

  1. Объявляется тип данных abon со следующими полями:
    • fam - фамилия (строка длиной до 15 символов)
    • adr - запись с полями:
      • ul - улица (строка длиной до 15 символов)
      • dm - номер дома (целое число)
      • kv - номер квартиры (целое число)
    • nom - номер телефона (строка длиной до 15 символов)
  2. Объявляется тип файла tfile для данных типа abon.
  3. Описывается рекурсивная процедура быстрой сортировки файла с именем Hoar и параметрами var f:tfile;l,r:integer. В процедуре реализуется сортировка Хоара.
  4. Процедура Vstav для вставки записи в файл, имеет параметр var f:tfile. Внутри процедуры происходит ввод новой записи, поиск места для вставки и реализация вставки.
  5. Процедура Print для печати файла, ее параметром является var f:tfile. Внутри процедуры происходит вывод информации о каждом абоненте в виде таблицы.
  6. Объявляются переменные: f (типа tfile), x (типа abon), n и i (целые числа).
  7. В основной программе происходит открытие файла abonenty, запись в него информации о абонентах, сортировка абонентов по фамилии, печать списка абонентов до и после вставки новой записи.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.615 из 5
Похожие ответы