Advertisement
gguuppyy

лаба2н3

Nov 2nd, 2023 (edited)
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.52 KB | Source Code | 0 0
  1. Program Laba2_3;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TMatrix = Array Of Array Of Integer;
  8.     TArr = Array Of Integer;
  9.  
  10. Const
  11.     MIN_MAT = 1;
  12.     MAX_MAT = 10;
  13.     YES = 1;
  14.     NO = 2;
  15.  
  16. Procedure WriteTask();
  17. Begin
  18.     Writeln('Данная программа находит количество хорошистов в группе (оценки не ниже шестерки, но  не все выше восьмерки).');
  19. End;
  20.  
  21. Function ChooseFileInput(): Boolean;
  22. Var
  23.     IsFileInput: Integer;
  24.     IsCorrect, Choose: Boolean;
  25. Begin
  26.     Repeat
  27.         Writeln('Вы хотите вводить матрицу через файл? (Да - ', YES,
  28.           ' / Нет - ', NO, ')');
  29.         Try
  30.             ReadLn(IsFileInput);
  31.             IsCorrect := True;
  32.         Except
  33.             Writeln('Некорректный выбор!');
  34.         End;
  35.         If IsCorrect Then
  36.         Begin
  37.             If IsFileInput = YES Then
  38.                 Choose := True
  39.             Else If IsFileInput = NO Then
  40.                 Choose := False
  41.             Else
  42.             Begin
  43.                 IsCorrect := False;
  44.                 Writeln('Некорректный выбор!');
  45.             End;
  46.         End;
  47.     Until IsCorrect;
  48.     ChooseFileInput := Choose;
  49. End;
  50.  
  51. Function ChooseFileOutput(): Boolean;
  52. Var
  53.     IsFileInput: Integer;
  54.     IsCorrect, Choose: Boolean;
  55. Begin
  56.     Repeat
  57.         Writeln('Вы хотите выводить матрицу через файл? (Да - ', YES,
  58.           ' / Нет - ', NO, ')');
  59.         Try
  60.             ReadLn(IsFileInput);
  61.             IsCorrect := True;
  62.         Except
  63.             Writeln('Некорректный выбор!');
  64.         End;
  65.         If IsCorrect Then
  66.         Begin
  67.             If IsFileInput = YES Then
  68.                 Choose := True
  69.             Else If IsFileInput = NO Then
  70.                 Choose := False
  71.             Else
  72.             Begin
  73.                 IsCorrect := False;
  74.                 Writeln('Некорректный выбор!');
  75.             End;
  76.         End;
  77.     Until IsCorrect;
  78.     ChooseFileOutput := Choose;
  79. End;
  80.  
  81. Function FileInputPath(IsFileForRead: Boolean): String;
  82. Var
  83.     Path: String;
  84.     IsCorrect: Boolean;
  85.     F: TextFile;
  86. Begin
  87.     If (IsFileForRead) Then
  88.         Write('Введите путь к файлу для чтения: ')
  89.     Else
  90.         Write('Введите путь к файлу для записи: ');
  91.     Repeat
  92.         IsCorrect := True;
  93.         ReadLn(Path);
  94.         AssignFile(F, Path);
  95.         If Not(FileExists(Path)) Then
  96.         Begin
  97.             IsCorrect := False;
  98.             Writeln('Файл не найден. Повторите попытку.');
  99.         End;
  100.     Until (IsCorrect);
  101.     FileInputPath := Path;
  102. End;
  103.  
  104. Function ReadInputMatrix(FilePath: String): TMatrix;
  105. Var
  106.     Rows, Cols, I, J: Integer;
  107.     Matrix: TMatrix;
  108.     F: TextFile;
  109.     IsCorrect, IsFileForRead: Boolean;
  110. Begin
  111.     IsFileForRead := True;
  112.     Repeat
  113.         IsCorrect := True;
  114.         AssignFile(F, FilePath);
  115.         Reset(F);
  116.  
  117.         If IsCorrect Then
  118.         Begin
  119.             Try
  120.                 ReadLn(F, Rows, Cols);
  121.                 SetLength(Matrix, Rows, Cols);
  122.             Except
  123.                 Writeln('Ошибка! Найдено некорректное значение элемента матрицы.');
  124.                 IsCorrect := False;
  125.             End;
  126.         End;
  127.  
  128.         I := 0;
  129.         While (IsCorrect) and (I < Rows) Do
  130.         Begin
  131.             J := 0;
  132.             While (IsCorrect) and (J < Cols) Do
  133.             Begin
  134.                 Try
  135.                     Read(F, Matrix[I][J]);
  136.                 Except
  137.                     Writeln('Ошибка! Найдено некорректное значение элемента матрицы.');
  138.                     IsCorrect := False;
  139.                     Dec(I);
  140.                 End;
  141.                 Inc(J);
  142.             End;
  143.             ReadLn(F);
  144.             Inc(I);
  145.         End;
  146.  
  147.         If not IsCorrect Then
  148.         Begin
  149.             Writeln('Проверьте правильность введённых данных и повторите попытку.');
  150.             FilePath := FileInputPath(IsFileForRead);
  151.             AssignFile(F, FilePath);
  152.         End;
  153.     Until IsCorrect;
  154.  
  155.     CloseFile(F);
  156.     ReadInputMatrix := Matrix;
  157. End;
  158.  
  159. Function ConsoleMatrixCreation(): TMatrix;
  160. Const
  161.     MIN_ELEMENT = 1;
  162.     MAX_ELEMENT = 10;
  163. Var
  164.     I, J, Order, Col: Integer;
  165.     IsCorrect: Boolean;
  166.     Matrix: TMatrix;
  167. Begin
  168.     repeat
  169.         Writeln('Введите количество строк и столбцов матрицы.');
  170.         IsCorrect := True;
  171.         Try
  172.             ReadLn(Order);
  173.             ReadLn(Col);
  174.         Except
  175.             Writeln('Ошибка ввода! Повторите попытку.');
  176.             IsCorrect := False;
  177.         End;
  178.         If IsCorrect And (Order <= 0) Then
  179.         Begin
  180.             Writeln('Ошибка ввода! Повторите попытку.');
  181.             IsCorrect := False;
  182.         End;
  183.     Until IsCorrect;
  184.  
  185.     SetLength(Matrix, Order, Col);
  186.  
  187.     For I := 0 To High(Matrix) Do
  188.     Begin
  189.         For J := 0 to High(Matrix[I]) Do
  190.         Begin
  191.             Repeat
  192.                 Writeln('Введите ', J + 1, ' элемент ', I + 1, ' строки');
  193.                 IsCorrect := True;
  194.                 Try
  195.                     ReadLn(Matrix[I][J]);
  196.                 Except
  197.                     Writeln('Ошибка ввода! Повторите попытку...');
  198.                     IsCorrect := False;
  199.                 End;
  200.                 If IsCorrect And ((Matrix[I][J] < MIN_ELEMENT) Or
  201.                   (Matrix[I][J] > MAX_ELEMENT)) Then
  202.                 Begin
  203.                     Writeln('Ошибка ввода! Введено число в неверном диапазоне.');
  204.                     IsCorrect := False;
  205.                 End;
  206.             Until IsCorrect;
  207.         End;
  208.     End;
  209.  
  210.     ConsoleMatrixCreation := Matrix;
  211. End;
  212.  
  213. Procedure ConsolMatrixOutput(Matrix: TMatrix);
  214. Var
  215.     I, J: Integer;
  216. Begin
  217.     Writeln('Исходная матрица:');
  218.     For I := 0 To High(Matrix) Do
  219.     Begin
  220.         For J := 0 To High(Matrix[I]) Do
  221.             Write(Matrix[I][J], ' ');
  222.         Writeln;
  223.     End;
  224. End;
  225.  
  226. Procedure ConsolArrMarkOutput(MarkArr: TArr; Sum: Integer);
  227. Var
  228.     I, J: Integer;
  229. Begin
  230.     Writeln;
  231.     Write('Номера хорошистов: ');
  232.     For I := 0 To High(MarkArr) Do
  233.     Begin
  234.         Write(MarkArr[I], ' ');
  235.     End;
  236.     Writeln;
  237.     Write('Сумма хорошистов: ', Sum);
  238. End;
  239.  
  240. Function SearchGoodStudent(Matrix: TMatrix): TArr;
  241. Var
  242.     Rows, EightGradeCounter, SixGradeCounter, CheckGradeCounter, Search, I,
  243.       J: Integer;
  244.     GoodStudents: TArr;
  245. Begin
  246.     Search := 0;
  247.     SetLength(GoodStudents, 0);
  248.  
  249.     For I := 0 to High(Matrix) Do
  250.     Begin
  251.         EightGradeCounter := 0;
  252.         SixGradeCounter := 0;
  253.         CheckGradeCounter := 0;
  254.         For J := 0 to High(Matrix[0]) Do
  255.         Begin
  256.             If (Matrix[I][J] > 5) Then
  257.             Begin
  258.                 Inc(SixGradeCounter);
  259.             End;
  260.  
  261.             If (Matrix[I][J] <= 8) Then
  262.             Begin
  263.                 Inc(EightGradeCounter);
  264.             End;
  265.  
  266.             If (Matrix[I][J] <= 5) Then
  267.             Begin
  268.                 Inc(CheckGradeCounter);
  269.             End;
  270.  
  271.         End;
  272.         If (SixGradeCounter > 0) And (EightGradeCounter > 0) And
  273.           (CheckGradeCounter = 0) Then
  274.         Begin
  275.             SetLength(GoodStudents, Length(GoodStudents) + 1);
  276.             GoodStudents[High(GoodStudents)] := I + 1;
  277.         End
  278.     End;
  279.  
  280.     SearchGoodStudent := GoodStudents;
  281. End;
  282.  
  283. Function SearchForGoodStudents(Arr: TMatrix): Integer;
  284. Var
  285.     Rows, EightGradeCounter, SixGradeCounter, CheckGradeCounter, Search, I,
  286.     J: Integer;
  287. Begin
  288.     Search := 0;
  289.     For I := 0 To High(Arr) Do
  290.     Begin
  291.         EightGradeCounter := 0;
  292.         SixGradeCounter := 0;
  293.         CheckGradeCounter := 0;
  294.         For J := 0 To High(Arr[0]) Do
  295.         Begin
  296.             If (Arr[I][J] > 5) Then
  297.             Begin
  298.                 Inc(SixGradeCounter);
  299.             End;
  300.  
  301.             If (Arr[I][J] < 9) Then
  302.             Begin
  303.                 Inc(EightGradeCounter);
  304.             End;
  305.  
  306.             If (Arr[I][J] < 6) Then
  307.             Begin
  308.                 Inc(CheckGradeCounter);
  309.             End;
  310.         End;
  311.         If ((SixGradeCounter = Length(Arr[0])) And (EightGradeCounter > 0) And
  312.           (CheckGradeCounter = 0)) Then
  313.             Inc(Search);
  314.     End;
  315.     SearchForGoodStudents := Search;
  316. End;
  317.  
  318. Procedure SaveResultInFile(Matrix: TMatrix; MarkArr: TArr; FilePath: String;
  319.   Sum: Integer);
  320. Var
  321.     F: TextFile;
  322.     I, J: Integer;
  323.     IsCorrect: Boolean;
  324. Begin
  325.     Repeat
  326.         IsCorrect := True;
  327.         AssignFile(F, FilePath);
  328.         Try
  329.             ReWrite(F);
  330.         Except
  331.             Writeln('Не удалось открыть файл. Повторите попытку.');
  332.             IsCorrect := False;
  333.         End;
  334.     Until (IsCorrect);
  335.  
  336.     For I := 0 To High(Matrix) Do
  337.     Begin
  338.         For J := 0 To High(Matrix) Do
  339.         Begin
  340.             Write(F, Matrix[I][J], ' ');
  341.         End;
  342.         Writeln(F);
  343.     End;
  344.  
  345.     Writeln;
  346.     Write(F, 'Номера хорошистов: ');
  347.     For I := 0 To High(MarkArr) Do
  348.     Begin
  349.         Write(F, MarkArr[I], ' ');
  350.     End;
  351.     Writeln(F);
  352.     Write(F, 'Сумма хорошистов: ', Sum);
  353.     Writeln;
  354.  
  355.     CloseFile(F);
  356. End;
  357.  
  358. Procedure ChoiseInput();
  359. Var
  360.     Put, Putout: String;
  361.     Art: TMatrix;
  362.     AA: TArr;
  363.     Sum: Integer;
  364.     Input, Output: Boolean;
  365. Begin
  366.     Input := ChooseFileInput();
  367.  
  368.     If Input = True Then
  369.     Begin
  370.         Put := FileInputPath(Input);
  371.         Art := ReadInputMatrix(Put);
  372.         AA := SearchGoodStudent(Art);
  373.     End;
  374.  
  375.     If Input = False Then
  376.     Begin
  377.         Art := ConsoleMatrixCreation();
  378.         AA := SearchGoodStudent(Art);
  379.     End;
  380.  
  381.     Output := ChooseFileOutput();
  382.  
  383.     If Output = True Then
  384.     Begin
  385.         Putout := FileInputPath(False);
  386.         Sum := SearchForGoodStudents(Art);
  387.         SaveResultInFile(Art, AA, Putout, Sum);
  388.     End;
  389.  
  390.     If Output = False Then
  391.     Begin
  392.         ConsolMatrixOutput(Art);
  393.         Sum := SearchForGoodStudents(Art);
  394.         ConsolArrMarkOutput(AA, Sum);
  395.     End;
  396.  
  397. End;
  398.  
  399. Begin
  400.     WriteTask();
  401.     ChoiseInput();
  402.     ReadLn;
  403.  
  404. End.
  405.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement