Advertisement
Vernon_Roche

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

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