Упорядочить сведения по фамилиям абонентов методом быстрой сортировки - Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста, с задачей. Даже не знаю, с чего начать... Условие: В файле создать последовательность из данных об абонентах телефонной сети. Формат сведений: фамилия, адрес, номер телефона. Все сведения в файле не упорядочены. Упорядочить сведения по фамилиям абонентов методом быстрой сортировки. Обеспечить добавление нового абонента на правильное место в последовательности действий. Вывести все сведения на экран.

Решение задачи: «Упорядочить сведения по фамилиям абонентов методом быстрой сортировки»

textual
Листинг программы
  1. //тип данных
  2. type abon=record
  3.           fam:string[15];
  4.           adr:record
  5.               ul:string[15];
  6.               dm:integer;
  7.               kv:integer;
  8.               end;
  9.           nom:string[15];
  10.           end;
  11.      tfile=file of abon; //тип файла
  12. //рекурсивная процедура быстрой сортировки (сортировка Хоара) файла
  13. procedure Hoar(var f:tfile;l,r:integer);
  14. var i,j,m:integer;
  15.     a,b,x:abon;
  16. begin
  17. reset(f);
  18. i:=0;
  19. j:=filesize(f)-1;
  20. m:=(l+r)div 2;//средний элемент
  21. seek(f,m);
  22. read(f,x);
  23. repeat
  24. seek(f,i);
  25. read(f,a);
  26. seek(f,j);
  27. read(f,b);
  28. if a.fam<x.fam then
  29.  begin
  30.   inc(i);
  31.   seek(f,i);
  32.   read(f,a);
  33.  end;
  34. if b.fam>x.fam then
  35.  begin
  36.   dec(j);
  37.   seek(f,j);
  38.   read(f,b);
  39.  end;
  40. if i<=j then //если левый и правый срослись
  41.  begin
  42.   seek(f,i);
  43.   write(f,b);
  44.   seek(f,j);
  45.   write(f,a);
  46.   inc(i); //левый вправо
  47.   dec(j); //правый влево
  48.  end;
  49. until i>j;//конец одной перестановки
  50. if l<j then Hoar(f,l,j);//рекурсивно сортируем
  51. if i<r then Hoar(f,i,r);//или левую или правую части
  52. close(f);
  53. end;
  54. //процедура вставки записи на место
  55. procedure Vstav(var f:tfile);
  56. var i,i1:integer;
  57.     a,x:abon;
  58. begin
  59. reset(f);
  60. writeln('Добавьте 1 запись');
  61. with x do
  62.  begin
  63.   write('Фамилия абонента: ');readln(fam);
  64.   writeln('Введите адрес');
  65.   write('Улица: ');readln(adr.ul);
  66.   write('Номер дома: ');readln(adr.dm);
  67.   write('Номер квартиры: ');readln(adr.kv);
  68.   write('Номер телефона: ');readln(nom);
  69.   seek(f,filesize(f));
  70.  end;
  71. reset(f);
  72. //найдем место для вставки
  73. i1:=-1;
  74. i:=0;
  75. while(i<filesize(f))and(i1=-1)do
  76.  begin
  77.   seek(f,i);
  78.   read(f,a);
  79.   if a.fam>=x.fam then i1:=i
  80.   else i:=i+1;
  81.  end;
  82. if i1=-1 then //если нет больше чем х, то вставим в конец
  83.  begin
  84.   seek(f,filesize(f));
  85.   write(f,x);
  86.  end
  87. else
  88.  begin
  89.   for i:=filesize(f) downto i1+1 do
  90.    begin
  91.     seek(f,i-1);
  92.     read(f,a);
  93.     seek(f,i);
  94.     write(f,a);
  95.    end;
  96.   seek(f,i1);
  97.   write(f,x);
  98.  end;
  99. close(f);
  100. end;
  101. //печать файла
  102. procedure Print(var f:tfile);
  103. var x:abon;
  104. begin
  105. writeln('-----------------------------------------------------------');
  106. writeln('|    Фамилия    |         Адрес           | Номер телефона|');
  107. writeln('-----------------------------------------------------------');
  108. reset(f);
  109. while not eof(f) do
  110.  begin
  111.   read(f,x);
  112.   with x do
  113.   writeln('|',fam:15,'|',adr.ul:15,' ',adr.dm:4,' ',adr.kv:4,'|',nom:15,'|');
  114.  end;
  115. writeln('-----------------------------------------------------------');
  116. close(f);
  117. end;
  118. var f:tfile;
  119.     x:abon;
  120.     n,i:integer;
  121. begin
  122. assign(f,'abonenty');
  123. rewrite(f);
  124. write('Сколько абонентов записать в файл n=');
  125. readln(n);
  126. for i:=1 to n do
  127. with x do
  128.  begin
  129.   writeln('Запись ',i);
  130.   write('Фамилия абонента: ');readln(fam);
  131.   writeln('Введите адрес');
  132.   write('Улица: ');readln(adr.ul);
  133.   write('Номер дома: ');readln(adr.dm);
  134.   write('Номер квартиры: ');readln(adr.kv);
  135.   write('Номер телефона: ');readln(nom);
  136.   write(f,x);
  137.  end;
  138. Hoar(f,0,filesize(f)-1);
  139. writeln('Список абонентов по алфавиту');
  140. Print(f);
  141. Vstav(f);
  142. writeln('Список абонентов после вставки записи');
  143. Print(f);
  144. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы