Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Lab_2_3;
- {$APPTYPE CONSOLE}
- {$R *.res}
- Uses
- System.SysUtils;
- Type
- TMatrix = Array Of Array Of Integer;
- TArr = Array Of Integer;
- Var
- Choice, Answer: Integer;
- Matrix: TMatrix;
- Procedure WriteTask();
- Begin
- Writeln('Данная программа вычисляет норму матрицы.');
- End;
- Function TakeMatrixOrderFromConsole(): Integer;
- Const
- MAX_ORDER = 10;
- MIN_ORDER = 2;
- Var
- Order: Integer;
- IsCorrect: Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Write('Введите порядок квадратной матрицы: ');
- Try
- Readln(Order);
- Except
- Writeln('Введено некорректное значение. Повторите попытку...');
- IsCorrect := False;
- End;
- If ((IsCorrect) And ((Order < MIN_ORDER) Or (Order > MAX_ORDER))) Then
- Begin
- IsCorrect := False;
- Writeln('Введённое число не входит в допустимый диапазон. Повторите попытку...');
- End;
- Until (IsCorrect);
- TakeMatrixOrderFromConsole := Order;
- End;
- Function CreateMatrixFromConsole(): TMatrix;
- Const
- MIN_ELEMENT = -2147483648;
- MAX_ELEMENT = 2147483647;
- Var
- Matrix: TMatrix;
- I, J, Order: Integer;
- IsCorrect: Boolean;
- Begin
- Order := TakeMatrixOrderFromConsole();
- SetLength(Matrix, Order, Order);
- For I := 0 To High(Matrix) Do
- For J := 0 To High(Matrix) Do
- Repeat
- Write('Введите элемент ', (I + 1), ' строки ', (J + 1), ' столбца матрицы: ');
- IsCorrect := True;
- Try
- Readln(Matrix[I][J]);
- Except
- Writeln('Введено некорректное значение. Повторите попытку...');
- IsCorrect := False;
- End;
- If ((IsCorrect) And ((Matrix[I][J] < MIN_ELEMENT) Or (Matrix[I][J] > MAX_ELEMENT))) Then
- Begin
- IsCorrect := False;
- Writeln('Введённое значение не входит в допустимый диапазон. Повторите попытку...');
- End;
- Until (IsCorrect);
- CreateMatrixFromConsole := Matrix;
- End;
- Procedure OutputMatrixInConsole(Matrix: TMatrix);
- Var
- I, J: Integer;
- Begin
- For I := 0 To High(Matrix) Do
- Begin
- For J := 0 To High(Matrix) Do
- Write(Matrix[I][J], ' ');
- Writeln;
- End;
- End;
- Function TakePathToFile(): String;
- Var
- Path: String;
- IsCorrect: Boolean;
- F: TextFile;
- Begin
- Repeat
- IsCorrect := True;
- Write('Введите путь к файлу: ');
- Readln(Path);
- AssignFile(F, Path);
- If (Not(FileExists(Path))) Then
- Begin
- IsCorrect := False;
- Writeln('Не удалось найти файл по заданному пути. Повторите попытку...');
- End;
- Until (IsCorrect);
- TakePathToFile := Path;
- End;
- Function TakeMatrixFromFile(): TMatrix;
- Const
- MAX_ORDER = 10;
- MIN_ORDER = 2;
- MAX_ELEMENT = 2147483647;
- MIN_ELEMENT = -2147483648;
- Var
- Path: String;
- Matrix: TMatrix;
- F: TextFile;
- IsCorrect: Boolean;
- I, J, Order: Integer;
- Begin
- Write('Требуется файл для чтения. ');
- Path := TakePathToFile();
- Repeat
- Repeat
- IsCorrect := True;
- AssignFile(F, Path);
- Try
- Reset(F);
- Except
- Write('Не удалось открыть файл по заданному пути. ');
- IsCorrect := False;
- End;
- If (IsCorrect) Then
- Begin
- Try
- Readln(F, Order);
- Except
- Write('Некорректный порядок матрицы. ');
- IsCorrect := False;
- End;
- If (IsCorrect) And ((Order < MIN_ORDER) Or (Order > MAX_ORDER)) Then
- Begin
- Write('Рорядок матрицы не входит в допустимый диапазон. ');
- IsCorrect := False;
- End;
- End;
- If Not(IsCorrect) Then
- Begin
- Writeln('Повторите попытку...');
- CloseFile(F);
- Path := TakePathToFile();
- End;
- Until (IsCorrect);
- SetLength(Matrix, Order, Order);
- I := 0;
- While (IsCorrect) And (I < Order) Do
- Begin
- J := 0;
- While (IsCorrect) And (J < Order) Do
- Begin
- Try
- Read(F, Matrix[I][J]);
- Except
- Write('Найден некорректно введённый элемент матрицы. ');
- IsCorrect := False;
- End;
- If (IsCorrect) And ((Matrix[I][J] < MIN_ELEMENT) Or (Matrix[I][J] > MAX_ELEMENT)) Then
- Begin
- Write('Найден элемент матрицы, не входящий в допустимый диапазон. ');
- IsCorrect := False;
- End;
- Inc(J)
- End;
- Inc(I);
- End;
- If Not(IsCorrect) Then
- Begin
- Writeln('Повторите попытку...');
- CloseFile(F);
- Path := TakePathToFile();
- End;
- Until (IsCorrect);
- CloseFile(F);
- TakeMatrixFromFile := Matrix;
- End;
- Function CalculateAbsSums(Matrix: TMatrix): TArr;
- Var
- I, J, Sum: Integer;
- AbsSums: TArr;
- Begin
- SetLength(AbsSums, High(Matrix) + 1);
- For I := 0 To High(Matrix) Do
- Begin
- Sum := 0;
- For J := 0 To High(Matrix) Do
- Sum := Sum + Abs(Matrix[I][J]);
- AbsSums[I] := Sum;
- End;
- CalculateAbsSums := AbsSums;
- End;
- Function FindMatrixNorm(Matrix: TMatrix): Integer;
- Var
- Norm, I, J: Integer;
- AbsSums: TArr;
- Begin
- SetLength(AbsSums, High(Matrix) + 1);
- AbsSums := CalculateAbsSums(Matrix);
- Norm := AbsSums[0];
- For I := 1 To High(Matrix) Do
- If (AbsSums[I] > Norm) Then
- Norm := AbsSums[I];
- FindMatrixNorm := Norm;
- End;
- Function ChooseInputOutputMethod(): Integer;
- Var
- IsCorrect: Boolean;
- Choice: Integer;
- Begin
- Repeat
- IsCorrect := True;
- Try
- Readln(Choice);
- Except
- Writeln ('Число введено некорректно. Повторите попытку...');
- IsCorrect := False;
- End;
- If (IsCorrect) And (Choice <> 1) And (Choice <> 2) Then
- Begin
- Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
- IsCorrect := False;
- End;
- Until (IsCorrect);
- ChooseInputOutputMethod := Choice;
- End;
- Procedure OutputAnswerInFile(Answer: Integer);
- Var
- F: TextFile;
- Path: String;
- IsCorrect: Boolean;
- Begin
- Write('Требуется файл для записи. ');
- Path := TakePathToFile();
- Repeat
- IsCorrect := True;
- AssignFile(F, Path);
- Try
- Rewrite(F);
- Except
- Write('Не удалось получить доступ к файлу. ');
- IsCorrect := False;
- End;
- If (IsCorrect) Then
- Begin
- Write(F, 'Полученная норма матрицы: ');
- Writeln(F, Answer);
- End
- Else
- Begin
- Writeln('Повторите попытку...');
- CloseFile(F);
- Path := TakePathToFile();
- End;
- Until (IsCorrect);
- CloseFile(F);
- Writeln('Норма матрицы записана в файл!');
- End;
- Function GetMatrix(Choice: Integer): TMatrix;
- Var
- Matrix: TMatrix;
- MatrixNorm: Integer;
- Begin
- If (Choice = 1) Then
- Begin
- Matrix := CreateMatrixFromConsole();
- OutputMatrixInConsole(Matrix);
- End
- Else
- Matrix := TakeMatrixFromFile();
- GetMatrix := Matrix;
- End;
- Procedure OutputResult(Choice, Answer: Integer);
- Begin
- If (Choice = 1) Then
- Writeln('Полученная норма матрицы: ', Answer)
- Else
- OutputAnswerInFile(Answer);
- End;
- Begin
- WriteTask();
- Writeln('Выберите способ ввода данных (1 - через консоль, 2 - с помощью файлов):');
- Choice := ChooseInputOutputMethod();
- Matrix := GetMatrix(Choice);
- Answer := FindMatrixNorm(Matrix);
- Writeln('Выберите способ вывода данных (1 - через консоль, 2 - с помощью файлов):');
- Choice := ChooseInputOutputMethod();
- OutputResult(Choice, Answer);
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement