Advertisement
ksyshshot

Lab.3.3

Nov 28th, 2022 (edited)
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.59 KB | Source Code | 0 0
  1. Program Lab_3_3;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R *.res}
  5.  
  6. Uses
  7.     System.SysUtils;
  8.  
  9. Type
  10.     TArr = Array Of Integer;
  11.  
  12. Const
  13.     MAX_SIZE = 100;
  14.     MIN_SIZE = 2;
  15.     MAX_ELEMENT = 2147483647;
  16.     MIN_ELEMENT = -2147483648;
  17.  
  18. Procedure WriteTask();
  19. Begin
  20.     Writeln('Данная программа реализует сортировку простыми вставками');
  21. End;
  22.  
  23. Function TakeSizeOfArrFromConsole(): Integer;
  24. Var
  25.     IsCorrect: Boolean;
  26.     Size: Integer;
  27. Begin
  28.     Repeat
  29.         IsCorrect := True;
  30.         Write('Введите длину сортируемого массива: ');
  31.         Try
  32.             Readln(Size);
  33.         Except
  34.             IsCorrect := False;
  35.             Writeln('Некорректный ввод. Повторите попытку...')
  36.         End;
  37.         If (IsCorrect) And ((Size < MIN_SIZE) Or (Size > MAX_SIZE)) Then
  38.         Begin
  39.             IsCorrect := False;
  40.             Writeln('Длина массива должна быть в диапазоне от 2 до 100.');
  41.         End;
  42.     Until (IsCorrect);
  43.     TakeSizeOfArrFromConsole := Size;
  44. End;
  45.  
  46. Function TakePathToFile(): String;
  47. Var
  48.     Path: String;
  49.     IsCorrect: Boolean;
  50.     F: TextFile;
  51. Begin
  52.     Repeat
  53.         IsCorrect := True;
  54.         Write('Введите путь к файлу: ');
  55.         Readln(Path);
  56.         AssignFile(F, Path);
  57.         If (Not(FileExists(Path))) Then
  58.         Begin
  59.             IsCorrect := False;
  60.             Writeln('Не удалось найти файл по заданному пути. Повторите попытку...');
  61.         End;
  62.     Until (IsCorrect);
  63.     TakePathToFile := Path;
  64. End;
  65.  
  66. Procedure WriteArr(Arr: TArr);
  67. Var
  68.     I: Integer;
  69. Begin
  70.     For I := 0 To High(Arr) Do
  71.         Write(Arr[I], ' ');
  72.     Writeln;
  73. End;
  74.  
  75. Function TakeArrFromConsole(Size: Integer): TArr;
  76. Var
  77.     I: Integer;
  78.     Arr: TArr;
  79.     IsCorrect: Boolean;
  80. Begin
  81.     SetLength(Arr, Size);
  82.     For I := 0 To High(Arr) Do
  83.     Begin
  84.         Repeat
  85.             IsCorrect := True;
  86.             Write('Введите элемент массива №', (I + 1), ': ');
  87.             Try
  88.                 Readln(Arr[I]);
  89.             Except
  90.                 Writeln('Элемент введён некорректно. Повторите попытку...');
  91.                 IsCorrect := False;
  92.             End;
  93.             If (IsCorrect) And ((Arr[I] < MIN_ELEMENT) Or (Arr[I] > MAX_ELEMENT)) Then
  94.             Begin
  95.                 IsCorrect := False;
  96.                 Writeln('Длина элемента массива должна быть в диапазоне от ', MIN_ELEMENT, ' до ', MAX_ELEMENT);
  97.             End;
  98.         Until (IsCorrect);
  99.     End;
  100.     TakeArrFromConsole := Arr;
  101. End;
  102.  
  103. Function TakeArrFromFile(): TArr;
  104. Var
  105.     Arr: TArr;
  106.     I, Size: Integer;
  107.     IsCorrect: Boolean;
  108.     F: TextFile;
  109.     Path: String;
  110. Begin
  111.     Write('Требуется файл для получения массива. ');
  112.     Path := TakePathToFile();
  113.     Repeat
  114.         IsCorrect := True;
  115.         AssignFile(F, Path);
  116.         I := 0;
  117.         Try
  118.             Reset(F);
  119.             Try
  120.                 Readln(F, Size);
  121.                 SetLength(Arr, Size);
  122.                 While (IsCorrect) And (I < Size) Do
  123.                 Begin
  124.                     Read(F, Arr[I]);
  125.                     If (Arr[I] < MIN_ELEMENT) Or (Arr[I] > MAX_ELEMENT) Then
  126.                     Begin
  127.                         IsCorrect := False;
  128.                         Write('Длина элемента массива должна быть в диапазоне от ', MIN_ELEMENT, ' до ', MAX_ELEMENT, '. ');
  129.                     End;
  130.                     Inc(I);
  131.                 End;
  132.             Finally
  133.                 CloseFile(F);
  134.             End;
  135.             If (IsCorrect) And ((Size > MAX_SIZE) Or (Size < MIN_SIZE)) Then
  136.             Begin
  137.                 Write('Размер массива выходит за границы допустимого диапазона! ');
  138.                 IsCorrect := False;
  139.             End;
  140.         Except
  141.             IsCorrect := False;
  142.             Write('Произошла ошибка при чтении файла. ');
  143.         End;
  144.         If Not(IsCorrect) Then
  145.         Begin
  146.             Writeln('Повторите попытку...');
  147.             Path := TakePathToFile();
  148.         End;
  149.     Until (IsCorrect);
  150.     TakeArrFromFile := Arr;
  151. End;
  152.  
  153. Function ChooseInputOutputMethod(): Integer;
  154. Var
  155.     IsCorrect: Boolean;
  156.     Choice: Integer;
  157. Begin
  158.     Repeat
  159.         IsCorrect := True;
  160.         Try
  161.             Readln(Choice);
  162.         Except
  163.             Writeln ('Число введено некорректно. Повторите попытку...');
  164.             IsCorrect := False;
  165.         End;
  166.         If (IsCorrect) And (Choice <> 1) And (Choice <> 2) Then
  167.         Begin
  168.             Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
  169.             IsCorrect := False;
  170.         End;
  171.     Until (IsCorrect);
  172.     ChooseInputOutputMethod := Choice;
  173. End;
  174.  
  175. Function GetArrForSort(): TArr;
  176. Var
  177.     Arr: TArr;
  178.     Choice, Size: Integer;
  179. Begin
  180.     Write('Выберите способ ввода данных (1 - через консоль, 2 - с помощью файлов): ');
  181.     Choice := ChooseInputOutputMethod();
  182.     If (Choice = 1) Then
  183.     Begin
  184.         Size := TakeSizeOfArrFromConsole();
  185.         Arr := TakeArrFromConsole(Size);
  186.     End
  187.     Else
  188.         Arr := TakeArrFromFile();
  189.     Write('Полученный массив: ');
  190.     WriteArr(Arr);
  191.     GetArrForSort := Arr;
  192. End;
  193.  
  194. Procedure Sort(Var Arr: TArr);
  195. Var
  196.     I, J, X: Integer;
  197. Begin
  198.     For I := 1 To High(Arr) Do
  199.     Begin
  200.         X := Arr[I];
  201.         J := I;
  202.         While (J > 0) And (Arr[J - 1] > X) Do
  203.         Begin
  204.             Arr[J] := Arr[J - 1];
  205.             Dec(J);
  206.         End;
  207.         Arr[J] := X;
  208.         WriteArr(Arr);
  209.     End;
  210. End;
  211.  
  212. Procedure OutputSortedArrInFile(Arr: TArr);
  213. Var
  214.     IsCorrect: Boolean;
  215.     F: TextFile;
  216.     Path: String;
  217.     I: Integer;
  218. Begin
  219.     Write('Требуется файл для записи отсортированного массива. ');
  220.     Path := TakePathToFile();
  221.     Repeat
  222.         IsCorrect := True;
  223.         AssignFile(F, Path);
  224.         Try
  225.             Rewrite(F);
  226.             Try
  227.                 Write(F, 'Полученный массив: ');
  228.                 For I := 0 To High(Arr) Do
  229.                 Begin
  230.                     Write(F, Arr[I]);
  231.                     Write(F, ' ');
  232.                 End;
  233.             Finally
  234.                 CloseFile(F);
  235.             End;
  236.         Except
  237.             IsCorrect := False;
  238.             Write('Произошла ошибка записи в файл. ');
  239.             Write('Повторите попытку... ');
  240.             Path := TakePathToFile();
  241.         End;
  242.     Until (IsCorrect);
  243.     Writeln('Ответ записан в файл!');
  244. End;
  245.  
  246. Procedure OutputSortedArr(Arr: TArr);
  247. Var
  248.     Choice: Integer;
  249. Begin
  250.     Write('Выберите способ вывода полученной строки(1 - с помощью консоли, 2 - с помощью файлов): ');
  251.     Choice := ChooseInputOutputMethod();
  252.     If (Choice = 1) Then
  253.     Begin
  254.         Write('Полученный массив: ');
  255.         WriteArr(Arr);
  256.     End
  257.     Else
  258.         OutputSortedArrInFile(Arr);
  259. End;
  260.  
  261. Var
  262.     Arr: TArr;
  263. Begin
  264.     WriteTask();
  265.     Arr := GetArrForSort();
  266.     Writeln('Процесс сортировки:');
  267.     Sort(Arr);
  268.     OutputSortedArr(Arr);
  269.     Readln;
  270. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement