Advertisement
gguuppyy

лаба2н3(неправ)

Oct 25th, 2023 (edited)
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.41 KB | None | 0 0
  1. Program lab23;
  2.  
  3. { C:\Users\pulis\OneDrive\Рабочий стол\result.txt
  4.   C:\Users\pulis\OneDrive\Рабочий стол\points.txt }
  5. Uses
  6.     System.SysUtils,
  7.     Windows;
  8.  
  9. Type
  10.     MatrixOfInt = Array Of Array Of Integer;
  11.  
  12. Procedure WriteTask();
  13. Begin
  14.     SetConsoleCP(1251);
  15.     SetConsoleOutputCP(1251);
  16.  
  17.     Writeln('Эта программа ищет количество хорошистов в группе.');
  18. End;
  19.  
  20. Function CheckIntNumb(): Integer; // проверка на ввод натурального числа
  21. Var
  22.     IsCorrect: Boolean;
  23.     Numb: Integer;
  24. Begin
  25.     Writeln('Введите натуральное число.');
  26.     Repeat
  27.         IsCorrect := True;
  28.         Try
  29.             Readln(Numb);
  30.         Except
  31.             Writeln('Ошибка! Введите натуральное число.');
  32.             IsCorrect := False;
  33.         End;
  34.         If IsCorrect And (Numb < 0) Then
  35.         Begin
  36.             Writeln('Ошибка! Введите натуральное число.');
  37.             IsCorrect := False;
  38.         End;
  39.     Until IsCorrect;
  40.     CheckIntNumb := Numb;
  41. End;
  42.  
  43. Function CheckNumb(): Integer;
  44. Var
  45.     IsCorrect: Boolean;
  46.     Numb: Byte;
  47.     Input: String;
  48. Begin
  49.     Writeln('Введите число в диапазоне от 1 до 10. ');
  50.     Repeat
  51.         IsCorrect := True;
  52.         Readln(Input);
  53.         Try
  54.             Numb := StrToInt(Input);
  55.         Except
  56.             Writeln('Ошибка! Введите число.');
  57.             IsCorrect := False;
  58.         End;
  59.         If IsCorrect And ((Numb < 1) Or (Numb > 10)) Then
  60.         Begin
  61.             Writeln('Ошибка! Введите число в диапазоне от 1 до 10.');
  62.             IsCorrect := False;
  63.         End;
  64.     Until IsCorrect;
  65.     CheckNumb := Numb;
  66. End;
  67.  
  68. Function CheckMatrixValues(Arr: MatrixOfInt): Boolean;
  69. Var
  70.     I, J: Integer;
  71.     IsCorrect: Boolean;
  72. Begin
  73.     IsCorrect := True; // Предполагаем, что все значения допустимы
  74.  
  75.     For I := 0 To High(Arr) Do
  76.     Begin
  77.         For J := 0 To High(Arr[I]) Do
  78.         Begin
  79.             If (Arr[I, J] < 1) Or (Arr[I, J] > 10) Then
  80.             Begin
  81.                 IsCorrect := False;
  82.             End;
  83.         End;
  84.     End;
  85.  
  86.     CheckMatrixValues := IsCorrect; // Возвращаем результат проверки
  87. End;
  88.  
  89. Function CheckInputPermission(Path: String): Boolean;
  90. Var
  91.     IsCorrect: Boolean;
  92.     Fil: TextFile;
  93. Begin
  94.     AssignFile(Fil, Path);
  95.     IsCorrect := True;
  96.     Try
  97.         Reset(Fil);
  98.         Close(Fil);
  99.     Except
  100.         Writeln('Нет доступа к файлу.');
  101.         IsCorrect := False;
  102.     End;
  103.     CheckInputPermission := IsCorrect;
  104. End;
  105.  
  106. Function CheckOutputPermission(Path: String): Boolean;
  107. Var
  108.     IsCorrect: Boolean;
  109.     Fil: TextFile;
  110. Begin
  111.     AssignFile(Fil, Path);
  112.     IsCorrect := True;
  113.     Try
  114.         Rewrite(Fil);
  115.         Close(Fil);
  116.     Except
  117.         Writeln('Нет доступа к записи в файл.');
  118.         IsCorrect := False;
  119.     End;
  120.     CheckOutputPermission := IsCorrect;
  121. End;
  122.  
  123. Function ImputConsol(): MatrixOfInt; // ввод матрицы через клавиатуру
  124. Var
  125.     Arr: MatrixOfInt;
  126.     Rows, Cols: Integer;
  127. Begin
  128.     Writeln('Количество строк в матрице:');
  129.     Rows := CheckIntNumb();
  130.     Writeln('Количество столбцов в матрице:');
  131.     Cols := CheckIntNumb();
  132.     SetLength(Arr, Rows, Cols);
  133.     For Rows := 0 To High(Arr) Do
  134.         For Cols := 0 To High(Arr[0]) Do
  135.         Begin
  136.             Writeln('Введите элемент (', Rows + 1, ';', Cols + 1, ').');
  137.             Arr[Rows][Cols] := CheckNumb();
  138.         End;
  139.     ImputConsol := Arr;
  140. End;
  141.  
  142. Function InputPath(): String; // проверка пути к файлу вывода
  143. Var
  144.     Path: String;
  145.     IsCorrect: Boolean;
  146.     Fil: File;
  147. Begin
  148.     Repeat
  149.         Writeln('Введите путь к файлу.');
  150.         IsCorrect := True;
  151.         Readln(Path);
  152.         If Not FileExists(Path) Or (ExtractFileExt(Path) <> '.txt') Then
  153.         Begin
  154.             IsCorrect := False;
  155.             Writeln('Файл не найден.');
  156.         End;
  157.  
  158.     Until IsCorrect;
  159.     If IsCorrect Then
  160.     Begin
  161.         AssignFile(Fil, Path);
  162.         Try
  163.             Try
  164.                 Reset(Fil);
  165.             Except
  166.                 IsCorrect := False;
  167.                 Writeln('Нет доступа к файлу.');
  168.             End;
  169.         Finally
  170.             CloseFile(Fil);
  171.         End;
  172.     End;
  173.     InputPath := Path;
  174. End;
  175.  
  176. Function ImputFile(): MatrixOfInt; // ввод матрицы через файл
  177. Var
  178.     Arr: MatrixOfInt;
  179.     Fil: TextFile;
  180.     I, J: Integer;
  181.     Path: String;
  182.     IsCorrect: Boolean;
  183. Begin
  184.     Repeat
  185.         Path := InputPath();
  186.         AssignFile(Fil, Path);
  187.         IsCorrect := True;
  188.         I := 1;
  189.         Reset(Fil);
  190.         Try
  191.             While Not Eof(Fil) Do
  192.             Begin
  193.                 SetLength(Arr, I);
  194.                 J := 1;
  195.                 While Not Eoln(Fil) Do
  196.                 Begin
  197.                     SetLength(Arr[I - 1], J);
  198.                     Read(Fil, Arr[I - 1, J - 1]);
  199.                     Inc(J);
  200.                 End;
  201.                 Inc(I);
  202.                 Readln(Fil);
  203.  
  204.             End;
  205.  
  206. // Проверка диапазона значений элементов матрицы
  207.             If Not CheckMatrixValues(Arr) Then
  208.             Begin
  209.                 IsCorrect := False;
  210.                 Writeln('Некорректное значение в матрице.');
  211.                 Close(Fil);
  212.             End;
  213.         Except
  214.             IsCorrect := False;
  215.             Writeln('Некорректные данные в файле.');
  216.             Close(Fil);
  217.         End;
  218.     Until IsCorrect;
  219.  
  220.     Close(Fil);
  221.     ImputFile := Arr;
  222. End;
  223.  
  224. Function ChoseInput(): MatrixOfInt; // выбираем как выводить матрицу
  225. Var
  226.     Numb: Integer;
  227.     Arr: MatrixOfInt;
  228.     IsCorrect: Boolean;
  229. Begin
  230.     Writeln('Выберите способ ввода данных: eсли хотите ввести данные самостоятельно, введите 1. Если хотите ввести данные из файла - 2.');
  231.     Repeat
  232.         Numb := CheckIntNumb();
  233.         IsCorrect := True;
  234.         If Numb = 1 Then
  235.             Arr := ImputConsol()
  236.         Else If Numb = 2 Then
  237.             Arr := ImputFile()
  238.         Else
  239.         Begin
  240.             IsCorrect := False;
  241.             Writeln('Введите значение равное или 1 или 2.');
  242.         End;
  243.     Until IsCorrect;
  244.     ChoseInput := Arr
  245. End;
  246.  
  247. Function SearchForGoodStudents(Arr: MatrixOfInt): Integer; //поиск хорошистов
  248. Var
  249.     Rows, EightGradeCounter, SixGradeCounter, Search, I, J: Integer;
  250. Begin
  251.     Search := 0;
  252.     For I := 0 To High(Arr) Do
  253.     Begin
  254.         EightGradeCounter := 0;
  255.         SixGradeCounter := 0;
  256.         For J := 0 To High(Arr[0]) Do
  257.         Begin
  258.             If (Arr[I][J] > 5) Then
  259.             Begin
  260.                 Inc(SixGradeCounter);
  261.                 If (Arr[I][J] < 8) Then
  262.                     Inc(EightGradeCounter);
  263.             End;
  264.         End;
  265.         If ((SixGradeCounter = Length(Arr[0])) And (EightGradeCounter > 0)) Then
  266.             Inc(Search);
  267.     End;
  268.     SearchForGoodStudents := Search;
  269. End;
  270.  
  271. Procedure ConclConsol(Search: Integer); // вывод результата в консоль
  272. Var
  273.     I: Integer;
  274. Begin
  275.     Writeln('Число хорошистов: ', Search);
  276. End;
  277.  
  278. Function OutputPath(): String; // проверка пути к файлу вывода
  279. Var
  280.     Path: String;
  281.     IsCorrect: Boolean;
  282.     Fil: File;
  283. Begin
  284.     Repeat
  285.         Writeln('Введите путь к файлу.');
  286.         IsCorrect := True;
  287.         Readln(Path);
  288.         If Not FileExists(Path) Or (ExtractFileExt(Path) <> '.txt') Then
  289.         Begin
  290.             IsCorrect := False;
  291.             Writeln('Файл не найден.');
  292.         End
  293.         Else If (CheckOutputPermission(Path) = False) Then
  294.             IsCorrect := False;
  295.  
  296.     Until IsCorrect;
  297.     OutputPath := Path;
  298. End;
  299.  
  300. Procedure ConclFile(Search: Integer);
  301. Var
  302.     Fil: TextFile;
  303.     Path: String;
  304. Begin
  305.     Path := OutputPath();
  306.     AssignFile(Fil, Path);
  307.     Rewrite(Fil);
  308.     Writeln(Fil, 'Число хорошистов: ', Search);
  309.     CloseFile(Fil);
  310. End;
  311.  
  312. Procedure ChoseOutput(Search: Integer); // выбираем как выводить результат
  313. Var
  314.     I: Integer;
  315.     IsCorrect: Boolean;
  316. Begin
  317.     Writeln('Выберите способ вывода данных: если хотите вывести данные в консоль, введите 1. Если хотите вывести данные в файл - 2.');
  318.     Repeat
  319.         I := CheckIntNumb();
  320.         IsCorrect := True;
  321.         If I = 1 Then
  322.             ConclConsol(Search)
  323.         Else If I = 2 Then
  324.             ConclFile(Search)
  325.         Else
  326.         Begin
  327.             IsCorrect := False;
  328.             Writeln('Введите 1 или 2.');
  329.         End;
  330.     Until IsCorrect;
  331. End;
  332.  
  333. Var
  334.     Arr: MatrixOfInt;
  335.     Path: String;
  336.     I, NSearch: Integer;
  337.  
  338. Begin
  339.     WriteTask();
  340.     Arr := ChoseInput();
  341.     NSearch := SearchForGoodStudents(Arr);
  342.     ChoseOutput(NSearch);
  343.     Readln;
  344.  
  345. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement