HunteryS

Untitled

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