HunteryS

Laba3_3 concept

Nov 18th, 2024
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.39 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(Min: Integer): Integer;
  37. Var
  38.     Rows, Cols : 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(Min: Integer): Integer;
  61. Var
  62.     Rows, 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 ((Rows < 2) Or (Rows > 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 High(Rows) Do
  100.         For J := 0 To High(Cols) Do
  101.             For K := 0 To High(Rows) Do
  102.                 For L := 0 To High(Cols) 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.     Temp1, Temp2 : Integer;
  116. Begin
  117.     Rows := ReadMatrixRows(Rows);
  118.     Cols :=  ReadMatrixCols(Cols);
  119.     SetLength(Matrix, Rows, Cols);
  120.  
  121.     Temp1 := Rows - 1;
  122.     Temp2 := Cols - 1;
  123.     For I := 0 To Temp1 Do
  124.     Begin
  125.         For J := 0 To Temp2 Do
  126.         Begin
  127.             Write('Введите элемент [', I + 1, ',', J + 1, ']: ');
  128.             Repeat
  129.                 IsCorrect := True;
  130.                 Try
  131.                     Readln(Matrix[I][J]);
  132.                 Except
  133.                     IsCorrect := False;
  134.                 End;
  135.  
  136.                 // Проверка корректности введенного числа
  137.                 If (Not IsCorrect) Or (Matrix[I][J] < 1) Or (Matrix[I][J] > 10000) Then
  138.                 Begin
  139.                     IsCorrect := False;
  140.                     Writeln('Некорректное значение! Введите натуральное число от 1 до 10000.');
  141.                 End;
  142.             Until IsCorrect;
  143.         End;
  144.     End;
  145. End;
  146.  
  147.  
  148. Function CheckFile(Path: String): Boolean;
  149. Var
  150.     IsFileCorrect: Boolean;
  151.     InputFile: TextFile;
  152.     Line: String;
  153.     MatrixRows, MatrixCols: Integer;
  154.     TempValue, I, J: Integer;
  155. Begin
  156.     IsFileCorrect := True;
  157.  
  158.     If FileExists(Path) Then
  159.     Begin
  160.         AssignFile(InputFile, Path);
  161.  
  162.         If (ExtractFileExt(Path) = '.txt') Then
  163.         Begin
  164.             IsFileCorrect := True;
  165.             Try
  166.                 Reset(InputFile);
  167.             Except
  168.                 Writeln('Не удалось открыть файл!');
  169.                 IsFileCorrect := False;
  170.             End;
  171.  
  172.             If IsFileCorrect Then
  173.             Begin
  174.                 Try
  175.                     Readln(InputFile, MatrixRows);
  176.                     Readln(InputFile, MatrixCols);
  177.                 Except
  178.                     Writeln('Ошибка при чтении данных матрицы!');
  179.                     IsFileCorrect := False;
  180.                 End;
  181.  
  182.                 If IsFileCorrect And ((MatrixRows < 2) Or (MatrixRows > 10) Or (MatrixCols < 2) Or (MatrixCols > 10)) Then
  183.                 Begin
  184.                     Writeln('Размеры матрицы выходят за допустимые пределы (от 2 до 10 строк и столбцов)');
  185.                     IsFileCorrect := False;
  186.                 End;
  187.  
  188.                 If IsFileCorrect And (Not Eof(InputFile)) Then
  189.                 Begin
  190.                     Writeln('Файл содержит лишние данные после матрицы!');
  191.                     IsFileCorrect := False;
  192.                 End;
  193.             End;
  194.  
  195.             Try
  196.                 CloseFile(InputFile);
  197.             Except
  198.             End;
  199.  
  200.         End
  201.         Else
  202.         Begin
  203.             IsFileCorrect := False;
  204.             Writeln('Файл не является текстовым (.txt)!');
  205.         End;
  206.     End
  207.     Else
  208.     Begin
  209.         Writeln('Файл по данному пути не существует!');
  210.         IsFileCorrect := False;
  211.     End;
  212.  
  213.     CheckFile := IsFileCorrect;
  214. End;
  215.  
  216.  
  217.  
  218.  
  219. Procedure FillMatrixFromFile(Var Matrix: TMatrix; Rows, Cols: Integer; FilePath: String);
  220. Var
  221.     InputFile: TextFile;
  222.     I, J: Integer;
  223.     IsCorrect: Boolean;
  224.     PathFile : String;
  225. Begin
  226.     SetLength(Matrix, Rows, Cols);
  227.      Repeat
  228.         Write('Введите путь к файлу с его расширением: ');
  229.         Readln(PathFile);
  230.     Until CheckFile(PathFile);
  231.  
  232.     AssignFile(InputFile, FilePath);
  233.     Reset(InputFile);
  234.  
  235.     For I := 0 To High(Rows) Do
  236.     Begin
  237.         For J := 0 To High(Cols) Do
  238.         Begin
  239.             Repeat
  240.                 IsCorrect := True;
  241.                 Try
  242.                     Read(InputFile, Matrix[I][J]);
  243.                 Except
  244.                     IsCorrect := False;
  245.                 End;
  246.  
  247.                 If (Not IsCorrect) Or (Matrix[I][J] < 1) Or (Matrix[I][J] > 10000) Then
  248.                 Begin
  249.                     IsCorrect := False;
  250.                     Writeln('Ошибка: элемент матрицы [', I + 1, ',', J + 1, '] некорректен. Введите натуральное число от 1 до 10000.');
  251.                 End;
  252.             Until IsCorrect;
  253.         End;
  254.     End;
  255.  
  256.     CloseFile(InputFile);
  257. End;
  258.  
  259.  
  260. Function InputMatrix(Var Rows, Cols: Integer): TMatrix;
  261. Var
  262.     Matrix: TMatrix;
  263.     Choice: Integer;
  264.     Path: String;
  265.     InputFile: TextFile;
  266.     I, J: Integer;
  267. Begin
  268.     Write('Выберите способ ввода:', #10, '1. Ввод с консоли', #10, '2. Ввод из файла', #10, 'Ваш выбор: ');
  269.     Choice := ReadNum(1, 2);
  270.  
  271.     If Choice = 1 Then
  272.     Begin
  273.         FillMatrixFromKeyboard(Matrix, Rows, Cols);
  274.     End
  275.     Else
  276.     Begin
  277.         FillMatrixFromFile(Matrix, Rows, Cols, Path);
  278.     End;
  279.     InputMatrix := Matrix;
  280. End;
  281.  
  282. Procedure OutputMatrix(Matrix: TMatrix; Rows, Cols: Integer);
  283. Var
  284.     Choice: Integer;
  285.     Path: String;
  286.     OutputFile: TextFile;
  287.     I, J: Integer;
  288. Begin
  289.     Write('Выберите способ вывода:', #10, '1. Вывод в консоль', #10, '2. Сохранение в файл', #10, 'Ваш выбор: ');
  290.     Choice := ReadNum(1, 2);
  291.  
  292.     If Choice = 1 Then
  293.     Begin
  294.         Writeln('Отсортированная матрица:');
  295.         For I := 0 To High(Rows) Do
  296.         Begin
  297.             For J := 0 To High(Cols) Do
  298.                 Write(Matrix[I, J]:5);
  299.             Writeln;
  300.         End;
  301.     End
  302.     Else
  303.     Begin
  304.         Write('Введите путь для сохранения файла: ');
  305.         Readln(Path);
  306.         AssignFile(OutputFile, Path);
  307.         Rewrite(OutputFile);
  308.         For I := 0 To High(Rows) Do
  309.         Begin
  310.             For J := 0 To High(Cols) Do
  311.                 Write(OutputFile, Matrix[I, J]:5);
  312.             Writeln(OutputFile);
  313.         End;
  314.         CloseFile(OutputFile);
  315.         Writeln('Матрица успешно сохранена в файл.');
  316.     End;
  317. End;
  318.  
  319. Var
  320.     Rows, Cols: Integer;
  321.     Matrix: TMatrix;
  322. Begin
  323.     PrintCondition();
  324.     Matrix := InputMatrix(Rows, Cols);
  325.     SortMatrixByDivisors(Matrix, Rows, Cols);
  326.     OutputMatrix(Matrix, Rows, Cols);
  327.     Readln;
  328. End.
  329.  
Advertisement
Add Comment
Please, Sign In to add comment