Advertisement
anticlown

Lists - 1.4(2 sem)

Apr 9th, 2023 (edited)
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.86 KB | None | 0 0
  1. Program AiSD_1_4;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. Uses
  6.     SysUtils,
  7.     Windows;
  8.  
  9. Type
  10.     Number = ^Elem;
  11.  
  12.     Elem = Record
  13.         AbonentNumber: String[30];
  14.         NextNumber: Number;
  15.         PrevNumber: Number;
  16.     End;
  17.  
  18.     Number2 = ^Elem2;
  19.  
  20.     Elem2 = Record
  21.         Data: String[30];
  22.         Next: Number2;
  23.     End;
  24.  
  25. Function InputAmount(): Integer;  //ввод количества
  26. Const
  27.     MIN_NUMBER = 1;
  28.     MAX_NUMBER = 9;
  29. Var
  30.     Amount: Integer;
  31.     IsCorrect: Boolean;
  32. Begin
  33.     Writeln('Введите количество номеров телефонов:');
  34.     Repeat
  35.         Try
  36.             IsCorrect := True;
  37.             Readln(Amount);
  38.         Except
  39.             Writeln('Проверьте корректность ввода и повторите попытку!');
  40.             IsCorrect := False;
  41.         End;
  42.         If (IsCorrect) And ((Amount < MIN_NUMBER) Or (Amount > MAX_NUMBER)) Then
  43.         Begin
  44.             IsCorrect := False;
  45.             Writeln('Неправильное значение! Введите от', MIN_NUMBER, 'до', MAX_NUMBER, '!');
  46.         End;
  47.     Until (IsCorrect);
  48.     InputAmount := Amount;
  49. End;
  50.  
  51. Procedure InputElements(Var List: Number; Amount: Integer);  //ввод  номеров
  52. Const
  53.     MIN_LENGTH = 3;
  54.     MAX_LENGTH = 7;
  55. Var
  56.     X, Head, Y: Number;
  57.     I: Integer;
  58.     IsCorrect: Boolean;
  59. Begin
  60.     New(X);
  61.     List := X;
  62.     X^.PrevNumber := Nil;
  63.     For I := 1 To Amount Do
  64.     Begin
  65.         Y := X;
  66.         Writeln('Введите ', I, '-й телефонный номер:');
  67.         Repeat
  68.             Try
  69.                 IsCorrect := True;
  70.                 Readln(Y^.AbonentNumber);
  71.             Except
  72.                 Writeln('Проверьте корректность ввода и повторите попытку!');
  73.                 IsCorrect := False;
  74.             End;
  75.             If (IsCorrect) And ((Length(Y^.AbonentNumber) <> MIN_LENGTH) And
  76.                 (Length(Y^.AbonentNumber) <> MAX_LENGTH)) Then
  77.             Begin
  78.                 IsCorrect := False;
  79.                 Writeln('Введено некорректный номер! Длина номера телефона может состовлять либо',
  80.                     MIN_LENGTH, ', либо ', MAX_LENGTH, '!');
  81.             End;
  82.         Until (IsCorrect);
  83.         New(X);
  84.         Y^.NextNumber := X;
  85.         X^.PrevNumber := Y;
  86.     End;
  87.     Y^.NextNumber := Nil;
  88. End;
  89.  
  90. Procedure OutputInputData(Y: Number); //вывод введенных номеров
  91. Begin
  92.     Writeln('Список введённых номеров телефонов:');
  93.     While Y <> Nil Do
  94.     Begin
  95.         Write(Y^.AbonentNumber + ' ');
  96.         Y := Y^.NextNumber;
  97.     End;
  98. End;
  99.  
  100. Procedure ReverseList(List: Number); //список в обратном порядке
  101. Begin
  102.     While List^.NextNumber <> Nil Do
  103.         List := List^.NextNumber;
  104.     While List <> Nil Do
  105.     Begin
  106.         Write(' ', List^.AbonentNumber);
  107.         List := List^.PrevNumber;
  108.     End;
  109. End;
  110.  
  111. Procedure GetNewList(Var NewList: Number2; List: Number); //создание списка 7-значных
  112. Var
  113.     Head, Current: Number2;
  114. Begin
  115.     New(Head);
  116.     NewList := Head;
  117.     While List <> Nil Do
  118.     Begin
  119.         If Length(List^.AbonentNumber) = 7 Then
  120.         Begin
  121.             Current := Head;
  122.             Current^.Data := List^.AbonentNumber;
  123.             New(Head);
  124.             Current^.Next := Head;
  125.             List := List^.NextNumber;
  126.         End
  127.         Else
  128.             List := List^.NextNumber;
  129.     End;
  130.     Current^.Next := Nil;
  131. End;
  132.  
  133. Procedure Sort(NewList: Number2); //сортировка
  134. Begin
  135.     While NewList <> Nil Do
  136.     Begin
  137.         Var
  138.         Temp := NewList^.Next;
  139.         While Temp <> Nil Do
  140.         Begin
  141.             If Temp^.Data < NewList^.Data Then
  142.             Begin
  143.                 Var
  144.                 TempSwap := Temp^.Data;
  145.                 Temp^.Data := NewList^.Data;
  146.                 NewList^.Data := TempSwap;
  147.             End;
  148.             Temp := Temp^.Next;
  149.         End;
  150.         NewList := NewList^.Next;
  151.     End;
  152. End;
  153.  
  154. Procedure WriteSortList(NewList: Number2);   //Вывод отсортированных 7-значных номеров
  155. Begin
  156.     Writeln;
  157.     Writeln('Список семизначных номеров:');
  158.     While NewList <> Nil Do
  159.     Begin
  160.         Write(NewList^.Data + ' ');
  161.         NewList := NewList^.Next;
  162.     End;
  163. End;
  164.  
  165.  
  166. //Main
  167. Var
  168.     Amount: Integer;
  169.     List: Number;
  170.     NewList: Number2;
  171. Begin
  172.     InputElements(List, InputAmount());
  173.     Writeln('------------------------------------------');
  174.     OutputInputData(List);
  175.     Writeln;
  176.     Writeln('Список номеров телефонов:');
  177.     ReverseList(List);
  178.     GetNewList(NewList, List);
  179.     Sort(NewList);
  180.     WriteSortList(NewList);
  181.     Readln;
  182. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement