Advertisement
Vernon_Roche

Задание 3 Delphi (Лабораторная работа 3)

Nov 21st, 2023
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.67 KB | None | 0 0
  1. Program Lab3;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TArr = Array of Real;
  8.  
  9. Const
  10.     INPUT = 1;
  11.     OUTPUT = 2;
  12.     MIN_QUANTITY = 1;
  13.     MAX_QUANTITY = 100000;
  14.     FILE_CHOICE = 1;
  15.     CONSOLE_CHOICE = 2;
  16.  
  17. Procedure OutputInConsole(Var SortedArr: TArr);
  18. Var
  19.     I: Integer;
  20. Begin
  21.     For I := 0 To High(SortedArr) Do
  22.         Write(SortedArr[I]:7:2, ' ');
  23. End;
  24.  
  25. Procedure SortArr(Var SortableArr: TArr);
  26. Var
  27.     Position, CheckPosition, MoveNumPosition: Integer;
  28.     CheckNum: Real;
  29. Begin
  30.     Writeln('Исходный массив:');
  31.     OutputInConsole(SortableArr);
  32.     Writeln;
  33.     For CheckPosition := Length(SortableArr) - 2 Downto 0 Do
  34.     Begin
  35.         Position := Length(SortableArr) - 1;
  36.         While (Position > CheckPosition) And (SortableArr[Position] > SortableArr[CheckPosition]) Do
  37.             Dec(Position);
  38.         CheckNum := SortableArr[CheckPosition];
  39.         For MoveNumPosition := CheckPosition To Position - 1 Do
  40.             SortableArr[MoveNumPosition] := SortableArr[moveNumPosition + 1];
  41.         SortableArr[Position] := CheckNum;
  42.         Writeln('Массив на ', High(SortableArr) - CheckPosition - 1, '-м шаге сортировки:');
  43.         OutputInConsole(SortableArr);
  44.         Writeln;
  45.     End;
  46. End;
  47.  
  48. Function ChooseFileOrConsole(Const InOrOutput: Integer): Integer;
  49. Var
  50.     Choice: Integer;
  51.     IsCorrect: Boolean;
  52. Begin
  53.     Case InorOutput Of
  54.         INPUT:
  55.         Begin
  56.             Writeln('Выберите вариант ввода:');
  57.             Writeln('1.Данные вводятся из текстового файла.');
  58.             Writeln('2.Данные вводятся через консоль.');
  59.         End;
  60.         OUTPUT:
  61.         Begin
  62.             Writeln('Выберите вариант вывода:');
  63.             Writeln('1.Данные выводятся в текстовый файл.');
  64.             Writeln('2.Данные выводятся в консоль.');
  65.         End;
  66.     End;
  67.     Repeat
  68.         IsCorrect := True;
  69.         Try
  70.             Readln(Choice);
  71.         Except
  72.             Writeln('Ошибка ввода. Выберите вариант 1 или 2.');
  73.             IsCorrect := False;
  74.         End;
  75.         If IsCorrect And ((Choice < 1) Or (Choice > 2)) Then
  76.         Begin
  77.             Writeln('Ошибка ввода. Выберите вариант 1 или 2.');
  78.             IsCorrect := False;
  79.         End;
  80.     Until IsCorrect;
  81.     ChooseFileOrConsole := Choice;
  82. End;
  83.  
  84. Procedure InputInFileName(Var FileName: String);
  85. Var
  86.     CheckFile: TextFile;
  87.     IsCorrect: Boolean;
  88. Begin
  89.     Writeln('Введите имя файла, из которого будут вводиться данные:');
  90.     Repeat
  91.         IsCorrect := True;
  92.         Readln(FileName);
  93.         If ExtractFileExt(FileName) = '.txt' Then
  94.         Begin
  95.             If Not FileExists(FileName) Then
  96.             Begin
  97.                 Writeln('Файла с таким именем не существует. Повторите ввод имени файла.');
  98.                 IsCorrect := False;
  99.             End
  100.             Else
  101.                 Try
  102.                     Assign(CheckFile, FileName);
  103.                     Reset(CheckFile);
  104.                     Close(CheckFile);
  105.                 Except
  106.                     Writeln('Невозможно открыть файл с таким именем! Повторите ввод имени файла:');
  107.                     IsCorrect := False;
  108.                 End;
  109.         End
  110.         Else
  111.         Begin
  112.             Writeln('Файл должен иметь расширение .txt! Повторите ввод имени файла.');
  113.             IsCorrect := False;
  114.         End;
  115.     Until IsCorrect;
  116. End;
  117.  
  118. Function CheckFile(Var FileName: String): Boolean;
  119. Var
  120.     IsCorrect: Boolean;
  121.     ArrLength, I: Integer;
  122.     InputFile: TextFile;
  123.     ArrNumber: Real;
  124. Begin
  125.     Assign(InputFile, FileName);
  126.     Reset(InputFile);
  127.     IsCorrect := True;
  128.     ArrNumber := 9;
  129.     Try
  130.         Read(InputFile, ArrLength);
  131.     Except
  132.         Writeln('В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.');
  133.         IsCorrect := False;
  134.     End;
  135.     If IsCorrect And ((ArrLength < MIN_QUANTITY) Or (ArrLength > MAX_QUANTITY)) Then
  136.     Begin
  137.         Writeln('В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.');
  138.         IsCorrect := False;
  139.     End
  140.     Else
  141.     Begin
  142.         I := 0;
  143.         While IsCorrect And (I < ArrLength) Do
  144.         Begin
  145.             Try
  146.                 Read(InputFile, ArrNumber);
  147.             Except
  148.                 Writeln('В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.');
  149.                 IsCorrect := False;
  150.             End;
  151.             Inc(I);
  152.         End;
  153.         If IsCorrect And Not EoF(InputFile) Then
  154.         Begin
  155.             Writeln('В файле содержатся лишние данные! Измените содержание файла и повторите ввод его имени.');
  156.             IsCorrect := False;
  157.         End;
  158.     End;
  159.     Close(InputFile);
  160.     CheckFile := IsCorrect;
  161. End;
  162.  
  163. Procedure InputFromFile(FileName: String; Var InputArray: TArr);
  164. Var
  165.     InputFile: TextFile;
  166.     ArrayLength, I: Integer;
  167. Begin
  168.     Assign(InputFile, FileName);
  169.     Reset(InputFile);
  170.     Read(InputFile, ArrayLength);
  171.     SetLength(InputArray, ArrayLength);
  172.     For I := 0 To High(InputArray) Do
  173.         Read(InputFile, InputArray[I]);
  174.     Close(InputFile);
  175. End;
  176.  
  177. Procedure InputFromConsole(Var InputArray: TArr);
  178. Var
  179.     ArrayLength, I: Integer;
  180.     IsCorrect: Boolean;
  181. Begin
  182.     Writeln('Введите длину массива:');
  183.     Repeat
  184.         IsCorrect := True;
  185.         Try
  186.             Readln(ArrayLength);
  187.         Except
  188.             Writeln('Ошибка ввода. Введите натуральное число в диапазоне [', MIN_QUANTITY, '; ', MAX_QUANTITY, ']');
  189.             IsCorrect := False;
  190.         End;
  191.         If IsCorrect And ((ArrayLength < MIN_QUANTITY) Or (ArrayLength > MAx_QUANTITY)) Then
  192.         Begin
  193.             Writeln('Ошибка ввода. Введите натуральное число в диапазоне [', MIN_QUANTITY, '; ', MAX_QUANTITY, ']');
  194.             IsCorrect := False;
  195.         End;
  196.     Until IsCorrect;
  197.     SetLength(InputArray, ArrayLength);
  198.     Writeln('Введите элементы массива:');
  199.     For I := 0 To High(InputArray) Do
  200.         Repeat
  201.             IsCorrect := True;
  202.             Try
  203.                 Readln(InputArray[I]);
  204.             Except
  205.                 IsCorrect := False;
  206.                 Writeln('Ошибка ввода! Введите действительное число:');
  207.             End;
  208.         Until IsCorrect;
  209. End;
  210.  
  211. Procedure InputArr(Var InputArray: TArr; Var Choice: Integer);
  212. Var
  213.     FileName: String;
  214.     IsCorrect: Boolean;
  215. Begin
  216.     Case Choice Of
  217.         FILE_CHOICE:
  218.         Begin
  219.             Repeat
  220.                 InputInFileName(FileName);
  221.                 IsCorrect := CheckFile(FileName);
  222.             Until IsCorrect;
  223.             InputFromFile(FileName, InputArray);
  224.         End;
  225.         CONSOLE_CHOICE:
  226.         Begin
  227.             InputFromConsole(InputArray);
  228.         End;
  229.     End;
  230. End;
  231.  
  232. Procedure InputOutFileName(Var FileName: String);
  233. Var
  234.     IsCorrect: Boolean;
  235.     OutputFile: TextFile;
  236. Begin
  237.     Writeln('Введите имя файла, в который будут выводиться полученные данные (если файл вводится без расширения, то ему автоматически будет добавлено расширение .txt):');
  238.     Repeat
  239.         IsCorrect := True;
  240.         Readln(FileName);
  241.         If ExtractFileExt(FileName) = '' Then
  242.             FileName := FileName + '.txt';
  243.         Try
  244.             Assign(OutputFile, FileName);
  245.             ReWrite(OutputFile);
  246.             Close(OutputFile);
  247.         Except
  248.             Writeln('Невозможно открыть для записи файл с таким именем! Повторите ввод имени файла:');
  249.             IsCorrect := False;
  250.         End;
  251.     Until IsCorrect;
  252. End;
  253.  
  254. Procedure OutputInFile(Var FileName: String; Var SortedArr: TArr);
  255. Var
  256.     OutputFile: TextFile;
  257.     I: Integer;
  258. Begin
  259.     Assign(OutputFile, FileName);
  260.     ReWrite(OutputFile);
  261.     For I := 0 To High(SortedArr) Do
  262.         Write(OutputFile, SortedArr[I]:7:2, ' ');
  263.     Close(OutputFile);
  264. End;
  265.  
  266. Procedure OutputArr(Var SortedArr: TArr; Var Choice: Integer);
  267. Var
  268.     FileName: String;
  269. Begin
  270.     Case Choice Of
  271.         1:
  272.         Begin
  273.             InputOutFileName(FileName);
  274.             OutputInFile(FileName, SortedArr);
  275.             Write('Искомые данные выведены в файл ');
  276.             Writeln(FileName);
  277.         End;
  278.         2:
  279.         Begin
  280.             Writeln('Отсортированный массив:');
  281.             OutputInConsole(SortedArr);
  282.         End;
  283.     End;
  284. End;
  285.  
  286. Var
  287.     SortableArr: TArr;
  288.     Choice: Integer;
  289. Begin
  290.     Writeln('Программа сортирует массив методом простых вставок.');
  291.     Choice := ChooseFileOrConsole(INPUT);
  292.     InputArr(SortableArr, Choice);
  293.     SortArr(SortableArr);
  294.     Choice := ChooseFileOrConsole(OUTPUT);
  295.     OutputArr(SortableArr, Choice);
  296.     Readln;
  297. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement