ValeriaAVR

lab24

Oct 30th, 2024
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 13.17 KB | None | 0 0
  1. Program Lab24;
  2.  
  3. Uses
  4.     SysUtils;
  5.  
  6. Const
  7.     MIN_C = 1;
  8.     MAX_C = 2;
  9.     MIN_SIZE = 1;
  10.     MAX_SIZE = 50;
  11.     MIN_A = -1000;
  12.     MAX_A = 1000;
  13.  
  14. Type
  15.     TArray = Array Of Integer;
  16.  
  17. Function InputInteger(Const MIN, MAX: Integer): Integer;
  18. Var
  19.     N: Integer;
  20.     IsCorrect: Boolean;
  21. Begin
  22.     N := 0;
  23.     Repeat
  24.         IsCorrect := True;
  25.         WriteLn('Введите значение: ');
  26.         Try
  27.             ReadLn(N);
  28.         Except
  29.             IsCorrect := False;
  30.             WriteLn('Некорректный ввод.');
  31.         End;
  32.  
  33.         If IsCorrect And ((N < MIN) Or (N > MAX)) Then
  34.         Begin
  35.             WriteLn('Введите корректное значение.');
  36.             IsCorrect := False;
  37.         End;
  38.     Until IsCorrect;
  39.     InputInteger := N;
  40. End;
  41.  
  42. Function IsFileExists(Const FileName: String): Boolean;
  43. Begin
  44.     IsFileExists := FileExists(FileName);
  45.     If Not FileExists(FileName) Then
  46.         WriteLn('Файл не существует.');
  47. End;
  48.  
  49. Function IsFileTxt(Const FileName: String): Boolean;
  50. Var
  51.     FileType: String;
  52. Begin
  53.     If (Length(FileName) > 4) Then
  54.     Begin
  55.         FileType := FileName.SubString(FileName.Length - 4);
  56.         If (FileType = '.txt') Then
  57.             IsFileTxt := True
  58.         Else
  59.         Begin
  60.             WriteLn('Файл не является текстовым. ');
  61.             IsFileTxt := False;
  62.         End;
  63.     End
  64.     Else
  65.     Begin
  66.         WriteLn('Введите корректное имя файла. ');
  67.         IsFileTxt := False;
  68.     End;
  69. End;
  70.  
  71. Function IsFileNotEmpty(Var MyFile: TextFile): Boolean;
  72. Var
  73.     IsNotEmpty: Boolean;
  74. Begin
  75.     Try
  76.         Try
  77.             Reset(MyFile);
  78.             IsNotEmpty := Not Eof(MyFile);
  79.             If (Not IsNotEmpty) Then
  80.                 WriteLn('Этот файл пустой. ');
  81.         Except
  82.             WriteLn('Непредвиденная ошибка.');
  83.             IsNotEmpty := False;
  84.         End;
  85.     Finally
  86.         CloseFile(MyFile);
  87.     End;
  88.     IsFileNotEmpty := IsNotEmpty;
  89. End;
  90.  
  91. Function IsFileWritable(Var MyFile: TextFile): Boolean;
  92. Begin
  93.     IsFileWritable := True;
  94.     Try
  95.         Rewrite(MyFile);
  96.     Except
  97.         IsFileWritable := False;
  98.         WriteLn('Этот файл невозможно открыть для записи.');
  99.     End;
  100. End;
  101.  
  102. Function IsFileReadable(Var MyFile: TextFile): Boolean;
  103. Begin
  104.     IsFileReadable := True;
  105.     Try
  106.         Reset(MyFile);
  107.     Except
  108.         IsFileReadable := False;
  109.         WriteLn('Этот файл невозможно открыть для чтения.');
  110.     End;
  111.  
  112. End;
  113.  
  114. Function RequestFileNameForReading(Var MyFile: TextFile): String;
  115. Var
  116.     FileName: String;
  117.     IsCorrect: Boolean;
  118. Begin
  119.     Repeat
  120.         WriteLn('Введите имя файла с путём:');
  121.         ReadLn(FileName);
  122.         AssignFile(MyFile, FileName);
  123.         IsCorrect := IsFileExists(FileName) And IsFileTxt(FileName) And IsFileReadable(MyFile) And IsFileNotEmpty(MyFile);
  124.     Until IsCorrect;
  125.     RequestFileNameForReading := FileName;
  126. End;
  127.  
  128. Function RequestFileNameForWriting(Var MyFile: TextFile): String;
  129. Var
  130.     FileName: String;
  131.     IsCorrect: Boolean;
  132. Begin
  133.     Repeat
  134.         WriteLn('Введите имя файла с путём: ');
  135.         ReadLn(FileName);
  136.         AssignFile(MyFile, FileName);
  137.         IsCorrect := IsFileExists(FileName) And IsFileTxt(FileName) And IsFileWritable(MyFile);
  138.     Until IsCorrect;
  139.     RequestFileNameForWriting := FileName;
  140. End;
  141.  
  142. Procedure CreateArray(N: Integer; Var Arr: TArray);
  143. Var
  144.     I: Integer;
  145.     IsCorrect: Boolean;
  146. Begin
  147.     SetLength(Arr, N);
  148.     For I := 0 To High(Arr) Do
  149.     Begin
  150.         Repeat
  151.             IsCorrect := True;
  152.             Write('Введите ', I + 1, ' элемент массива: ');
  153.             Try
  154.                 ReadLn(Arr[I]);
  155.             Except
  156.                 IsCorrect := False;
  157.                 WriteLn('Некорректный ввод. Введите число.');
  158.             End;
  159.  
  160.             If IsCorrect And (((Arr[I] < MIN_A) Or (Arr[I] > MAX_A)) Or ((I > 0) And (Arr[I] < Arr[I - 1]))) Then
  161.             Begin
  162.                 WriteLn('Некорректный ввод данных. Массив должен быть упорядочен по возрастанию.', #13#10, 'Диапазон значений от ', MIN_A,
  163.                     ' до ', MAX_A, '. ');
  164.                 IsCorrect := False;
  165.             End;
  166.  
  167.         Until IsCorrect;
  168.     End;
  169. End;
  170.  
  171. Function InputSizeFromFile(Var Size: Integer; Var MyFile: TextFile): Boolean;
  172. Var
  173.     IsCorrect: Boolean;
  174. Begin
  175.     IsCorrect := True;
  176.     Size := 0;
  177.     Try
  178.         ReadLn(MyFile, Size);
  179.     Except
  180.         Writeln('Ошибка в строке с размером. Некорректный размер массива.');
  181.         IsCorrect := False;
  182.     End;
  183.  
  184.     If IsCorrect And ((Size < MIN_SIZE) Or (Size > MAX_SIZE)) Then
  185.     Begin
  186.         Writeln('Размер не входит в диапазон от ', MIN_SIZE, ' до ', MAX_SIZE, '.');
  187.         IsCorrect := False;
  188.     End;
  189.     InputSizeFromFile := IsCorrect;
  190. End;
  191.  
  192. Function ReadArray(Var MyFile: TextFile; Var Arr: TArray; Const Size: Integer): Boolean;
  193. Var
  194.     I: Integer;
  195.     IsCorrect: Boolean;
  196. Begin
  197.     SetLength(Arr, Size);
  198.     IsCorrect := True;
  199.     Try
  200.         For I := 0 To High(Arr) Do
  201.         Begin
  202.             Read(MyFile, Arr[I]);
  203.             If (Arr[I] < MIN_A) Or (Arr[I] > MAX_A) Then
  204.                 IsCorrect := False;
  205.         End;
  206.         If Not IsCorrect Then
  207.             WriteLn('Элементы массива выходят за диапазон допустимых значений.');
  208.     Except
  209.         Writeln('Непредвиденная ошибка. Проверьте корректность данных.');
  210.         IsCorrect := False;
  211.     End;
  212.     ReadArray := IsCorrect;
  213. End;
  214.  
  215. Function IsArrayIncreasing(Arr: TArray): Boolean;
  216. Var
  217.     I: Integer;
  218.     IsIncreasing: Boolean;
  219. Begin
  220.     IsIncreasing := True;
  221.     For I := 1 To High(Arr) Do
  222.     Begin
  223.         If Arr[I] < Arr[I - 1] Then
  224.         Begin
  225.             IsIncreasing := False;
  226.         End;
  227.     End;
  228.     If Not IsIncreasing Then
  229.         WriteLn('Массивы должны быть упорядочены по возрастанию.');
  230.     IsArrayIncreasing := IsIncreasing;
  231. End;
  232.  
  233. Function InputArgumentsFromFileForArrA(Var MyFile: TextFile; Const Path: String; Var N: Integer; Var Arr: TArray): Boolean;
  234. Var
  235.     IsCorrect: Boolean;
  236. Begin
  237.     IsCorrect := True;
  238.     Try
  239.         Try
  240.             Reset(MyFile);
  241.         Except
  242.             WriteLn('Непредвиденная ошибка');
  243.             IsCorrect := False;
  244.         End;
  245.         If IsCorrect Then
  246.         Begin
  247.             IsCorrect := InputSizeFromFile(N, MyFile);
  248.             If IsCorrect Then
  249.             Begin
  250.                 ReadLn(MyFile);
  251.                 IsCorrect := ReadArray(MyFile, Arr, N);
  252.                 If IsCorrect Then
  253.                     IsCorrect := IsArrayIncreasing(Arr);
  254.             End;
  255.         End;
  256.     Finally
  257.         CloseFile(MyFile);
  258.     End;
  259.     InputArgumentsFromFileForArrA := IsCorrect;
  260. End;
  261.  
  262. Function InputArgumentsFromFileForArrB(Var MyFile: TextFile; Const Path: String; Var N: Integer; Var Arr: TArray): Boolean;
  263. Var
  264.     IsCorrect: Boolean;
  265. Begin
  266.     IsCorrect := True;
  267.     Try
  268.         Try
  269.             Reset(MyFile);
  270.         Except
  271.             WriteLn('Непредвиденная ошибка');
  272.             IsCorrect := False;
  273.         End;
  274.         If IsCorrect Then
  275.         Begin
  276.             ReadLn(MyFile);
  277.             IsCorrect := InputSizeFromFile(N, MyFile);
  278.             If IsCorrect Then
  279.             Begin
  280.                 ReadLn(MyFile);
  281.                 IsCorrect := ReadArray(MyFile, Arr, N);
  282.                 If IsCorrect Then
  283.                     IsCorrect := IsArrayIncreasing(Arr);
  284.             End;
  285.         End;
  286.     Finally
  287.         CloseFile(MyFile);
  288.     End;
  289.     InputArgumentsFromFileForArrB := IsCorrect;
  290. End;
  291.  
  292. Function CountSizeOfArrC(ArrA: TArray; ArrB: TArray): Integer;
  293. Var
  294.     I, J, Count: Integer;
  295. Begin
  296.     Count := 0;
  297.     J := 0;
  298.     For I := 0 To High(ArrA) Do
  299.     Begin
  300.         If (I = 0) Or (ArrA[I] <> ArrA[I - 1]) Then
  301.         Begin
  302.             While (J <= High(ArrB)) And (ArrB[J] < ArrA[I]) Do
  303.             Begin
  304.                 If (J = 0) Or (ArrB[J] <> ArrB[J - 1]) Then
  305.                     Inc(Count);
  306.                 Inc(J);
  307.             End;
  308.             If (J > High(ArrB)) Or (ArrA[I] <> ArrB[J]) Then
  309.                 Inc(Count);
  310.         End;
  311.     End;
  312.     For J := J To High(ArrB) Do
  313.     Begin
  314.  
  315.         If (J = 0) Or (ArrB[J] <> ArrB[J - 1]) Then
  316.             Inc(Count);
  317.     End;
  318.     CountSizeOfArrC := Count;
  319. End;
  320.  
  321. Procedure MergeArrays(Var ArrA: TArray; Var ArrB: TArray; Var ArrC: TArray; Const K: Integer);
  322. Var
  323.     I, J, Index: Integer;
  324. Begin
  325.     Index := 0;
  326.     J := 0;
  327.     I := 0;
  328.     SetLength(ArrC, K);
  329.     While (I <= High(ArrA)) And (J <= High(ArrB)) Do
  330.     Begin
  331.         If ArrA[I] < ArrB[J] Then
  332.         Begin
  333.             If (Index = 0) Or (ArrC[Index - 1] <> ArrA[I]) Then
  334.             Begin
  335.                 ArrC[Index] := ArrA[I];
  336.                 Inc(Index);
  337.             End;
  338.             Inc(I);
  339.         End
  340.         Else
  341.             If ArrA[I] > ArrB[J] Then
  342.             Begin
  343.                 If (Index = 0) Or (ArrC[Index - 1] <> ArrB[J]) Then
  344.                 Begin
  345.                     ArrC[Index] := ArrB[J];
  346.                     Inc(Index);
  347.                 End;
  348.                 Inc(J);
  349.             End
  350.             Else
  351.             Begin
  352.                 If (Index = 0) Or (ArrC[Index - 1] <> ArrA[I]) Then
  353.                 Begin
  354.                     ArrC[Index] := ArrA[I];
  355.                     Inc(Index);
  356.                 End;
  357.                 Inc(I);
  358.                 Inc(J);
  359.             End;
  360.     End;
  361.     While I <= High(ArrA) Do
  362.     Begin
  363.         If (Index = 0) Or (ArrC[Index - 1] <> ArrA[I]) Then
  364.         Begin
  365.             ArrC[Index] := ArrA[I];
  366.             Inc(Index);
  367.         End;
  368.         Inc(I);
  369.     End;
  370.     While J <= High(ArrB) Do
  371.     Begin
  372.         If (Index = 0) Or (ArrC[Index - 1] <> ArrB[J]) Then
  373.         Begin
  374.             ArrC[Index] := ArrB[J];
  375.             Inc(Index);
  376.         End;
  377.         Inc(J);
  378.     End;
  379. End;
  380.  
  381. Procedure PrintToConsole(Const Arr: TArray);
  382. Var
  383.     I: Integer;
  384. Begin
  385.     For I := 0 To High(Arr) Do
  386.         Write(Arr[I], ' ');
  387. End;
  388.  
  389. Function PrintToFile(Var MyFile: TextFile; Const Arr: TArray): Boolean;
  390. Var
  391.     I: Integer;
  392.     IsCorrect: Boolean;
  393. Begin
  394.     IsCorrect := True;
  395.     Try
  396.         Try
  397.             Rewrite(MyFile);
  398.             For I := 0 To High(Arr) Do
  399.                 Write(MyFile, Arr[I], ' ');
  400.             WriteLn('Результат выведен в файле.');
  401.         Except
  402.             WriteLn('Непредвиденная ошибка.');
  403.             IsCorrect := False;
  404.         End;
  405.     Finally
  406.         CloseFile(MyFile);
  407.     End;
  408.     PrintToFile := IsCorrect;
  409. End;
  410.  
  411. Var
  412.     N, M, K, Choice: Integer;
  413.     IsCorrect: Boolean;
  414.     ArrA, ArrB, ArrC: TArray;
  415.     MyFile: TextFile;
  416.     MyFileName: String;
  417.  
  418. Begin
  419.     N := 0;
  420.     WriteLn('Данная программа выполняет слияние двух упорядоченных по возрастанию массивов целых чисел в один упорядоченный массив (без повторений).',
  421.         #13#10, 'Диапазон размеров массивов: ', MIN_SIZE, '...', MAX_SIZE, #13#10, 'Диапазон для значений элементов массива: ', MIN_A,
  422.         '...', MAX_A, #13#10, 'При работе с файлом в нём сначала должны быть прописаны размеры массивов, а затем сами массивы.', #13#10,
  423.         'Откуда Вы хотите вводить данные?', #13#10, '1 - консоль, 2 - файл.');
  424.     Choice := InputInteger(MIN_C, MAX_C);
  425.     If (Choice = 1) Then
  426.     Begin
  427.         WriteLn('Введите размер массива A.');
  428.         N := InputInteger(MIN_SIZE, MAX_SIZE);
  429.         CreateArray(N, ArrA);
  430.         WriteLn('Введите размер массива B.');
  431.         M := InputInteger(MIN_SIZE, MAX_SIZE);
  432.         CreateArray(M, ArrB);
  433.     End
  434.     Else
  435.     Begin
  436.         Repeat
  437.             MyFileName := RequestFileNameForReading(MyFile);
  438.             IsCorrect := InputArgumentsFromFileForArrA(MyFile, MyFileName, N, ArrA) And
  439.                 InputArgumentsFromFileForArrB(MyFile, MyFileName, M, ArrB);
  440.         Until IsCorrect;
  441.     End;
  442.     K := CountSizeOfArrC(ArrA, ArrB);
  443.     MergeArrays(ArrA, ArrB, ArrC, K);
  444.     WriteLn('Куда Вы хотите выводить результат?', #13#10, '1 - консоль, 2 - файл.');
  445.     Choice := InputInteger(MIN_C, MAX_C);
  446.     If (Choice = 1) Then
  447.     Begin
  448.         PrintToConsole(ArrC);
  449.     End
  450.     Else
  451.     Begin
  452.         Repeat
  453.             MyFileName := RequestFileNameForWriting(MyFile);
  454.             IsCorrect := PrintToFile(MyFile, ArrC);
  455.         Until IsCorrect;
  456.     End;
  457.     ReadLn;
  458.  
  459. End.
Advertisement
Add Comment
Please, Sign In to add comment