Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program LAB2_3;
- Uses
- System.SysUtils;
- Type
- TMatrix = Array Of Array Of Integer;
- TVector = Array Of Integer;
- Const
- MINSIZE = 2;
- MAXSIZE = 10;
- MIN = -1000;
- MAX = 1000;
- Function CheckSizeInput(OutputMessage: String): Integer;
- Var
- Size: Integer;
- IsCorrect: Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Write(OutputMessage);
- Try
- Readln(Size);
- Except
- IsCorrect := False;
- Writeln('Введенные данные не соответствуют условию. Повторите попытку.');
- End;
- If IsCorrect And ((Size < MINSIZE) Or (Size > MAXSIZE)) Then
- Begin
- IsCorrect := False;
- Writeln('Введенные данные не соответствуют условию. Повторите попытку.');
- End;
- Until (IsCorrect);
- CheckSizeInput := Size;
- End;
- Function CheckMatrixInput(RowNum, ColNum: Integer; Matrix: TMatrix): TMatrix;
- Var
- I, J: Integer;
- IsCorrect: Boolean;
- Begin
- For I := 0 To RowNum - 1 Do
- For J := 0 To ColNum - 1 Do
- Repeat
- IsCorrect := True;
- Write('Введите элемент ', I + 1, ' строки, ', J + 1,
- ' столбца матрицы: ');
- Try
- Readln(Matrix[I][J]);
- Except
- Writeln('Введенные данные не соответствуют условию. Повторите Попытку.');
- IsCorrect := False;
- End;
- If IsCorrect And
- ((Matrix[I][J] > MAX) Or (Matrix[I][J] < MIN)) Then
- Begin
- Writeln('Введенные данные не соответствуют условию. Повторите Попытку.');
- IsCorrect := False;
- End;
- Until (IsCorrect);
- Writeln;
- CheckMatrixInput := Matrix;
- End;
- Function CheckVectorInput(VectorOrMatrix: String; Size: Integer;
- Vector: TVector): TVector;
- Var
- I: Integer;
- IsCorrect: Boolean;
- Begin
- For I := 0 To (Size - 1) Do
- Repeat
- IsCorrect := True;
- Write('Введите ', I + 1, ' элемент ', VectorOrMatrix, ': ');
- Try
- Readln(Vector[I]);
- Except
- Writeln('Введенные данные не соответствуют условию. Повторите Попытку.');
- IsCorrect := False;
- End;
- If IsCorrect And ((Vector[I] > MAX) Or (Vector[I] < MIN)) Then
- Begin
- Writeln('Введенные данные не соответствуют условию. Повторите Попытку.');
- IsCorrect := False;
- End;
- Until (IsCorrect);
- Writeln;
- CheckVectorInput := Vector;
- End;
- Function CheckFileInputPath(MatrixOrVector: String): String;
- Var
- FilePath: String;
- IsCorrect: Boolean;
- Begin
- Writeln;
- Repeat
- IsCorrect := True;
- Writeln('Введите путь к файлу, содержащему ', MatrixOrVector, '.');
- Readln(FilePath);
- If Not FileExists(FilePath) Then
- Begin
- Writeln('Введенного файла не существует. Повторите попытку.');
- IsCorrect := False;
- End
- Else If ExtractFileExt(FilePath) <> '.txt' Then
- Begin
- Writeln('Введенный Вами файл не является текстовым. Повторите попытку.');
- IsCorrect := False;
- End;
- Until IsCorrect;
- CheckFileInputPath := FilePath;
- End;
- Function CheckMatrixFileInput(Path: String; RowNum, ColNum: Integer;
- Matrix: TMatrix): TMatrix;
- Var
- I, J: Integer;
- FIn: TextFile;
- IsCorrect: Boolean;
- Begin
- AssignFile(FIn, Path);
- Repeat
- IsCorrect := True;
- Try
- Try
- Reset(FIn);
- For I := 0 To (RowNum - 1) Do
- For J := 0 To (ColNum - 1) Do
- Begin
- Read(FIn, Matrix[I][J]);
- If (IsCorrect And ((Matrix[I][J] < MIN) Or
- (Matrix[I][J] > MAX))) Then
- Begin
- Writeln('Данные выбранного файла не соответствуют условию. Повторите попытку.');
- IsCorrect := False;
- Path := CheckFileInputPath('матрицу');
- End;
- End;
- Finally
- Close(FIn);
- End;
- Except
- Writeln('Данные выбранного файла не соответствуют условию. Повторите попытку.');
- IsCorrect := False;
- Path := CheckFileInputPath('матрицу');
- End;
- Until IsCorrect;
- CheckMatrixFileInput := Matrix;
- End;
- Function CheckVectorFileInput(Path, MatrixOrVector: String; Size: Integer;
- Vector: TVector): TVector;
- Var
- I: Integer;
- FIn: TextFile;
- IsCorrect: Boolean;
- Begin
- AssignFile(FIn, Path);
- Repeat
- IsCorrect := True;
- Try
- Try
- Reset(FIn);
- For I := 0 To (Size - 1) Do
- Begin
- Read(FIn, Vector[I]);
- If (IsCorrect And ((Vector[I] < MIN) Or
- (Vector[I] > MAX))) Then
- Begin
- Writeln('Данные выбранного файла не соответствуют условию. Повторите попытку.');
- IsCorrect := False;
- Path := CheckFileInputPath(MatrixOrVector);
- End;
- End;
- Finally
- Close(FIn);
- End;
- Except
- Writeln('Данные выбранного файла не соответствуют условию. Повторите попытку.');
- IsCorrect := False;
- Path := CheckFileInputPath(MatrixOrVector);
- End;
- Until IsCorrect;
- CheckVectorFileInput := Vector;
- End;
- Procedure OutputMatrix(RowNum, ColNum: Integer; Matrix: TMatrix);
- Var
- I, J: Integer;
- Begin
- For I := 0 To (RowNum - 1) Do
- Begin
- For J := 0 To (ColNum - 1) Do
- Write(Matrix[I][J], ' ');
- Writeln;
- End;
- Writeln;
- End;
- Procedure OutputVectorColumn(Vector: TVector);
- Var
- I: Integer;
- Begin
- For I := 0 To High(Vector) Do
- Writeln(Vector[I]);
- Writeln;
- End;
- Procedure OutputVectorRow(Vector: TVector);
- Var
- I: Integer;
- Begin
- For I := 0 To High(Vector) Do
- Write(Vector[I], ' ');
- Writeln;
- End;
- Function FindProductVectorMatrix(RowNum, ColNum: Integer; Vector: TVector;
- Matrix: TMatrix): TVector;
- Var
- I, J: Integer;
- ProductMatrix: TVector;
- Begin
- SetLength(ProductMatrix, ColNum);
- For I := 0 To (ColNum - 1) Do
- Begin
- ProductMatrix[I] := 0;
- For J := 0 To (RowNum - 1) Do
- ProductMatrix[I] := ProductMatrix[I] + (Matrix[J][I] * Vector[J]);
- End;
- FindProductVectorMatrix := ProductMatrix;
- End;
- Function FindProductMatrix(RowNum, ColNum: Integer;
- Vector, Matrix: TVector): TMatrix;
- Var
- I, J: Integer;
- ProductMatrix: TMatrix;
- Begin
- SetLength(ProductMatrix, RowNum, ColNum);
- For I := 0 To (RowNum - 1) Do
- For J := 0 To (ColNum - 1) Do
- ProductMatrix[I][J] := Vector[I] * Matrix[J];
- FindProductMatrix := ProductMatrix;
- End;
- Function CheckFileOutputPath(): String;
- Var
- FilePath: String;
- IsCorrect: Boolean;
- Begin
- Writeln;
- Repeat
- IsCorrect := True;
- Writeln('Введите путь к файлу, в который нужно записать результат.');
- Readln(FilePath);
- If Not FileExists(FilePath) Then
- Begin
- Writeln('Введенного файла не существует. Повторите попытку.');
- IsCorrect := False;
- End
- Else If ExtractFileExt(FilePath) <> '.txt' Then
- Begin
- Writeln('Введенный Вами файл не является текстовым. Повторите попытку.');
- IsCorrect := False;
- End
- Else If FileIsReadOnly(FilePath) Then
- Begin
- Writeln('Введенный Вами файл доступен только для чтения. Повторите попытку.');
- IsCorrect := False;
- End;
- Until IsCorrect;
- CheckFileOutputPath := FilePath;
- End;
- Procedure WriteVectorResultIntoFile(Path: String; ProductMatrix: TVector);
- Var
- I: Integer;
- IsCorrect: Boolean;
- FOut: TextFile;
- Begin
- Repeat
- IsCorrect := True;
- Assign(FOut, Path);
- Try
- Try
- Rewrite(FOut);
- For I := 0 To High(ProductMatrix) Do
- Writeln(FOut, ProductMatrix[I]);
- Finally
- CloseFile(FOut);
- End;
- Except
- Writeln('Произошла ошибка. Повторите попытку.');
- IsCorrect := False;
- Path := CheckFileOutputPath();
- End;
- Until IsCorrect;
- Writeln('Результат записан.');
- End;
- Procedure WriteMatrixResultIntoFile(Path: String; RowNum, ColNum: Integer;
- ProductMatrix: TMatrix);
- Var
- I, J: Integer;
- IsCorrect: Boolean;
- FOut: TextFile;
- Begin
- Repeat
- IsCorrect := True;
- Assign(FOut, Path);
- Try
- Try
- Rewrite(FOut);
- For I := 0 To (RowNum - 1) Do
- Begin
- For J := 0 To (ColNum - 1) Do
- Write(FOut, ProductMatrix[I][J], ' ');
- Writeln(FOut);
- End;
- Finally
- CloseFile(FOut);
- End;
- Except
- Writeln('Произошла ошибка. Повторите попытку.');
- IsCorrect := False;
- Path := CheckFileOutputPath();
- End;
- Until IsCorrect;
- Writeln('Результат записан.');
- End;
- Procedure VectorColumn(Choice: Integer);
- Var
- I, J, RowNum, ColNum: Integer;
- Vector, Matrix: TVector;
- ProductMatrix: TMatrix;
- FInPathMatrix, FInPathVector, FOutPath: String;
- Begin
- RowNum := CheckSizeInput('Введите размер вектора-столбца (от 2 до 10): ');
- SetLength(Vector, RowNum);
- ColNum := CheckSizeInput
- ('Введите количество столбцов матрицы (от 2 до 10): ');
- SetLength(Matrix, ColNum);
- If Choice = 0 Then
- Begin
- Vector := CheckVectorInput('вектора', RowNum, Vector);
- Matrix := CheckVectorInput('матрицы', ColNum, Matrix);
- End
- Else
- Begin
- FInPathVector := CheckFileInputPath('вектор');
- Vector := CheckVectorFileInput(FInPathVector, 'вектор', RowNum, Vector);
- FInPathMatrix := CheckFileInputPath('матрицу');
- Matrix := CheckVectorFileInput(FInPathMatrix, 'матрицу',
- ColNum, Matrix);
- End;
- Writeln('Введенный вектор:');
- OutputVectorColumn(Vector);
- Writeln('Введенная матрица:');
- OutputVectorRow(Matrix);
- ProductMatrix := FindProductMatrix(RowNum, ColNum, Vector, Matrix);
- If Choice = 0 Then
- Begin
- Writeln('Результат произведения вектора и матрицы:');
- OutputMatrix(RowNum, ColNum, ProductMatrix);
- End
- Else
- Begin
- FOutPath := CheckFileOutputPath();
- WriteMatrixResultIntoFile(FOutPath, RowNum, ColNum, ProductMatrix);
- End
- End;
- Procedure VectorRow(Choice: Integer);
- Var
- I, J, RowNum, ColNum: Integer;
- Vector, ProductMatrix: TVector;
- Matrix: TMatrix;
- FInPathMatrix, FInPathVector, FOutPath: String;
- Begin
- RowNum := CheckSizeInput('Введите размер вектора-строки (от 2 до 10): ');
- SetLength(Vector, RowNum);
- Writeln('Количество строк матрицы равно ', RowNum, '.');
- ColNum := CheckSizeInput
- ('Введите количество столбцов матрицы (от 2 до 10): ');
- SetLength(Matrix, RowNum, ColNum);
- If Choice = 0 Then
- Begin
- Vector := CheckVectorInput('вектора', RowNum, Vector);
- Matrix := CheckMatrixInput(RowNum, ColNum, Matrix);
- End
- Else
- Begin
- FInPathVector := CheckFileInputPath('вектор');
- Vector := CheckVectorFileInput(FInPathVector, 'вектор', RowNum, Vector);
- FInPathMatrix := CheckFileInputPath('матрицу');
- Matrix := CheckMatrixFileInput(FInPathMatrix, RowNum, ColNum, Matrix);
- End;
- Writeln('Введенный вектор:');
- OutputVectorRow(Vector);
- Writeln('Введенная матрица:');
- OutputMatrix(RowNum, ColNum, Matrix);
- ProductMatrix := FindProductVectorMatrix(RowNum, ColNum, Vector, Matrix);
- If Choice = 0 Then
- Begin
- Writeln('Результат произведения вектора и матрицы:');
- OutputVectorRow(ProductMatrix);
- End
- Else
- Begin
- FOutPath := CheckFileOutputPath();
- WriteVectorResultIntoFile(FOutPath, ProductMatrix);
- End;
- End;
- Function CheckChoiceInput(): Integer;
- Var
- Num: Integer;
- IsCorrect: Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Try
- Readln(Num);
- Except
- IsCorrect := False;
- Writeln('Введенные данные не соответствуют условию. Повторите попытку.');
- End;
- If IsCorrect And ((Num <> 0) And (Num <> 1)) Then
- Begin
- IsCorrect := False;
- Writeln('Введенные данные не соответствуют условию. Повторите попытку.');
- End;
- Until (IsCorrect);
- CheckChoiceInput := Num;
- End;
- Procedure ChooseVectorType(Choice: Integer);
- Var
- VectorType: Integer;
- Begin
- Writeln('Введите 0, если требуется умножить матрицу вектор-столбец на матрицу, и 1, если вектор-строку.');
- VectorType := CheckChoiceInput();
- If VectorType = 0 Then
- Begin
- Writeln('Для умножения вектора-столбца на матрицу, матрица должна состоять из 1 строки.');
- Writeln;
- VectorColumn(Choice);
- End
- Else
- Begin
- Writeln('Для умножения вектора-строку на матрицу, число столбцов вектора должно совпадать с числом строк матрицы.');
- Writeln;
- VectorRow(Choice);
- End;
- End;
- Procedure WriteCondition();
- Begin
- Writeln('Данная программа находит произведение вектора на матрицу.');
- Writeln('Элементы вектора и матрицы - целые числа от -1000 до 1000.');
- End;
- Var
- Choice: Integer;
- Begin
- WriteCondition();
- Writeln('Если Вы хотите вводить данные в консоль, введите 0. Если использовать файл, введите 1.');
- Choice := CheckChoiceInput();
- ChooseVectorType(Choice);
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement