Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Laba_2_4;
- {$APPTYPE CONSOLE}
- Uses
- System.SysUtils;
- Const
- MIN_SIZE = 2;
- MAX_SIZE = 10;
- MIN_VALUE = -1000;
- MAX_VALUE = 1000;
- Type
- TMatrix = Array Of Array Of Integer;
- TSet = Set Of Char;
- TAns = Record
- Size: Byte;
- Matrix: TMatrix;
- End;
- Procedure OutputTaskInfo();
- Begin
- Writeln('Данная программа "переворачивает" действительную квадратную матрицу порядка 2*n,где 2*n задано.');
- Writeln('Диапазон ввода значений размера матрицы(2*n): ', MIN_SIZE, '...', MAX_SIZE, '.');
- Writeln('Диапазон ввода значений элементов подматриц: ', MIN_VALUE, '...', MAX_VALUE, '.');
- End;
- Function InputPathToFile(): String;
- Var
- Path: String;
- IsCorrect: Boolean;
- Begin
- Write('Укажите путь к файлу: ');
- Repeat
- IsCorrect := True;
- Readln(Path);
- If Not FileExists(Path) Then
- Begin
- Write('По указанному пути файл не найден! Укажите правильный путь: ');
- IsCorrect := False;
- End
- Else If ExtractFileExt(Path) <> '.txt' Then
- Begin
- Write('Ошибка, неправильный тип файла! Укажите правильный путь: ');
- IsCorrect := False;
- End;
- Until IsCorrect;
- InputPathToFile := Path;
- End;
- Function GetVerificationOfChoice(): Byte;
- Var
- Choice: Byte;
- IsCorrect: Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Try
- Readln(Choice);
- Except
- Writeln('Проверьте корректность ввода данных!');
- IsCorrect := False;
- End;
- If IsCorrect And ((Choice <> 0) And (Choice <> 1)) Then
- Begin
- Writeln('Для выбора введите 0 или 1!');
- IsCorrect := False;
- End;
- Until IsCorrect;
- GetVerificationOfChoice := Choice;
- End;
- Function InputSizeFromConsole(): Byte;
- Var
- Size: Byte;
- IsCorrect: Boolean;
- Begin
- Write('Введите значение размера матрицы: ');
- Repeat
- IsCorrect := True;
- Try
- Readln(Size);
- Except
- Writeln('Проверьте корректность ввода данных!');
- IsCorrect := False;
- End;
- If IsCorrect And ((Size < MIN_SIZE) And (Size > MAX_SIZE)) Then
- Begin
- Writeln('Введите значение от ', MIN_SIZE, ' до ', MAX_SIZE, '!');
- IsCorrect := False;
- End;
- If IsCorrect And (Size Mod 2 <> 0) Then
- Begin
- Writeln('Значение размера матрицы должно быть кратно 2!');
- IsCorrect := False;
- End;
- Until IsCorrect;
- InputSizeFromConsole := Size;
- End;
- Function InputSizeFromFile(Const Path: String): Byte;
- Var
- Size: Byte;
- IsCorrect: Boolean;
- InputFile: TextFile;
- Begin
- AssignFile (InputFile, Path);
- Reset(InputFile);
- IsCorrect := True;
- Writeln('Происходит чтение размеров матрицы...');
- Try
- Readln(InputFile, Size);
- Except
- IsCorrect := False;
- Writeln('Ошибка при чтении данных! Введите размер с консоли!');
- Size := InputSizeFromConsole();
- End;
- If (IsCorrect And(((Size < MIN_SIZE) Or (Size > MAX_SIZE)) Or (Size Mod 2 <> 0))) Then
- Begin
- Writeln('В файле введен некорректный размер матрицы! Введите размер с консоли!');
- Size := InputSizeFromConsole();
- End;
- InputSizeFromFile := Size;
- CloseFile (InputFile);
- End;
- Procedure OutputSize(Const Choice, Size: Byte; Path: String);
- Var
- OutputFile: TextFile;
- IsCorrect: Boolean;
- Begin
- If Choice = 0 Then
- Writeln('Размер квадратной матрицы равен: ', Size);
- If Choice = 1 Then
- Begin
- Writeln('Вывод значения раземера в файл...');
- Repeat
- IsCorrect := True;
- AssignFile(OutputFile, Path);
- Try
- Rewrite(OutputFile);
- Except
- Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
- IsCorrect := False;
- Path := InputPathToFile();
- End;
- Until IsCorrect;
- Write(OutputFile, Size);
- Write(OutputFile, #13);
- Close(OutputFile);
- Writeln('Данные успешно записаны в файл!');
- End;
- End;
- Function FillMatrixFromConsole(Const Size: Byte): TMatrix;
- Var
- Matrix: TMatrix;
- IsCorrect: Boolean;
- I, J: Integer;
- Begin
- SetLength(Matrix, Size, Size);
- For I := Low(Matrix) To High(Matrix) Do
- For J := Low(Matrix) To High(Matrix) Do
- Begin
- Write('Введите значение элемента ', I + 1, '-ой строки ', J + 1, '-го столбца матрицы: ');
- Repeat
- IsCorrect := True;
- Try
- Read(Matrix[I, J]);
- Except
- Writeln('Проверьте корректность ввода данных!');
- IsCorrect := False;
- End;
- If (IsCorrect And ((Matrix[I, J] < MIN_VALUE) Or (Matrix[I, J] > MAX_VALUE))) Then
- Begin
- Writeln('Введите число от ', MIN_VALUE, ' до ', MAX_VALUE, '!');
- IsCorrect := False;
- End;
- Until IsCorrect;
- End;
- FillMatrixFromConsole := Matrix;
- End;
- Function FillMatrixFromFile(Const Size: Byte; Const Path: String): TMatrix;
- Var
- Matrix: TMatrix;
- IsCorrect: Boolean;
- InputFile: TextFile;
- I, J, Count: Byte;
- Symbol: AnsiChar;
- Begin
- AssignFile(InputFile, Path);
- Reset(InputFile);
- Readln(InputFile);
- SetLength(Matrix, Size, Size);
- Count := 0;
- Writeln('Происходит чтение матрицы...');
- While Not Eof(InputFile) Do
- Begin
- Read(InputFile, Symbol);
- If Symbol = ' ' Then
- Inc(Count);
- End;
- Close(InputFile);
- If Count > Size * (Size - 1) Then
- Begin
- Writeln('Ошибка при чтении матрицы! Введите матрицу с консоли!');
- Matrix := FillMatrixFromConsole(Size);
- End
- Else
- Begin
- AssignFile(InputFile, Path);
- Reset(InputFile);
- Readln(InputFile);
- For I := Low(Matrix) To High(Matrix) Do
- Begin
- For J := Low(Matrix) To High(Matrix) Do
- Begin
- Repeat
- IsCorrect := True;
- Try
- Read(InputFile, Matrix[I, J]);
- Except
- Writeln('Ошибка при чтении матрицы! Введите матрицу с консоли!');
- IsCorrect := False;
- Matrix := FillMatrixFromConsole(Size);
- End;
- If (IsCorrect And ((Matrix[I, J] < MIN_VALUE) Or (Matrix[I, J] > MAX_VALUE))) Then
- Begin
- Writeln('Ошибка при чтении матрицы! Введите матрицу с консоли!');
- IsCorrect := False;
- Matrix := FillMatrixFromConsole(Size);
- End;
- Until IsCorrect;
- End;
- End;
- Close(InputFile);
- End;
- FillMatrixFromFile := Matrix;
- End;
- Procedure OutputMatrix(Const Choice: Byte; Const Matrix: TMatrix; Path: String);
- Var
- OutputFile: TextFile;
- IsCorrect: Boolean;
- I, J: Integer;
- Begin
- If Choice = 0 Then
- Begin
- Writeln('Вывод начальной матрицы: ');
- For I := Low(Matrix) To High(Matrix) Do
- Begin
- For J := Low(Matrix) To High(Matrix) Do
- Write(Matrix[I, J], #9);
- Writeln('');
- End;
- End;
- If Choice = 1 Then
- Begin
- Writeln('Вывод начальной матрицы в файл...');
- Repeat
- IsCorrect := True;
- AssignFile(OutputFile, Path);
- Try
- Append(OutputFile);
- Except
- Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
- IsCorrect := False;
- Path := InputPathToFile();
- End;
- Until IsCorrect;
- For I := Low(Matrix) To High(Matrix) Do
- Begin
- For J := Low(Matrix) To High(Matrix) Do
- Write(OutputFile, Matrix[I, J], #9);
- Writeln(OutputFile,'');
- End;
- Write(OutputFile, #13);
- Close(OutputFile);
- Writeln('Данные успешно записаны в файл!');
- End;
- End;
- Function CreateNewMatrix(Const InpData: TAns): TMatrix;
- Var
- Matrix, NewMatrix, Submatrix1, Submatrix2, Submatrix3, Submatrix4: TMatrix;
- I, J, SubmatrixSize, Size: Byte;
- Begin
- Size := InpData.Size;
- Matrix := InpData.Matrix;
- SubmatrixSize := Size Div 2;
- SetLength(Submatrix1, SubmatrixSize, SubmatrixSize);
- SetLength(Submatrix2, SubmatrixSize, SubmatrixSize);
- SetLength(Submatrix3, SubmatrixSize, SubmatrixSize);
- SetLength(Submatrix4, SubmatrixSize, SubmatrixSize);
- SetLength(NewMatrix, Size, Size);
- For I := Low(SubMatrix1) To High(Submatrix1) Do
- For J := Low(SubMatrix1) To High(Submatrix1) Do
- Submatrix1[I, J] := Matrix[I, J];
- For I := Low(SubMatrix2) To High(Submatrix2) Do
- For J := Low(SubMatrix2) To High(Submatrix2) Do
- Submatrix2[I, J] := Matrix[I, J + SubmatrixSize];
- For I := Low(SubMatrix3) To High(Submatrix3) Do
- For J := Low(SubMatrix3) To High(Submatrix3) Do
- Submatrix3[I, J] := Matrix[I + SubmatrixSize, J];
- For I := Low(SubMatrix4) To High(Submatrix4) Do
- For J := Low(SubMatrix4) To High(Submatrix4) Do
- Submatrix4[I, J] := Matrix[I + + SubmatrixSize, J + SubmatrixSize];
- For I := Low(SubMatrix4) To High(Submatrix4) Do
- For J := Low(SubMatrix4) To High(Submatrix4) Do
- NewMatrix[I, J] := Submatrix4[I, J];
- For I := Low(SubMatrix3) To High(Submatrix3) Do
- For J := Low(SubMatrix3) To High(Submatrix3) Do
- NewMatrix[I, J + SubmatrixSize] := Submatrix3[I, J];
- For I := Low(SubMatrix1) To High(Submatrix1) Do
- For J := Low(SubMatrix1) To High(Submatrix1) Do
- NewMatrix[I + SubmatrixSize, J] := Submatrix1[I, J];
- For I := Low(SubMatrix2) To High(Submatrix2) Do
- For J := Low(SubMatrix2) To High(Submatrix2) Do
- NewMatrix[I + SubmatrixSize, J + SubmatrixSize] := Submatrix2[I, J];
- CreateNewMatrix := NewMatrix;
- End;
- Procedure OutputNewMatrix(Const Choice: Byte; Const Matrix: TMatrix; Path: String);
- Var
- IsCorrect: Boolean;
- OutputFile: TextFile;
- I, J: Byte;
- Begin
- If Choice = 0 Then
- Begin
- Writeln('Вывод новой матрицы: ');
- For I := Low(Matrix) To High(Matrix) Do
- Begin
- For J := Low(Matrix) To High(Matrix) Do
- Write(Matrix[I, J], #9);
- Writeln(#13);
- End;
- End;
- If Choice = 1 Then
- Begin
- Writeln('Вывод матрицы в файл...');
- Repeat
- IsCorrect := True;
- AssignFile(OutputFile, Path);
- Try
- Append(OutputFile);
- Except
- Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
- IsCorrect := False;
- Path := InputPathToFile();
- End;
- Until IsCorrect;
- For I := Low(Matrix) To High(Matrix) Do
- Begin
- For J := Low(Matrix) To High(Matrix) Do
- Write(OutputFile, Matrix[I, J], #9);
- Write(OutputFile, #13);
- End;
- Close(OutputFile);
- Writeln('Данные успешно записаны в файл!');
- End;
- End;
- Function ProcessUserInput(Var SSet: TSet): TAns;
- Var
- PathToIn: String;
- ChoiceForInput, Size: Byte;
- Matrix: TMatrix;
- Begin
- Writeln('Вы желаете вводить данные с консоли(0) или из файла(1)?');
- ChoiceForInput := GetVerificationOfChoice();
- If ChoiceForInput = 0 Then
- Begin
- Size := InputSizeFromConsole();
- Matrix := FillMatrixFromConsole(Size);
- End;
- If ChoiceForInput = 1 Then
- Begin
- PathToIn := InputPathToFile();
- Size := InputSizeFromFile(PathToIn);
- Matrix := FillMatrixFromFile(Size, PathToIn);
- End;
- ProcessUserInput.Size := Size;
- ProcessUserInput.Matrix := Matrix;
- End;
- Procedure ProcessUserOutput(const Answer: TAns; const NewMatrix: TMatrix);
- Var
- PathToOut: String;
- ChoiceForOutput: Byte;
- Begin
- Writeln('Вы желаете получть данные в консоль(0) или в файл(1)?');
- ChoiceForOutput := GetVerificationOfChoice();
- If ChoiceForOutput = 1 Then
- PathToOut := InputPathToFile();
- OutputSize(ChoiceForOutput, Answer.Size, PathToOut);
- OutputMatrix(ChoiceForOutput, Answer.Matrix, PathToOut);
- OutputNewMatrix(ChoiceForOutput, NewMatrix, PathToOut);
- End;
- Procedure Main();
- Var
- SSet: TSet;
- NewMatrix: TMatrix;
- InpData: TAns;
- Begin
- OutputTaskInfo();
- InpData := ProcessUserInput(SSet);
- NewMatrix := CreateNewMatrix(InpData);
- ProcessUserOutput(InpData, NewMatrix);
- End;
- Begin
- Main();
- Readln;
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement