Advertisement
nblknn

2.3 X_x

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