Advertisement
THOMAS_SHELBY_18

Lab3_3(Delphi)

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