Сортировка по возрастанию даты в записях - Pascal ABC

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

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

Свою летопись историк составил в таком формате: день(арабскими)/Месяц(Римскими)/Год(арабскими)/Описание(строка). Упорядочить все записи за возрастанием даты.

Решение задачи: «Сортировка по возрастанию даты в записях»

textual
Листинг программы
program z1;
type Note = record
       iDay : integer;
       sMonat : string;
       iAge: integer;
       sData: string;
     end;
var 
  aChronicle : array[1..100] of Note;
  n : integer;
  
function GetMonat(a : Note) : integer;
begin
  if(a.sMonat = 'I') then GetMonat := 1
  else if(a.sMonat = 'II') then GetMonat := 2
  else if(a.sMonat = 'III') then GetMonat := 3
  else if(a.sMonat = 'IV') then GetMonat := 4
  else if(a.sMonat = 'V') then GetMonat := 5
  else if(a.sMonat = 'VI') then GetMonat := 6
  else if(a.sMonat = 'VII') then GetMonat := 7
  else if(a.sMonat = 'VIII') then GetMonat := 8
  else if(a.sMonat = 'IX') then GetMonat := 9
  else if(a.sMonat = 'X') then GetMonat := 10
  else if(a.sMonat = 'XI') then GetMonat := 11
  else if(a.sMonat = 'XII') then GetMonat := 12
  else GetMonat := 0;
end;
  
function Compare(a : Note; b : Note) : integer;
begin
  if(a.iAge < b.iAge) then Compare := 1
  else if(a.iAge > b.iAge) then Compare := -1
  else begin
    if(GetMonat(a) < GetMonat(b)) then Compare := 1
    else if(GetMonat(a) > GetMonat(b)) then Compare := -1
    else begin
      if(a.iDay < b.iDay) then Compare := 1
      else if(a.iDay > b.iDay) then Compare := -1
      else if(a.iDay < b.iDay) then Compare := 0;
    end;
  end;
end;
 
procedure qsort(low : integer; high : integer);
var i, j : integer;
    m, t : Note;
begin
  i := low; j := high; m := aChronicle[(i + j) shr 1];
  repeat
    while (Compare(aChronicle[i], m) = 1) do inc(i);    
    while (Compare(aChronicle[j], m) = -1) do dec(j);
    if (i <= j) then begin
      t := aChronicle[i]; aChronicle[i] := aChronicle[j]; aChronicle[j] := t;
      inc(i); dec(j);
    end;
  until (i > j);
  if (low < j) then qsort(low, j);
  if (i < high) then qsort(i, high);
end;
 
begin
  //чтение записей
  qsort(1, n); //n - число записей
  //вывод записей
end.

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

  1. Создается тип данных Note, который представляет собой запись с полями iDay (день), sMonat (месяц), iAge (возраст) и sData (дата).
  2. Создается переменная aChronicle, которая представляет собой массив записей типа Note.
  3. Создается переменная n, которая представляет собой количество записей в массиве aChronicle.
  4. Определяется функция GetMonat, которая преобразует месяц из строки в числовое значение и возвращает это значение.
  5. Определяется функция Compare, которая сравнивает две записи на основе возраста, месяца и дня. Если возраст одинаков, сравниваются месяц и день. Если все три поля равны, сравниваются только дни. Если все условия равны, функция возвращает 0.
  6. Определяется процедура qsort, которая реализует алгоритм сортировки пузырьком.
  7. В основной части программы сначала вызывается функция GetMonat для определения числового значения месяца в первой записи.
  8. Затем вызывается функция Compare для сравнения первой записи с остальными записями в массиве aChronicle.
  9. Пока условие сравнения не выполняется, выполняется рекурсивный вызов функции qsort для подмассива.
  10. После завершения рекурсивных вызовов выполняется вывод записей.

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


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

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

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