Advertisement
ksyshshot

Lab.2.3

Nov 7th, 2022 (edited)
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.15 KB | Source Code | 0 0
  1. Program Lab_2_3;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R *.res}
  5.  
  6. Uses
  7.   System.SysUtils;
  8.  
  9. Type
  10.     TMatrix = Array Of Array Of Integer;
  11.     TArr = Array Of Integer;
  12.  
  13. Var
  14.     Choice, Answer: Integer;
  15.     Matrix: TMatrix;
  16.  
  17. Procedure WriteTask();
  18. Begin
  19.     Writeln('Данная программа вычисляет норму матрицы.');
  20. End;
  21.  
  22. Function TakeMatrixOrderFromConsole(): Integer;
  23. Const
  24.     MAX_ORDER = 10;
  25.     MIN_ORDER = 2;
  26. Var
  27.     Order: Integer;
  28.     IsCorrect: Boolean;
  29. Begin
  30.     Repeat
  31.         IsCorrect := True;
  32.         Write('Введите порядок квадратной матрицы: ');
  33.         Try
  34.             Readln(Order);
  35.         Except
  36.             Writeln('Введено некорректное значение. Повторите попытку...');
  37.             IsCorrect := False;
  38.         End;
  39.         If ((IsCorrect) And ((Order < MIN_ORDER) Or (Order > MAX_ORDER))) Then
  40.         Begin
  41.             IsCorrect := False;
  42.             Writeln('Введённое число не входит в допустимый диапазон. Повторите попытку...');
  43.         End;
  44.     Until (IsCorrect);
  45.     TakeMatrixOrderFromConsole := Order;
  46. End;
  47.  
  48. Function CreateMatrixFromConsole(): TMatrix;
  49. Const
  50.     MIN_ELEMENT = -2147483648;
  51.     MAX_ELEMENT = 2147483647;
  52. Var
  53.     Matrix: TMatrix;
  54.     I, J, Order: Integer;
  55.     IsCorrect: Boolean;
  56. Begin
  57.     Order := TakeMatrixOrderFromConsole();
  58.     SetLength(Matrix, Order, Order);
  59.     For I := 0 To High(Matrix) Do
  60.         For J := 0 To High(Matrix) Do
  61.             Repeat
  62.                 Write('Введите элемент ', (I + 1), ' строки ', (J + 1), ' столбца матрицы: ');
  63.                 IsCorrect := True;
  64.                 Try
  65.                     Readln(Matrix[I][J]);
  66.                 Except
  67.                     Writeln('Введено некорректное значение. Повторите попытку...');
  68.                     IsCorrect := False;
  69.                 End;
  70.                 If ((IsCorrect) And ((Matrix[I][J] < MIN_ELEMENT) Or (Matrix[I][J] > MAX_ELEMENT))) Then
  71.                 Begin
  72.                     IsCorrect := False;
  73.                     Writeln('Введённое значение не входит в допустимый диапазон. Повторите попытку...');
  74.                 End;
  75.             Until (IsCorrect);
  76.     CreateMatrixFromConsole := Matrix;
  77. End;
  78.  
  79. Procedure OutputMatrixInConsole(Matrix: TMatrix);
  80. Var
  81.     I, J: Integer;
  82. Begin
  83.     For I := 0 To High(Matrix) Do
  84.     Begin
  85.         For J := 0 To High(Matrix) Do
  86.             Write(Matrix[I][J], ' ');
  87.         Writeln;
  88.     End;
  89. End;
  90.  
  91. Function TakePathToFile(): String;
  92. Var
  93.     Path: String;
  94.     IsCorrect: Boolean;
  95.     F: TextFile;
  96. Begin
  97.     Repeat
  98.         IsCorrect := True;
  99.         Write('Введите путь к файлу: ');
  100.         Readln(Path);
  101.         AssignFile(F, Path);
  102.         If (Not(FileExists(Path))) Then
  103.         Begin
  104.             IsCorrect := False;
  105.             Writeln('Не удалось найти файл по заданному пути. Повторите попытку...');
  106.         End;
  107.     Until (IsCorrect);
  108.     TakePathToFile := Path;
  109. End;
  110.  
  111. Function TakeMatrixFromFile(): TMatrix;
  112. Const
  113.     MAX_ORDER = 10;
  114.     MIN_ORDER = 2;
  115.     MAX_ELEMENT = 2147483647;
  116.     MIN_ELEMENT = -2147483648;
  117. Var
  118.     Path: String;
  119.     Matrix: TMatrix;
  120.     F: TextFile;
  121.     IsCorrect: Boolean;
  122.     I, J, Order: Integer;
  123. Begin
  124.     Write('Требуется файл для чтения. ');
  125.     Path := TakePathToFile();
  126.     Repeat
  127.         Repeat
  128.             IsCorrect := True;
  129.             AssignFile(F, Path);
  130.             Try
  131.                 Reset(F);
  132.             Except
  133.                 Write('Не удалось открыть файл по заданному пути. ');
  134.                 IsCorrect := False;
  135.             End;
  136.             If (IsCorrect) Then
  137.             Begin
  138.                 Try
  139.                     Readln(F, Order);
  140.                 Except
  141.                     Write('Некорректный порядок матрицы. ');
  142.                     IsCorrect := False;
  143.                 End;
  144.                 If (IsCorrect) And ((Order < MIN_ORDER) Or (Order > MAX_ORDER)) Then
  145.                 Begin
  146.                     Write('Порядок матрицы не входит в допустимый диапазон. ');
  147.                     IsCorrect := False;
  148.                 End;
  149.             End;
  150.             If Not(IsCorrect) Then
  151.             Begin
  152.                 Writeln('Повторите попытку...');
  153.                 CloseFile(F);
  154.                 Path := TakePathToFile();
  155.             End;
  156.         Until (IsCorrect);
  157.         SetLength(Matrix, Order, Order);
  158.         I := 0;
  159.         While (IsCorrect) And (I < Order) Do
  160.         Begin
  161.             J := 0;
  162.             While (IsCorrect) And (J < Order) Do
  163.             Begin
  164.                 Try
  165.                     Read(F, Matrix[I][J]);
  166.                 Except
  167.                     Write('Найден некорректно введённый элемент матрицы. ');
  168.                     IsCorrect := False;
  169.                 End;
  170.                 If (IsCorrect) And ((Matrix[I][J] < MIN_ELEMENT) Or (Matrix[I][J] > MAX_ELEMENT)) Then
  171.                 Begin
  172.                     Write('Найден элемент матрицы, не входящий в допустимый диапазон. ');
  173.                     IsCorrect := False;
  174.                 End;
  175.                 Inc(J);
  176.             End;
  177.             Inc(I);
  178.         End;
  179.         If Not(IsCorrect) Then
  180.         Begin
  181.             Writeln('Повторите попытку...');
  182.             CloseFile(F);
  183.             Path := TakePathToFile();
  184.         End;
  185.     Until (IsCorrect);
  186.     CloseFile(F);
  187.     TakeMatrixFromFile := Matrix;
  188. End;
  189.  
  190. Function CalculateAbsSums(Matrix: TMatrix): TArr;
  191. Var
  192.     I, J, Sum: Integer;
  193.     AbsSums: TArr;
  194. Begin
  195.     SetLength(AbsSums, High(Matrix) + 1);
  196.     For I := 0 To High(Matrix) Do
  197.     Begin
  198.         Sum := 0;
  199.         For J := 0 To High(Matrix) Do
  200.             Sum := Sum + Abs(Matrix[I][J]);
  201.         AbsSums[I] := Sum;
  202.     End;
  203.     CalculateAbsSums := AbsSums;
  204. End;
  205.  
  206. Function FindMatrixNorm(Matrix: TMatrix): Integer;
  207. Var
  208.     Norm, I, J: Integer;
  209.     AbsSums: TArr;
  210. Begin
  211.     SetLength(AbsSums, High(Matrix) + 1);
  212.     AbsSums := CalculateAbsSums(Matrix);
  213.     Norm := AbsSums[0];
  214.     For I := 1 To High(Matrix) Do
  215.         If (AbsSums[I] > Norm) Then
  216.             Norm := AbsSums[I];
  217.     FindMatrixNorm := Norm;
  218. End;
  219.  
  220. Function ChooseInputOutputMethod(): Integer;
  221. Var
  222.     IsCorrect: Boolean;
  223.     Choice: Integer;
  224. Begin
  225.     Repeat
  226.         IsCorrect := True;
  227.         Try
  228.             Readln(Choice);
  229.         Except
  230.             Writeln ('Число введено некорректно. Повторите попытку...');
  231.             IsCorrect := False;
  232.         End;
  233.         If (IsCorrect) And (Choice <> 1) And (Choice <> 2) Then
  234.         Begin
  235.             Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
  236.             IsCorrect := False;
  237.         End;
  238.     Until (IsCorrect);
  239.     ChooseInputOutputMethod := Choice;
  240. End;
  241.  
  242. Procedure OutputAnswerInFile(Answer: Integer);
  243. Var
  244.     F: TextFile;
  245.     Path: String;
  246.     IsCorrect: Boolean;
  247. Begin
  248.     Write('Требуется файл для записи. ');
  249.     Path := TakePathToFile();
  250.     Repeat
  251.         IsCorrect := True;
  252.         AssignFile(F, Path);
  253.         Try
  254.             Rewrite(F);
  255.         Except
  256.             Write('Не удалось получить доступ к файлу. ');
  257.             IsCorrect := False;
  258.         End;
  259.         If (IsCorrect) Then
  260.         Begin
  261.             Write(F, 'Полученная норма матрицы: ');
  262.             Writeln(F, Answer);
  263.         End
  264.         Else
  265.         Begin
  266.             Writeln('Повторите попытку...');
  267.             CloseFile(F);
  268.             Path := TakePathToFile();
  269.         End;
  270.     Until (IsCorrect);
  271.     CloseFile(F);
  272.     Writeln('Норма матрицы записана в файл!');
  273. End;
  274.  
  275. Function GetMatrix(Choice: Integer): TMatrix;
  276. Var
  277.     Matrix: TMatrix;
  278.     MatrixNorm: Integer;
  279. Begin
  280.     If (Choice = 1) Then
  281.     Begin
  282.         Matrix := CreateMatrixFromConsole();
  283.         OutputMatrixInConsole(Matrix);
  284.     End
  285.     Else
  286.         Matrix := TakeMatrixFromFile();
  287.     GetMatrix := Matrix;
  288. End;
  289.  
  290. Procedure OutputResult(Choice, Answer: Integer);
  291. Begin
  292.     If  (Choice = 1) Then
  293.         Writeln('Полученная норма матрицы: ', Answer)
  294.     Else
  295.         OutputAnswerInFile(Answer);
  296. End;
  297.  
  298. Begin
  299.     WriteTask();
  300.     Writeln('Выберите способ ввода данных (1 - через консоль, 2 - с помощью файлов):');
  301.     Choice := ChooseInputOutputMethod();
  302.     Matrix := GetMatrix(Choice);
  303.     Answer := FindMatrixNorm(Matrix);
  304.     Writeln('Выберите способ вывода данных (1 - через консоль, 2 - с помощью файлов):');
  305.     Choice := ChooseInputOutputMethod();
  306.     OutputResult(Choice, Answer);
  307.     Readln;
  308. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement