Advertisement
deced

Untitled

Oct 27th, 2020
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.67 KB | None | 0 0
  1. program Lab2_3;
  2.  
  3. uses
  4.     System.SysUtils;
  5.  
  6. type
  7.     Column = array of Integer;
  8.     Matrix = array of Column;
  9.  
  10. function GetMatrixSize(Message: string): Integer;
  11. var
  12.     Ret: Integer;
  13.     IsCorrect: Boolean;
  14. begin
  15.     repeat
  16.         Writeln('Введите ', Message, ' матрицы');
  17.         IsCorrect := True;
  18.         try
  19.             Readln(Ret)
  20.         except
  21.             IsCorrect := False;
  22.             Writeln(Message, ' должно быть числом')
  23.         end;
  24.         if (((Ret < 1) or (Ret > 10000)) and IsCorrect) then
  25.         begin
  26.             Writeln(Message, ' должно промежутку от 1 до 10000');
  27.             IsCorrect := False
  28.         end;
  29.     until IsCorrect;
  30.     GetMatrixSize := Ret;
  31. end;
  32.  
  33. function GetOutputDirectory(): String;
  34. var
  35.     Ret: String;
  36.     IsCorrect: Boolean;
  37. begin
  38.     IsCorrect := False;
  39.     repeat
  40.         Writeln('Введите директорию, в которую хотите сохранить матрицу');
  41.         Readln(Ret);
  42.         if DirectoryExists(Ret) then
  43.             IsCorrect := True
  44.         else
  45.             Writeln('Такой директории не существует.Попробуйте ещё раз');
  46.     until IsCorrect;
  47.     GetOutputDirectory := Ret;
  48. end;
  49.  
  50. function GetMatrixItem(I, J: Integer): Integer;
  51. var
  52.     Ret: Integer;
  53.     IsCorrect: Boolean;
  54. begin
  55.     repeat
  56.         Writeln('Введите значение элемента матрицы [', I, ',', J, ']');
  57.         IsCorrect := True;
  58.         try
  59.             Readln(Ret)
  60.         except
  61.             IsCorrect := False;
  62.             Writeln('Значение матрицы должно быть числом')
  63.         end;
  64.     until IsCorrect;
  65.     GetMatrixItem := Ret;
  66. end;
  67.  
  68. function GetMatrixFromConsole(Width, Height: Integer): Matrix;
  69. var
  70.     Ret: Matrix;
  71.     I, J: Integer;
  72. begin
  73.     SetLength(Ret, Width, Height);
  74.     for I := 0 to High(Ret) do
  75.         for J := 0 to High(Ret[I]) do
  76.             Ret[I, J] := GetMatrixItem(I, J);
  77.     GetMatrixFromConsole := Ret;
  78. end;
  79.  
  80. function IsFileCorrect(Path: String; Width, Height: Integer): Boolean;
  81. var
  82.     ISize, JSize, Num: Integer;
  83.     IsCorrect: Boolean;
  84.     MatrixFile: TextFile;
  85. begin
  86.     ISize := 0;
  87.     JSize := 0;
  88.     IsCorrect := True;
  89.     AssignFile(MatrixFile, Path);
  90.     Reset(MatrixFile);
  91.     while not(SeekEof(MatrixFile)) and IsCorrect do
  92.     begin
  93.         inc(ISize);
  94.         while not(SeekEoln(MatrixFile)) and IsCorrect do
  95.         begin
  96.             try
  97.                 Read(MatrixFile, Num);
  98.             except
  99.                 IsCorrect := False;
  100.             end;
  101.             inc(JSize);
  102.         end;
  103.         Readln(MatrixFile);
  104.         if (JSize <> Width) then
  105.             IsCorrect := False;
  106.         JSize := 0;
  107.     end;
  108.     if ISize <> Height then
  109.         IsCorrect := False;
  110.     CloseFile(MatrixFile);
  111.     IsFileCorrect := IsCorrect;
  112. end;
  113.  
  114. function GetMatrixFilePath(Width, Height: Integer): String;
  115. var
  116.     Path: String;
  117.     IsCorrect: Boolean;
  118. begin
  119.     repeat
  120.         Writeln('Введите абсолютный путь к файлу ');
  121.         Readln(Path);
  122.         IsCorrect := False;
  123.         if FileExists(Path) then
  124.         begin
  125.             if IsFileCorrect(Path, Width, Height) then
  126.                 IsCorrect := True
  127.             else
  128.                 Writeln('Данные в файле некорректны');
  129.         end
  130.         else
  131.             Writeln('Файл не найден');
  132.  
  133.     until IsCorrect;
  134.     GetMatrixFilePath := Path;
  135. end;
  136.  
  137. function GetMatrixFromFile(Width, Height: Integer): Matrix;
  138. var
  139.     Ret: Matrix;
  140.     I, J: Integer;
  141.     FilePath: string;
  142.     MatrixFile: TextFile;
  143. begin
  144.     SetLength(Ret, Width, Height);
  145.     FilePath := GetMatrixFilePath(Width, Height);
  146.     AssignFile(MatrixFile, FilePath);
  147.     Reset(MatrixFile);
  148.     for I := 0 to High(Ret[0]) do
  149.     begin
  150.         for J := 0 to High(Ret) do
  151.             Read(MatrixFile, Ret[J, I]);
  152.         Readln(MatrixFile);
  153.     end;
  154.     CloseFile(MatrixFile);
  155.     GetMatrixFromFile := Ret;
  156. end;
  157.  
  158. function GetInputType(): String;
  159.  
  160. var
  161.     Ret: string;
  162.     IsCorrect: Boolean;
  163. begin
  164.     IsCorrect := False;
  165.     repeat
  166.         Writeln('Выберите способ задания матрицы файл/консоль (ф/к)');
  167.         Readln(Ret);
  168.         if (Ret = 'ф') or (Ret = 'Ф') or (Ret = 'Файл') or (Ret = 'файл') then
  169.         begin
  170.             Ret := 'File';
  171.             IsCorrect := True;
  172.         end
  173.         else if (Ret = 'к') or (Ret = 'К') or (Ret = 'Консоль') or
  174.           (Ret = 'консоль') then
  175.         begin
  176.             Ret := 'Console';
  177.             IsCorrect := True;
  178.         end;
  179.     until IsCorrect;
  180.     GetInputType := Ret;
  181. end;
  182.  
  183. function GetMatrix(): Matrix;
  184. var
  185.     RetMatrix: Matrix;
  186.     Width, Height: Integer;
  187.     InputType: string;
  188. begin
  189.     Width := GetMatrixSize('количество столбцов');
  190.     Height := GetMatrixSize('количество строк');
  191.     InputType := GetInputType();
  192.     if (InputType = 'Console') then
  193.         RetMatrix := GetMatrixFromConsole(Width, Height)
  194.     else if (InputType = 'File') then
  195.         RetMatrix := GetMatrixFromFile(Width, Height);
  196.     GetMatrix := RetMatrix;
  197. end;
  198.  
  199. function IsColumnSorted(ColumnToCheck: Column): Boolean;
  200. var
  201.     Ret: Boolean;
  202.     I: Integer;
  203. begin
  204.     Ret := True;
  205.     for I := 1 to High(ColumnToCheck) do
  206.         if ColumnToCheck[I] < ColumnToCheck[I - 1] then
  207.             Ret := False;
  208.     IsColumnSorted := Ret;
  209. end;
  210.  
  211. procedure PrintSortedCountToFile(Count: Integer);
  212. var
  213.     OutputFile: TextFile;
  214.     Directory: String;
  215. begin
  216.     Directory := GetOutputDirectory();
  217.     AssignFile(OutputFile, Directory + '\output.txt');
  218.     Rewrite(OutputFile);
  219.     Write(OutputFile,
  220.       'Количество столбов с элементами, отсортированными по возрастанию = ',
  221.       Count);
  222.     Writeln('Файл сохранён по указанному пути');
  223.     CloseFile(OutputFile);
  224. end;
  225.  
  226. procedure PrintSortedCount(Count: Integer);
  227. begin
  228.     Writeln('Количество столбов с элементами, отсортированными по возрастанию = ',
  229.       Count);
  230. end;
  231.  
  232. procedure GetSortedCount(MatrixToCheck: Matrix);
  233. var
  234.     Count, I: Integer;
  235. begin
  236.     Count := 0;
  237.     for I := 0 to High(MatrixToCheck) do
  238.         if IsColumnSorted(MatrixToCheck[I]) then
  239.             inc(Count);
  240.     PrintSortedCount(Count);
  241.     PrintSortedCountToFile(Count);
  242. end;
  243.  
  244. Var
  245.     MainMatrix: Matrix;
  246.  
  247. begin
  248.     MainMatrix := GetMatrix();
  249.     GetSortedCount(MainMatrix);
  250.     Readln;
  251.  
  252. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement