Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Lab2_3;
- uses
- System.SysUtils;
- type
- Column = array of Integer;
- Matrix = array of Column;
- function GetMatrixSize(Message: string): Integer;
- var
- Ret: Integer;
- IsCorrect: Boolean;
- begin
- repeat
- Writeln('Введите ', Message, ' матрицы');
- IsCorrect := True;
- try
- Readln(Ret)
- except
- IsCorrect := False;
- Writeln(Message, ' должно быть числом')
- end;
- if (((Ret < 1) or (Ret > 10000)) and IsCorrect) then
- begin
- Writeln(Message, ' должно промежутку от 1 до 10000');
- IsCorrect := False
- end;
- until IsCorrect;
- GetMatrixSize := Ret;
- end;
- function GetOutputDirectory(): String;
- var
- Ret: String;
- IsCorrect: Boolean;
- begin
- IsCorrect := False;
- repeat
- Writeln('Введите директорию, в которую хотите сохранить матрицу');
- Readln(Ret);
- if DirectoryExists(Ret) then
- IsCorrect := True
- else
- Writeln('Такой директории не существует.Попробуйте ещё раз');
- until IsCorrect;
- GetOutputDirectory := Ret;
- end;
- function GetMatrixItem(I, J: Integer): Integer;
- var
- Ret: Integer;
- IsCorrect: Boolean;
- begin
- repeat
- Writeln('Введите значение элемента матрицы [', I, ',', J, ']');
- IsCorrect := True;
- try
- Readln(Ret)
- except
- IsCorrect := False;
- Writeln('Значение матрицы должно быть числом')
- end;
- until IsCorrect;
- GetMatrixItem := Ret;
- end;
- function GetMatrixFromConsole(Width, Height: Integer): Matrix;
- var
- Ret: Matrix;
- I, J: Integer;
- begin
- SetLength(Ret, Width, Height);
- for I := 0 to High(Ret) do
- for J := 0 to High(Ret[I]) do
- Ret[I, J] := GetMatrixItem(I, J);
- GetMatrixFromConsole := Ret;
- end;
- function IsFileCorrect(Path: String; Width, Height: Integer): Boolean;
- var
- ISize, JSize, Num: Integer;
- IsCorrect: Boolean;
- MatrixFile: TextFile;
- begin
- ISize := 0;
- JSize := 0;
- IsCorrect := True;
- AssignFile(MatrixFile, Path);
- Reset(MatrixFile);
- while not(SeekEof(MatrixFile)) and IsCorrect do
- begin
- inc(ISize);
- while not(SeekEoln(MatrixFile)) and IsCorrect do
- begin
- try
- Read(MatrixFile, Num);
- except
- IsCorrect := False;
- end;
- inc(JSize);
- end;
- Readln(MatrixFile);
- if (JSize <> Width) then
- IsCorrect := False;
- JSize := 0;
- end;
- if ISize <> Height then
- IsCorrect := False;
- CloseFile(MatrixFile);
- IsFileCorrect := IsCorrect;
- end;
- function GetMatrixFilePath(Width, Height: Integer): String;
- var
- Path: String;
- IsCorrect: Boolean;
- begin
- repeat
- Writeln('Введите абсолютный путь к файлу ');
- Readln(Path);
- IsCorrect := False;
- if FileExists(Path) then
- begin
- if IsFileCorrect(Path, Width, Height) then
- IsCorrect := True
- else
- Writeln('Данные в файле некорректны');
- end
- else
- Writeln('Файл не найден');
- until IsCorrect;
- GetMatrixFilePath := Path;
- end;
- function GetMatrixFromFile(Width, Height: Integer): Matrix;
- var
- Ret: Matrix;
- I, J: Integer;
- FilePath: string;
- MatrixFile: TextFile;
- begin
- SetLength(Ret, Width, Height);
- FilePath := GetMatrixFilePath(Width, Height);
- AssignFile(MatrixFile, FilePath);
- Reset(MatrixFile);
- for I := 0 to High(Ret[0]) do
- begin
- for J := 0 to High(Ret) do
- Read(MatrixFile, Ret[J, I]);
- Readln(MatrixFile);
- end;
- CloseFile(MatrixFile);
- GetMatrixFromFile := Ret;
- end;
- function GetInputType(): String;
- var
- Ret: string;
- IsCorrect: Boolean;
- begin
- IsCorrect := False;
- repeat
- Writeln('Выберите способ задания матрицы файл/консоль (ф/к)');
- Readln(Ret);
- if (Ret = 'ф') or (Ret = 'Ф') or (Ret = 'Файл') or (Ret = 'файл') then
- begin
- Ret := 'File';
- IsCorrect := True;
- end
- else if (Ret = 'к') or (Ret = 'К') or (Ret = 'Консоль') or
- (Ret = 'консоль') then
- begin
- Ret := 'Console';
- IsCorrect := True;
- end;
- until IsCorrect;
- GetInputType := Ret;
- end;
- function GetMatrix(): Matrix;
- var
- RetMatrix: Matrix;
- Width, Height: Integer;
- InputType: string;
- begin
- Width := GetMatrixSize('количество столбцов');
- Height := GetMatrixSize('количество строк');
- InputType := GetInputType();
- if (InputType = 'Console') then
- RetMatrix := GetMatrixFromConsole(Width, Height)
- else if (InputType = 'File') then
- RetMatrix := GetMatrixFromFile(Width, Height);
- GetMatrix := RetMatrix;
- end;
- function IsColumnSorted(ColumnToCheck: Column): Boolean;
- var
- Ret: Boolean;
- I: Integer;
- begin
- Ret := True;
- for I := 1 to High(ColumnToCheck) do
- if ColumnToCheck[I] < ColumnToCheck[I - 1] then
- Ret := False;
- IsColumnSorted := Ret;
- end;
- procedure PrintSortedCountToFile(Count: Integer);
- var
- OutputFile: TextFile;
- Directory: String;
- begin
- Directory := GetOutputDirectory();
- AssignFile(OutputFile, Directory + '\output.txt');
- Rewrite(OutputFile);
- Write(OutputFile,
- 'Количество столбов с элементами, отсортированными по возрастанию = ',
- Count);
- Writeln('Файл сохранён по указанному пути');
- CloseFile(OutputFile);
- end;
- procedure PrintSortedCount(Count: Integer);
- begin
- Writeln('Количество столбов с элементами, отсортированными по возрастанию = ',
- Count);
- end;
- procedure GetSortedCount(MatrixToCheck: Matrix);
- var
- Count, I: Integer;
- begin
- Count := 0;
- for I := 0 to High(MatrixToCheck) do
- if IsColumnSorted(MatrixToCheck[I]) then
- inc(Count);
- PrintSortedCount(Count);
- PrintSortedCountToFile(Count);
- end;
- Var
- MainMatrix: Matrix;
- begin
- MainMatrix := GetMatrix();
- GetSortedCount(MainMatrix);
- Readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement