Advertisement
nblknn

Abobus 2.4

Oct 31st, 2023 (edited)
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 14.19 KB | None | 0 0
  1. Program zzz2_4;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TMatrix = Array Of Array Of Integer;
  8.     TArrOI = Array Of Integer;
  9.  
  10. Const
  11.     MINSIZE = 2;
  12.     MAXSIZE = 10;
  13.     MIN = -1000;
  14.     MAX = 1000;
  15.  
  16. Function CheckInput(MINNUM, MAXNUM: Integer; OutputMessage: String): Integer;
  17. Var
  18.     Num: Integer;
  19.     IsCorrect: Boolean;
  20. Begin
  21.     Repeat
  22.         IsCorrect := True;
  23.         Write(OutputMessage);
  24.         Try
  25.             Readln(Num);
  26.         Except
  27.             IsCorrect := False;
  28.             Writeln('Введенные данные не соответствуют условию. Повторите попытку.');
  29.         End;
  30.         If IsCorrect And ((Num < MINNUM) Or (Num > MAXNUM)) Then
  31.         Begin
  32.             IsCorrect := False;
  33.             Writeln('Введенные данные не соответствуют условию. Повторите попытку.');
  34.         End;
  35.     Until (IsCorrect);
  36.     CheckInput := Num;
  37. End;
  38.  
  39. Function InputMatrix(Matrix: TMatrix): TMatrix;
  40. Var
  41.     I, J: Integer;
  42.     IsCorrect: Boolean;
  43. Begin
  44.     Writeln('Введите матрицу.');
  45.     For I := 0 To High(Matrix) Do
  46.         For J := 0 To High(Matrix[I]) Do
  47.         Begin
  48.             Write('Введите элемент ', I + 1, ' строки, ', J + 1,
  49.               ' столбца матрицы: ');
  50.             Matrix[I][J] := CheckInput(MIN, MAX, '');
  51.         End;
  52.     Writeln;
  53.     InputMatrix := Matrix;
  54. End;
  55.  
  56. Function FillMatrixFromConsole(): TMatrix;
  57. Var
  58.     RowNum, ColNum: Integer;
  59.     Matrix: TMatrix;
  60. Begin
  61.     Writeln('Введите размеры матрицы (от 2 до 10).');
  62.     RowNum := CheckInput(MINSIZE, MAXSIZE,
  63.       'Введите количество строк матрицы: ');
  64.     ColNum := CheckInput(MINSIZE, MAXSIZE,
  65.       'Введите количество столбцов матрицы: ');
  66.     SetLength(Matrix, RowNum, ColNum);
  67.     Matrix := InputMatrix(Matrix);
  68.     FillMatrixFromConsole := Matrix;
  69. End;
  70.  
  71. Function CheckFilePath(Path: String): Boolean;
  72. Var
  73.     IsCorrect: Boolean;
  74. Begin
  75.     If Not FileExists(Path) Then
  76.     Begin
  77.         Writeln('Введенного файла не существует. Повторите попытку.');
  78.         IsCorrect := False;
  79.     End
  80.     Else If ExtractFileExt(Path) <> '.txt' Then
  81.     Begin
  82.         Writeln('Введенный Вами файл не является текстовым. Повторите попытку.');
  83.         IsCorrect := False;
  84.     End;
  85.     CheckFilePath := IsCorrect;
  86. End;
  87.  
  88. Function CheckFileInputPath(): String;
  89. Var
  90.     Path: String;
  91.     IsCorrect: Boolean;
  92. Begin
  93.     Repeat
  94.         IsCorrect := True;
  95.         Writeln('Введите путь к файлу, содержащему матрицу. Первой строкой должны быть введены размеры (строки и столбцы, от 2 до 10).');
  96.         Readln(Path);
  97.         IsCorrect := CheckFilePath(Path);
  98.     Until IsCorrect;
  99.     CheckFileInputPath := Path;
  100. End;
  101.  
  102. Function FillMatrixFromFile(RowNum, ColNum: Integer;
  103.   Path: String; Matrix: TMatrix): TMatrix;
  104. Var
  105.     I, J: Integer;
  106.     FIn: TextFile;
  107.     IsCorrect: Boolean;
  108. Begin
  109.     AssignFile(FIn, Path);
  110.     Repeat
  111.         IsCorrect := True;
  112.         Try
  113.             Try
  114.                 Reset(FIn);
  115.                 Read(FIn, RowNum);
  116.                 Read(FIn, ColNum);
  117.                 If (IsCorrect And (RowNum < MINSIZE) Or (RowNum > MAXSIZE) Or
  118.                   (ColNum < MINSIZE) Or (ColNum > MAXSIZE)) Then
  119.                 Begin
  120.                     Writeln('Размер в выбранном файле не соответствуют условию. Повторите попытку.');
  121.                     IsCorrect := False;
  122.                 End;
  123.                 SetLength(Matrix, RowNum, ColNum);
  124.                 I := 0;
  125.                 While ((I < RowNum) And IsCorrect) Do
  126.                 Begin
  127.                     J := 0;
  128.                     While ((J < ColNum) And IsCorrect) Do
  129.                     Begin
  130.                         If Eof(FIn) Then
  131.                         Begin
  132.                             Writeln('Размер введенной матрицы не соответствует заданному. Повторите попытку.');
  133.                             IsCorrect := False;
  134.                         End;
  135.                         Read(FIn, Matrix[I][J]);
  136.                         If (IsCorrect And ((Matrix[I][J] < MIN) Or
  137.                           (Matrix[I][J] > MAX))) Then
  138.                         Begin
  139.                             Writeln('Данные выбранного файла не соответствуют условию. Повторите попытку.');
  140.                             IsCorrect := False;
  141.                         End;
  142.                         Inc(J);
  143.                     End;
  144.                     Inc(I);
  145.                 End;
  146.                 If (IsCorrect And (Not Eof(FIn))) Then
  147.                 Begin
  148.                     Writeln('Размер введенной матрицы не соответствует заданному. Повторите попытку.');
  149.                     IsCorrect := False;
  150.                 End;
  151.             Finally
  152.                 CloseFile(FIn);
  153.             End;
  154.         Except
  155.             Writeln('Данные выбранного файла не соответствуют условию. Повторите попытку.');
  156.             IsCorrect := False;
  157.         End;
  158.         If Not IsCorrect Then
  159.             Path := CheckFileInputPath();
  160.     Until IsCorrect;
  161.     Writeln('Данные из файла успешно считаны.');
  162.     Writeln;
  163.     FillMatrixFromFile := Matrix;
  164. End;
  165.  
  166. Procedure OutputMatrix(Matrix: TMatrix);
  167. Var
  168.     I, J: Integer;
  169. Begin
  170.     For I := 0 To High(Matrix) Do
  171.     Begin
  172.         For J := 0 To High(Matrix[0]) Do
  173.             Write(Matrix[I][J], ' ');
  174.         Writeln;
  175.     End;
  176. End;
  177.  
  178. Function FindZeroAmountOfEachRow(Matrix: TMatrix): TArrOI;
  179. Var
  180.     I, J: Integer;
  181.     ZeroAmount: TArrOI;
  182. Begin
  183.     SetLength(ZeroAmount, High(Matrix) + 1);
  184.     For I := 0 To High(Matrix) Do
  185.     Begin
  186.         ZeroAmount[I] := 0;
  187.         For J := 0 To High(Matrix[I]) Do
  188.             If Matrix[I][J] = 0 Then
  189.                 Inc(ZeroAmount[I]);
  190.     End;
  191.     FindZeroAmountOfEachRow := ZeroAmount;
  192. End;
  193.  
  194. Function FindMaxZeroAmount(ZeroAmount: TArrOI): Integer;
  195. Var
  196.     I, MaxZeroAmount: Integer;
  197. Begin
  198.     MaxZeroAmount := ZeroAmount[0];
  199.     For I := 1 To High(ZeroAmount) Do
  200.         If ZeroAmount[I] > MaxZeroAmount Then
  201.             MaxZeroAmount := ZeroAmount[I];
  202.     FindMaxZeroAmount := MaxZeroAmount;
  203. End;
  204.  
  205. Function FindNumOfMaxZeroRows(MaxZeroAmount: Integer;
  206.   ZeroAmount: TArrOI): Integer;
  207. Var
  208.     I, MaxZeroRows: Integer;
  209. Begin
  210.     MaxZeroRows := 0;
  211.     For I := 0 To High(ZeroAmount) Do
  212.         If ZeroAmount[I] = MaxZeroAmount Then
  213.             Inc(MaxZeroRows);
  214.     FindNumOfMaxZeroRows := MaxZeroRows;
  215. End;
  216.  
  217. Function FindMaxZeroRowIndex(MaxZeroRows, MaxZeroAmount: Integer;
  218.   ZeroAmount: TArrOI): Integer;
  219. Var
  220.     I, Index: Integer;
  221. Begin
  222.     For I := 0 To High(ZeroAmount) Do
  223.         If ZeroAmount[I] = MaxZeroAmount Then
  224.             Index := I;
  225.     FindMaxZeroRowIndex := Index;
  226. End;
  227.  
  228. Function FindMaxZeroRowIndexArray(MaxZeroRows, MaxZeroAmount: Integer;
  229.   ZeroAmount: TArrOI): TArrOI;
  230. Var
  231.     I, J: Integer;
  232.     Index: TArrOI;
  233. Begin
  234.     SetLength(Index, MaxZeroRows);
  235.     J := 0;
  236.     For I := 0 To High(ZeroAmount) Do
  237.         If ZeroAmount[I] = MaxZeroAmount Then
  238.         Begin
  239.             Index[J] := I;
  240.             Inc(J);
  241.         End;
  242.     FindMaxZeroRowIndexArray := Index;
  243. End;
  244.  
  245. Function CheckFileOutputPath(): String;
  246. Var
  247.     Path: String;
  248.     IsCorrect: Boolean;
  249. Begin
  250.     Writeln;
  251.     Repeat
  252.         IsCorrect := True;
  253.         Writeln('Введите путь к файлу, в который нужно записать результат.');
  254.         Readln(Path);
  255.         IsCorrect := CheckFilePath(Path);
  256.         If IsCorrect And FileIsReadOnly(Path) Then
  257.         Begin
  258.             Writeln('Введенный Вами файл доступен только для чтения. Повторите попытку.');
  259.             IsCorrect := False;
  260.         End;
  261.     Until IsCorrect;
  262.     CheckFileOutputPath := Path;
  263. End;
  264.  
  265. Procedure WriteResultIntoFile(MaxZeroAmount, MaxZeroRows, Index: Integer;
  266.   IndexArray, ZeroAmount: TArrOI; Matrix: TMatrix; Path: String);
  267. Var
  268.     I, J: Integer;
  269.     IsCorrect: Boolean;
  270.     FOut: TextFile;
  271. Begin
  272.     Repeat
  273.         IsCorrect := True;
  274.         Assign(FOut, Path);
  275.         Try
  276.             Try
  277.                 Rewrite(FOut);
  278.                 If (MaxZeroAmount = 0) Then
  279.                     Writeln(FOut, 'В матрице нет строк с нулевыми элементами.')
  280.                 Else If (MaxZeroRows = 1) Then
  281.                 Begin
  282.                     Index := FindMaxZeroRowIndex(MaxZeroRows, MaxZeroAmount,
  283.                       ZeroAmount);
  284.                     Write(FOut,
  285.                       'Строка с максимальным количеством нулевых элементов: ');
  286.                     For J := 0 To High(Matrix[0]) Do
  287.                         Write(FOut, Matrix[Index][J], ' ');
  288.                 End
  289.                 Else If ((MaxZeroRows = (High(Matrix) + 1)) And
  290.                   (MaxZeroAmount = (High(Matrix[0]) + 1))) Then
  291.                     Writeln(FOut, 'Все элементы матрицы - нулевые элементы.')
  292.                 Else
  293.                 Begin
  294.                     IndexArray := FindMaxZeroRowIndexArray(MaxZeroRows,
  295.                       MaxZeroAmount, ZeroAmount);
  296.                     Writeln(FOut,
  297.                       'Строки с максимальным количеством нулевых элементов: ');
  298.                     For I := 0 To High(IndexArray) Do
  299.                     Begin
  300.                         For J := 0 To High(Matrix[0]) Do
  301.                             Write(FOut, Matrix[IndexArray[I]][J], ' ');
  302.                         Writeln(FOut);
  303.                     End;
  304.                 End;
  305.             Finally
  306.                 CloseFile(FOut);
  307.             End;
  308.         Except
  309.             Writeln('Произошла ошибка. Повторите попытку.');
  310.             IsCorrect := False;
  311.             Path := CheckFileOutputPath();
  312.         End;
  313.     Until IsCorrect;
  314.     Writeln('Результат записан.');
  315. End;
  316.  
  317. Procedure OutputMaxZeroRow(Index: Integer; Matrix: TMatrix); // или можно не делить это на процедуру?
  318. Var
  319.     J: Integer;
  320. Begin
  321.     Write('Строка с максимальным количеством нулевых элементов: ');
  322.     For J := 0 To High(Matrix[0]) Do
  323.         Write(Matrix[Index][J], ' ');
  324. End;
  325.  
  326. Procedure OutputMaxZeroRows(Index: TArrOI; Matrix: TMatrix); // и это
  327. Var
  328.     I, J: Integer;
  329. Begin
  330.     Writeln('Строки с максимальным количеством нулевых элементов: ');
  331.     For I := 0 To High(Index) Do
  332.     Begin
  333.         For J := 0 To High(Matrix[0]) Do
  334.             Write(Matrix[Index[I]][J], ' ');
  335.         Writeln;
  336.     End;
  337. End;
  338.  
  339. Procedure OutputResult(MaxZeroAmount, MaxZeroRows, Index: Integer;
  340.   IndexArray, ZeroAmount: TArrOI; Matrix: TMatrix);
  341. Begin
  342.     If (MaxZeroAmount = 0) Then
  343.         Writeln('В матрице нет строк с нулевыми элементами.')
  344.     Else If (MaxZeroRows = 1) Then
  345.     Begin
  346.         Index := FindMaxZeroRowIndex(MaxZeroRows, MaxZeroAmount, ZeroAmount);
  347.         OutputMaxZeroRow(Index, Matrix);
  348.     End
  349.     Else If ((MaxZeroRows = (High(Matrix) + 1)) And
  350.       (MaxZeroAmount = (High(Matrix[0]) + 1))) Then
  351.         Writeln('Все элементы матрицы - нулевые элементы.')
  352.     Else
  353.     Begin
  354.         IndexArray := FindMaxZeroRowIndexArray(MaxZeroRows, MaxZeroAmount,
  355.           ZeroAmount);
  356.         OutputMaxZeroRows(IndexArray, Matrix);
  357.     End;
  358. End;
  359.  
  360. Function CheckChoiceInput(): Integer;
  361. Var
  362.     Num: Integer;
  363.     IsCorrect: Boolean;
  364. Begin
  365.     Repeat
  366.         IsCorrect := True;
  367.         Try
  368.             Readln(Num);
  369.         Except
  370.             IsCorrect := False;
  371.             Writeln('Введенные данные не соответствуют условию. Повторите попытку.');
  372.         End;
  373.         If IsCorrect And ((Num <> 0) And (Num <> 1)) Then
  374.         Begin
  375.             IsCorrect := False;
  376.             Writeln('Введенные данные не соответствуют условию. Повторите попытку.');
  377.         End;
  378.     Until (IsCorrect);
  379.     CheckChoiceInput := Num;
  380. End;
  381.  
  382. Procedure WriteCondition();
  383. Begin
  384.     Writeln('Данная программа находит строку матрицы, в которой больше всего нулевых элементов.');
  385.     Writeln('Элементы матрицы - целые числа от -1000 до 1000.');
  386. End;
  387.  
  388. Var
  389.     RowNum, ColNum, MaxZeroAmount, MaxZeroRows, Index, Choice: Integer;
  390.     ZeroAmount, IndexArray: TArrOI;
  391.     Matrix, MaxZero: TMatrix;
  392.     FInPath, FOutPath: String;
  393.  
  394. Begin
  395.     WriteCondition();
  396.     Writeln('Введите 0, если хотите вводить через консоль, и 1, если нужно использовать файл.');
  397.     Choice := CheckChoiceInput();
  398.     If Choice = 0 Then
  399.         Matrix := FillMatrixFromConsole()
  400.     Else
  401.     Begin
  402.         FInPath := CheckFileInputPath();
  403.         Matrix := FillMatrixFromFile(RowNum, ColNum, FInPath, Matrix);
  404.     End;
  405.     Writeln('Введенная матрица:');
  406.     OutputMatrix(Matrix);
  407.     ZeroAmount := FindZeroAmountOfEachRow(Matrix);
  408.     MaxZeroAmount := FindMaxZeroAmount(ZeroAmount);
  409.     MaxZeroRows := FindNumOfMaxZeroRows(MaxZeroAmount, ZeroAmount);
  410.     If Choice = 0 Then
  411.         OutputResult(MaxZeroAmount, MaxZeroRows, Index, IndexArray,
  412.           ZeroAmount, Matrix)
  413.     Else
  414.     Begin
  415.         FOutPath := CheckFileOutputPath();
  416.         WriteResultIntoFile(MaxZeroAmount, MaxZeroRows, Index, IndexArray,
  417.           ZeroAmount, Matrix, FOutPath);
  418.     End;
  419.     Readln;
  420.  
  421. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement