gguuppyy

лаба2н4

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