Advertisement
anticlown

laba.2.4.(Delphi)

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