Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Lab3_3;
- Uses
- System.SysUtils;
- Type
- TMatrix = Array of Array of Integer;
- Procedure PrintCondition();
- Begin
- Writeln('Программа сортирует двумерный массив по количеству делителей каждого элемента.');
- End;
- Function ReadNum(Min, Max: Integer): Integer;
- Var
- Num: Integer;
- IsCorrect: Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Try
- Readln(Num);
- Except
- Write('Некорректный ввод! ');
- IsCorrect := False;
- End;
- If (IsCorrect) And ((Num < Min) Or (Num > Max)) Then
- Begin
- Write('Недопустимое значение! ');
- IsCorrect := False;
- End;
- Until IsCorrect;
- ReadNum := Num;
- End;
- Function ReadMatrixRows(): Integer;
- Var
- Rows: Integer;
- IsCorrect: Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Write('Введите количество строк матрицы(от 2 до 10): ');
- Try
- Readln(Rows);
- Except
- Writeln('Некорректный ввод!');
- IsCorrect := False;
- End;
- If (IsCorrect) And ((Rows < 2) Or (Rows > 10 )) Then
- Begin
- Writeln('Недопустимое значение! ');
- IsCorrect := False;
- End;
- Until IsCorrect;
- ReadMatrixRows := Rows;
- End;
- Function ReadMatrixCols(): Integer;
- Var
- Cols: Integer;
- IsCorrect: Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Write('Введите количество столбцов матрицы(от 2 до 10): ');
- Try
- Readln(Cols);
- Except
- Writeln('Некорректный ввод! Введите значение ещё раз:');
- IsCorrect := False;
- End;
- If (IsCorrect) And ((Cols < 2) Or (Cols > 10 )) Then
- Begin
- Write('Недопустимое значение! Введите значение ещё раз: ');
- IsCorrect := False;
- End;
- Until IsCorrect;
- ReadMatrixCols := Cols;
- End;
- Function CountDivisors(N: Integer): Integer;
- Var
- Count, I: Integer;
- Begin
- Count := 0;
- For I := 1 To N Do
- If N Mod I = 0 Then
- Count := Count + 1;
- CountDivisors := Count;
- End;
- Procedure SortMatrixByDivisors(Var Matrix: TMatrix; Rows, Cols: Integer);
- Var
- I, J, K, L, Temp: Integer;
- Begin
- For I := 0 To Rows - 1 Do
- For J := 0 To Cols - 1 Do
- For K := 0 To Rows - 1 Do
- For L := 0 To Cols - 1 Do
- If CountDivisors(Matrix[I, J]) < CountDivisors(Matrix[K, L]) Then
- Begin
- Temp := Matrix[I, J];
- Matrix[I, J] := Matrix[K, L];
- Matrix[K, L] := Temp;
- End;
- End;
- Procedure FillMatrixFromKeyboard(Var Matrix: TMatrix; Rows, Cols: Integer);
- Var
- I, J: Integer;
- IsCorrect: Boolean;
- Begin
- SetLength(Matrix, Rows, Cols);
- For I := 0 To Rows - 1 Do
- Begin
- For J := 0 To Cols - 1 Do
- Begin
- Write('Введите элемент [', I + 1, ',', J + 1, ']: ');
- Repeat
- IsCorrect := True;
- Try
- Readln(Matrix[I][J]);
- Except
- IsCorrect := False;
- End;
- If (Not IsCorrect) Or (Matrix[I][J] < 1) Or (Matrix[I][J] > 10000) Then
- Begin
- IsCorrect := False;
- Writeln('Некорректное значение! Введите натуральное число от 1 до 10000.');
- End;
- Until IsCorrect;
- End;
- End;
- End;
- Function CheckFile(Path: String): Boolean;
- Var
- IsFileCorrect: Boolean;
- InputFile: TextFile;
- MatrixRows, MatrixCols, I, J, TempValue: Integer;
- Matrix: TMatrix;
- Begin
- IsFileCorrect := True;
- If FileExists(Path) Then
- Begin
- AssignFile(InputFile, Path);
- If (ExtractFileExt(Path) = '.txt') Then
- Begin
- IsFileCorrect := True;
- Try
- Reset(InputFile);
- Except
- Writeln('Не удалось открыть файл!');
- IsFileCorrect := False;
- End;
- If IsFileCorrect Then
- Begin
- Try
- Readln(InputFile, MatrixRows);
- Readln(InputFile, MatrixCols);
- Except
- Writeln('Ошибка при чтении данных матрицы!');
- IsFileCorrect := False;
- End;
- If IsFileCorrect And ((MatrixRows < 2) Or (MatrixRows > 10) Or (MatrixCols < 2) Or (MatrixCols > 10)) Then
- Begin
- Writeln('Размеры матрицы выходят за допустимые пределы (от 2 до 10 строк и столбцов)');
- IsFileCorrect := False;
- End;
- SetLength(Matrix, MatrixRows, MatrixCols);
- For I := 0 To MatrixRows - 1 Do
- Begin
- For J := 0 To MatrixCols - 1 Do
- Begin
- If EOF(InputFile) Then
- Begin
- If IsFileCorrect Then
- Writeln('Ошибка: файл закончился раньше, чем были считаны все элементы матрицы.');
- IsFileCorrect := False;
- Break;
- End;
- Try
- Read(InputFile, TempValue);
- Except
- Writeln('Ошибка при чтении элементов матрицы!');
- IsFileCorrect := False;
- End;
- If (TempValue < 1) Or (TempValue > 10000) Then
- Begin
- If IsFileCorrect Then
- Writeln('Ошибка: элемент матрицы [', I + 1, ',', J + 1, '] имеет недопустимое значение (допустимый диапазон: 1–10000).');
- IsFileCorrect := False;
- End;
- Matrix[I][J] := TempValue;
- End;
- End;
- End;
- Try
- CloseFile(InputFile);
- Except
- End;
- End
- Else
- Begin
- IsFileCorrect := False;
- Writeln('Файл не является текстовым (.txt)!');
- End;
- End
- Else
- Begin
- Writeln('Файл по данному пути не существует!');
- IsFileCorrect := False;
- End;
- CheckFile := IsFileCorrect;
- End;
- Procedure FillMatrixFromFile(Var Matrix: TMatrix; Var Rows, Cols: Integer);
- Var
- PathFile: String;
- InputFile: TextFile;
- I, J: Integer;
- Begin
- Writeln('Данные в файле должны содержать:'#10' 1) Количество строк матрицы (целое число)'#10' 2) Количество столбцов матрицы (целое число)'#10' 3) Элементы матрицы построчно.');
- Repeat
- Write('Введите путь к файлу с его расширением: ');
- Readln(PathFile);
- Until CheckFile(PathFile);
- AssignFile(InputFile, PathFile);
- Reset(InputFile);
- Writeln('Матрица успешно считана из файла.');
- CloseFile(InputFile);
- End;
- Function InputMatrix(Var Rows, Cols: Integer): TMatrix;
- Var
- Matrix: TMatrix;
- Choice: Integer;
- Path: String;
- Begin
- Write('Выберите способ ввода:', #10, '1. Ввод с консоли', #10, '2. Ввод из файла', #10, 'Ваш выбор: ');
- Choice := ReadNum(1, 2);
- If Choice = 1 Then
- Begin
- Rows := ReadMatrixRows();
- Cols := ReadMatrixCols();
- FillMatrixFromKeyboard(Matrix, Rows, Cols);
- End
- Else
- Begin
- FillMatrixFromFile(Matrix, Rows, Cols);
- End;
- InputMatrix := Matrix;
- End;
- Procedure PrintMatrix(Matrix: TMatrix; Rows, Cols: Integer);
- Var
- I, J: Integer;
- Begin
- Writeln('Отсортированная матрица:');
- For I := 0 To Rows - 1 Do
- Begin
- For J := 0 To Cols - 1 Do
- Write(Matrix[I, J]:8);
- Writeln;
- End;
- End;
- Procedure SaveMatrixToFile(Matrix: TMatrix; Rows, Cols: Integer);
- Var
- Path: String;
- OutputFile: TextFile;
- I, J: Integer;
- IsPathCorrect : Boolean;
- Begin
- Repeat
- IsPathCorrect := True;
- Write('Введите путь для сохранения файла: ');
- Readln(Path);
- AssignFile(OutputFile, Path);
- If (ExtractFileExt(Path) = '.txt') Then
- Begin
- Try
- Rewrite(OutputFile);
- Except
- Writeln('Не удалось вывести в Файл');
- IsPathCorrect := False;
- End;
- End
- Else
- Begin
- IsPathCorrect := False;
- Writeln('Файл не типа txt!');
- End;
- Until IsPathCorrect;
- For I := 0 To Rows - 1 Do
- Begin
- For J := 0 To Cols - 1 Do
- Write(OutputFile, Matrix[I, J]:5);
- Writeln(OutputFile);
- End;
- CloseFile(OutputFile);
- Writeln('Матрица успешно сохранена в файл.');
- End;
- Procedure OutputMatrix(Matrix: TMatrix; Rows, Cols: Integer);
- Var
- Choice: Integer;
- Path: String;
- OutputFile: TextFile;
- I, J: Integer;
- Begin
- Write('Выберите способ вывода:', #10, '1. Вывод в консоль', #10, '2. Сохранение в файл', #10, 'Ваш выбор: ');
- Choice := ReadNum(1, 2);
- If Choice = 1 Then
- Begin
- PrintMatrix(Matrix, Rows, Cols);
- End
- Else
- Begin
- SaveMatrixToFile(Matrix, Rows, Cols);
- End;
- End;
- Var
- Rows, Cols: Integer;
- Matrix: TMatrix;
- Begin
- PrintCondition();
- Matrix := InputMatrix(Rows, Cols);
- SortMatrixByDivisors(Matrix, Rows, Cols);
- OutputMatrix(Matrix, Rows, Cols);
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment