HunteryS

Laba3_3

Nov 21st, 2024
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.58 KB | None | 0 0
  1. Program Lab3_3;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TMatrix = Array of Array of Integer;
  8.  
  9. Procedure PrintCondition();
  10. Begin
  11.     Writeln('Программа сортирует двумерный массив по количеству делителей каждого элемента.');
  12. End;
  13.  
  14. Function ReadNum(Min, Max: Integer): Integer;
  15. Var
  16.     Num: Integer;
  17.     IsCorrect: Boolean;
  18. Begin
  19.     Repeat
  20.         IsCorrect := True;
  21.         Try
  22.             Readln(Num);
  23.         Except
  24.             Write('Некорректный ввод! ');
  25.             IsCorrect := False;
  26.         End;
  27.         If (IsCorrect) And ((Num < Min) Or (Num > Max)) Then
  28.         Begin
  29.             Write('Недопустимое значение! ');
  30.             IsCorrect := False;
  31.         End;
  32.     Until IsCorrect;
  33.     ReadNum := Num;
  34. End;
  35.  
  36. Function ReadMatrixRows(): Integer;
  37. Var
  38.     Rows: Integer;
  39.     IsCorrect: Boolean;
  40. Begin
  41.     Repeat
  42.         IsCorrect := True;
  43.         Write('Введите количество строк матрицы(от 2 до 10): ');
  44.         Try
  45.             Readln(Rows);
  46.         Except
  47.             Writeln('Некорректный ввод!');
  48.             IsCorrect := False;
  49.         End;
  50.  
  51.         If (IsCorrect) And ((Rows < 2) Or (Rows > 10 )) Then
  52.         Begin
  53.             Writeln('Недопустимое значение! ');
  54.             IsCorrect := False;
  55.         End;
  56.     Until IsCorrect;
  57.     ReadMatrixRows := Rows;
  58. End;
  59.  
  60. Function ReadMatrixCols(): Integer;
  61. Var
  62.     Cols: Integer;
  63.     IsCorrect: Boolean;
  64. Begin
  65.     Repeat
  66.         IsCorrect := True;
  67.         Write('Введите количество столбцов матрицы(от 2 до 10): ');
  68.         Try
  69.             Readln(Cols);
  70.         Except
  71.             Writeln('Некорректный ввод! Введите значение ещё раз:');
  72.             IsCorrect := False;
  73.         End;
  74.  
  75.         If (IsCorrect) And ((Cols < 2) Or (Cols > 10 )) Then
  76.         Begin
  77.             Write('Недопустимое значение! Введите значение ещё раз: ');
  78.             IsCorrect := False;
  79.         End;
  80.     Until IsCorrect;
  81.     ReadMatrixCols := Cols;
  82. End;
  83.  
  84. Function CountDivisors(N: Integer): Integer;
  85. Var
  86.     Count, I: Integer;
  87. Begin
  88.     Count := 0;
  89.     For I := 1 To N Do
  90.         If N Mod I = 0 Then
  91.             Count := Count + 1;
  92.     CountDivisors := Count;
  93. End;
  94.  
  95. Procedure SortMatrixByDivisors(Var Matrix: TMatrix; Rows, Cols: Integer);
  96. Var
  97.     I, J, K, L, Temp: Integer;
  98. Begin
  99.     For I := 0 To Rows - 1 Do
  100.         For J := 0 To Cols - 1 Do
  101.             For K := 0 To Rows - 1 Do
  102.                 For L := 0 To Cols - 1 Do
  103.                     If CountDivisors(Matrix[I, J]) < CountDivisors(Matrix[K, L]) Then
  104.                     Begin
  105.                         Temp := Matrix[I, J];
  106.                         Matrix[I, J] := Matrix[K, L];
  107.                         Matrix[K, L] := Temp;
  108.                     End;
  109. End;
  110.  
  111. Procedure FillMatrixFromKeyboard(Var Matrix: TMatrix; Rows, Cols: Integer);
  112. Var
  113.     I, J: Integer;
  114.     IsCorrect: Boolean;
  115. Begin
  116.     SetLength(Matrix, Rows, Cols);
  117.     For I := 0 To Rows - 1 Do
  118.     Begin
  119.         For J := 0 To Cols - 1 Do
  120.         Begin
  121.             Write('Введите элемент [', I + 1, ',', J + 1, ']: ');
  122.             Repeat
  123.                 IsCorrect := True;
  124.                 Try
  125.                     Readln(Matrix[I][J]);
  126.                 Except
  127.                     IsCorrect := False;
  128.                 End;
  129.  
  130.                 If (Not IsCorrect) Or (Matrix[I][J] < 1) Or (Matrix[I][J] > 10000) Then
  131.                 Begin
  132.                     IsCorrect := False;
  133.                     Writeln('Некорректное значение! Введите натуральное число от 1 до 10000.');
  134.                 End;
  135.             Until IsCorrect;
  136.         End;
  137.     End;
  138.  
  139.  
  140. End;
  141.  
  142. Function CheckFile(Path: String): Boolean;
  143. Var
  144.     IsFileCorrect: Boolean;
  145.     InputFile: TextFile;
  146.     MatrixRows, MatrixCols, I, J, TempValue: Integer;
  147.     Matrix: TMatrix;
  148. Begin
  149.     IsFileCorrect := True;
  150.     If FileExists(Path) Then
  151.     Begin
  152.         AssignFile(InputFile, Path);
  153.         If (ExtractFileExt(Path) = '.txt') Then
  154.         Begin
  155.             IsFileCorrect := True;
  156.             Try
  157.                 Reset(InputFile);
  158.             Except
  159.                 Writeln('Не удалось открыть файл!');
  160.                 IsFileCorrect := False;
  161.             End;
  162.  
  163.             If IsFileCorrect Then
  164.             Begin
  165.                 Try
  166.                     Readln(InputFile, MatrixRows);
  167.                     Readln(InputFile, MatrixCols);
  168.                 Except
  169.                     Writeln('Ошибка при чтении данных матрицы!');
  170.                     IsFileCorrect := False;
  171.                 End;
  172.                 If IsFileCorrect And ((MatrixRows < 2) Or (MatrixRows > 10) Or (MatrixCols < 2) Or (MatrixCols > 10)) Then
  173.                 Begin
  174.                     Writeln('Размеры матрицы выходят за допустимые пределы (от 2 до 10 строк и столбцов)');
  175.                     IsFileCorrect := False;
  176.                 End;
  177.  
  178.                 SetLength(Matrix, MatrixRows, MatrixCols);
  179.  
  180.                 For I := 0 To MatrixRows - 1 Do
  181.                 Begin
  182.                     For J := 0 To MatrixCols - 1 Do
  183.                     Begin
  184.                         If EOF(InputFile) Then
  185.                         Begin
  186.                             If IsFileCorrect Then
  187.                                 Writeln('Ошибка: файл закончился раньше, чем были считаны все элементы матрицы.');
  188.                             IsFileCorrect := False;
  189.                             Break;
  190.                         End;
  191.                         Try
  192.                             Read(InputFile, TempValue);
  193.                         Except
  194.                             Writeln('Ошибка при чтении элементов матрицы!');
  195.                             IsFileCorrect := False;
  196.                         End;
  197.  
  198.                         If (TempValue < 1) Or (TempValue > 10000) Then
  199.                         Begin
  200.                             If IsFileCorrect Then
  201.                                 Writeln('Ошибка: элемент матрицы [', I + 1, ',', J + 1, '] имеет недопустимое значение (допустимый диапазон: 1–10000).');
  202.                             IsFileCorrect := False;
  203.                         End;
  204.  
  205.                         Matrix[I][J] := TempValue;
  206.                     End;
  207.                 End;
  208.             End;
  209.  
  210.             Try
  211.                 CloseFile(InputFile);
  212.             Except
  213.             End;
  214.         End
  215.         Else
  216.         Begin
  217.             IsFileCorrect := False;
  218.             Writeln('Файл не является текстовым (.txt)!');
  219.         End;
  220.     End
  221.     Else
  222.     Begin
  223.         Writeln('Файл по данному пути не существует!');
  224.         IsFileCorrect := False;
  225.     End;
  226.     CheckFile := IsFileCorrect;
  227. End;
  228.  
  229.  
  230. Procedure FillMatrixFromFile(Var Matrix: TMatrix; Var Rows, Cols: Integer);
  231. Var
  232.     PathFile: String;
  233.     InputFile: TextFile;
  234.     I, J: Integer;
  235. Begin
  236.     Writeln('Данные в файле должны содержать:'#10' 1) Количество строк матрицы (целое число)'#10' 2) Количество столбцов матрицы (целое число)'#10' 3) Элементы матрицы построчно.');
  237.     Repeat
  238.         Write('Введите путь к файлу с его расширением: ');
  239.         Readln(PathFile);
  240.     Until CheckFile(PathFile);
  241.  
  242.     AssignFile(InputFile, PathFile);
  243.     Reset(InputFile);
  244.     Writeln('Матрица успешно считана из файла.');
  245.  
  246.     CloseFile(InputFile);
  247.  
  248. End;
  249.  
  250.  
  251. Function InputMatrix(Var Rows, Cols: Integer): TMatrix;
  252. Var
  253.     Matrix: TMatrix;
  254.     Choice: Integer;
  255.     Path: String;
  256. Begin
  257.     Write('Выберите способ ввода:', #10, '1. Ввод с консоли', #10, '2. Ввод из файла', #10, 'Ваш выбор: ');
  258.     Choice := ReadNum(1, 2);
  259.  
  260.     If Choice = 1 Then
  261.     Begin
  262.         Rows := ReadMatrixRows();
  263.         Cols := ReadMatrixCols();
  264.         FillMatrixFromKeyboard(Matrix, Rows, Cols);
  265.     End
  266.     Else
  267.     Begin
  268.         FillMatrixFromFile(Matrix, Rows, Cols);
  269.     End;
  270.     InputMatrix := Matrix;
  271. End;
  272.  
  273. Procedure PrintMatrix(Matrix: TMatrix; Rows, Cols: Integer);
  274. Var
  275.     I, J: Integer;
  276. Begin
  277.     Writeln('Отсортированная матрица:');
  278.     For I := 0 To Rows - 1 Do
  279.     Begin
  280.         For J := 0 To Cols - 1 Do
  281.             Write(Matrix[I, J]:8);
  282.         Writeln;
  283.     End;
  284. End;
  285.  
  286. Procedure SaveMatrixToFile(Matrix: TMatrix; Rows, Cols: Integer);
  287. Var
  288.     Path: String;
  289.     OutputFile: TextFile;
  290.     I, J: Integer;
  291.     IsPathCorrect : Boolean;
  292. Begin
  293.     Repeat
  294.     IsPathCorrect := True;
  295.     Write('Введите путь для сохранения файла: ');
  296.     Readln(Path);
  297.     AssignFile(OutputFile, Path);
  298.  
  299.     If (ExtractFileExt(Path) = '.txt') Then
  300.     Begin
  301.         Try
  302.             Rewrite(OutputFile);
  303.         Except
  304.             Writeln('Не удалось вывести в Файл');
  305.             IsPathCorrect := False;
  306.         End;
  307.     End
  308.     Else
  309.     Begin
  310.         IsPathCorrect := False;
  311.         Writeln('Файл не типа txt!');
  312.     End;
  313.     Until IsPathCorrect;
  314.  
  315.     For I := 0 To Rows - 1 Do
  316.     Begin
  317.         For J := 0 To Cols - 1 Do
  318.             Write(OutputFile, Matrix[I, J]:5);
  319.         Writeln(OutputFile);
  320.     End;
  321.     CloseFile(OutputFile);
  322.     Writeln('Матрица успешно сохранена в файл.');
  323. End;
  324.  
  325. Procedure OutputMatrix(Matrix: TMatrix; Rows, Cols: Integer);
  326. Var
  327.     Choice: Integer;
  328.     Path: String;
  329.     OutputFile: TextFile;
  330.     I, J: Integer;
  331. Begin
  332.     Write('Выберите способ вывода:', #10, '1. Вывод в консоль', #10, '2. Сохранение в файл', #10, 'Ваш выбор: ');
  333.     Choice := ReadNum(1, 2);
  334.  
  335.     If Choice = 1 Then
  336.     Begin
  337.         PrintMatrix(Matrix, Rows, Cols);
  338.     End
  339.     Else
  340.     Begin
  341.         SaveMatrixToFile(Matrix, Rows, Cols);
  342.     End;
  343.  
  344. End;
  345.  
  346. Var
  347.     Rows, Cols: Integer;
  348.     Matrix: TMatrix;
  349. Begin
  350.     PrintCondition();
  351.     Matrix := InputMatrix(Rows, Cols);
  352.     SortMatrixByDivisors(Matrix, Rows, Cols);
  353.     OutputMatrix(Matrix, Rows, Cols);
  354.     Readln;
  355. End.
  356.  
Advertisement
Add Comment
Please, Sign In to add comment