Advertisement
ksyshshot

АиСД. Лаба 1.4

Mar 6th, 2023 (edited)
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.65 KB | Source Code | 0 0
  1. program labwork1_4;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8.   System.SysUtils;
  9.  
  10. type
  11.     TPt = ^TElem;
  12.     TElem = record
  13.         Data: Integer;
  14.         Next: TPt;
  15.         Prev: TPt;
  16.     end;
  17.  
  18. procedure GetPhoneNumbers(var Element: TPt; Count: Integer);
  19. var
  20.     I: Integer;
  21.     Temp: TPt;
  22. begin
  23.     for I := 1 to Count do
  24.     begin
  25.         Temp := Element;
  26.         Write('Введите ', I, ' номер: ');
  27.         Readln(Temp^.Data);
  28.         if I <> Count then
  29.         begin
  30.             New(Element);  //создаю следующий элемент
  31.             Temp^.Next := Element;  //добавляю в предыдущий элемент указатель на следующий
  32.             Element^.Prev := Temp;  //добавляю следующему элементу указатель на предыдущий желемент списка
  33.         end
  34.         else
  35.         begin
  36.             Temp^.Next := nil;  //тк последний элемент, то указателя на след. элемент нет
  37.         end;
  38.     end;
  39.     Writeln;
  40. end;
  41.  
  42. procedure OutputReversePhoneNumbers(var LastElement: TPt; Count: Integer);
  43. var
  44.     I: Integer;
  45.     Temp: TPt;
  46. begin
  47.     Writeln('Введённые номера:');
  48.     //show phone numbers in reverse order
  49.     for I := Count downto 1 do
  50.     begin
  51.         Temp := LastElement;
  52.         Writeln(Temp^.Data);
  53.         if I <> 1 then
  54.             LastElement := Temp^.Prev;
  55.     end;
  56.     Writeln;
  57. end;
  58.  
  59. procedure DeleteServicePhones(var Element: TPt; var Count: Integer);
  60. var
  61.     NewCount, I: Integer;
  62.     Temp: TPt;
  63. begin
  64.     NewCount := Count;
  65.     for I := 1 to Count do
  66.     begin
  67.         Temp := Element;
  68.         if (Temp^.Data div 100 > 0) and (Temp^.Data div 100 < 10) then
  69.         begin
  70.             if (Temp^.Prev <> nil) and (Temp^.Next <> nil) then
  71.             begin
  72.                 Temp^.Prev^.Next := Temp^.Next;
  73.                 Temp^.Next^.Prev := Temp^.Prev;
  74.                 Element := Temp^.Next;
  75.             end
  76.             else
  77.             begin
  78.                 if (Temp^.Prev = nil) and (Temp^.Next <> nil) then   //если это первый элемент списка
  79.                 begin
  80.                     Temp^.Next^.Prev := nil;
  81.                     Element := Temp^.Next;
  82.                 end;
  83.                 if (Temp^.Next = nil) and (Temp^.Prev <> nil) then //если последний
  84.                 begin
  85.                     Temp^.Prev^.Next := nil;
  86.                     Element := Temp^.Prev;
  87.                 end;
  88.             end;
  89.             Dec(NewCount);
  90.         end
  91.         else
  92.             if (Temp^.Next <> nil) then
  93.                 Element := Temp^.Next;
  94.     end;
  95.     Count := NewCount;
  96. end;
  97.  
  98. procedure SortPhoneNumbers(LastElement: TPt; Count: Integer);
  99. var
  100.     I, J, TempNumber: Integer;
  101.     Temp: TPt;
  102. begin
  103.     for I := 1 to (Count - 1) do
  104.     begin
  105.         Temp := LastElement;
  106.         for J := 1 to (Count - I) do
  107.         begin
  108.             if Temp^.Data <= Temp^.Prev^.Data then
  109.             begin
  110.                 TempNumber := Temp^.Prev^.Data;
  111.                 Temp^.Prev^.Data := Temp^.Data;
  112.                 Temp^.Data := TempNumber;
  113.             end;
  114.         end;
  115.         LastElement := Temp^.Prev;
  116.     end;
  117. end;
  118.  
  119. function GoToTheListHead(LastElement: TPt; Count: Integer): TPt;
  120. var
  121.     I: Integer;
  122.     Temp, Start: TPt;
  123. begin
  124.     Start := LastElement;
  125.     for I := 1 to (Count - 1) do
  126.     begin
  127.         Temp := Start;
  128.         Start := Temp^.Prev;
  129.     end;
  130.     GoToTheListHead := Start;
  131. end;
  132.  
  133. procedure ShowSortedPhoneSet(Element: TPt; Count: Integer);
  134. var
  135.     I: Integer;
  136.     Temp: TPt;
  137. begin
  138.     Writeln('Полученный список номеров: ');
  139.     if (Count > 0) then
  140.     begin
  141.         for I := 1 to Count do
  142.         begin
  143.             Temp := Element;
  144.             Writeln(Temp^.Data);
  145.             if I <> Count then
  146.                 Element := Temp^.Next;
  147.         end;
  148.     end
  149.     else
  150.         Writeln('Нет пользовательских номеров.');
  151. end;
  152.  
  153. procedure Main();
  154. var
  155.     Count: Integer;
  156.     Element: TPt;
  157. begin
  158.     Write('Введите количество номеров: ');
  159.     Readln(Count);
  160.     Writeln;
  161.     Writeln('Выбранное Вами количество номеров: ', Count);
  162.     New(Element);
  163.     Element^.Prev := nil;
  164.     GetPhoneNumbers(Element, Count);
  165.     OutputReversePhoneNumbers(Element, Count);
  166.     DeleteServicePhones(Element, Count);
  167.     SortPhoneNumbers(Element, Count);
  168.     Element := GoToTheListHead(Element, Count);
  169.     ShowSortedPhoneSet(Element, Count);
  170. end;
  171.  
  172. begin
  173.     Main();
  174.     Readln;
  175. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement