Advertisement
believe_me

Untitled

Oct 29th, 2021
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.19 KB | None | 0 0
  1. program lab24;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R *.res}
  5.  
  6. uses
  7.     System.SysUtils, Math;
  8.  
  9. Function CheckExtension(Path: String): Boolean; forward;
  10.  
  11. Function CheckPermission(Path: String): Boolean; forward;
  12.  
  13. type
  14.     TArray = Array [0 .. 1] of Integer;
  15.  
  16. Function InputNumber(MinNumber, MaxNumber: Integer): Integer;
  17.  
  18. var
  19.     IsCorrect: Boolean;
  20.     Number: Integer;
  21.  
  22. begin
  23.     repeat
  24.         IsCorrect := true;
  25.         try
  26.             Readln(Number);
  27.         except
  28.             Writeln('Нужно ввести целое число, которое не меньше ', MinNumber,
  29.               ' и не больше ', MaxNumber);
  30.             IsCorrect := false;
  31.         end;
  32.         if IsCorrect and ((Number < MinNumber) or (Number > MaxNumber)) then
  33.         begin
  34.             Writeln('Нужно ввести целое число, которое не меньше ', MinNumber,
  35.               ' и не больше ', MaxNumber);
  36.             IsCorrect := false;
  37.         end;
  38.     until IsCorrect;
  39.     InputNumber := Number;
  40. end;
  41.  
  42. Function ChooseWayOfInput(): Integer;
  43.  
  44. const
  45.     CONSOLE_WAY = 1;
  46.     FILE_WAY = 2;
  47.  
  48. var
  49.     UserWay: Integer;
  50.  
  51. begin
  52.     Repeat
  53.         Writeln('Выберите способ ввода:'#13#10'Нажмите "1", если хотите ввести матрицу через консоль.'#13#10'Нажмите "2", если хотите считать матрицу из файла.');
  54.         UserWay := InputNumber(1, 2);
  55.     Until (UserWay = CONSOLE_WAY) or (UserWay = FILE_WAY);
  56.     ChooseWayOfInput := UserWay;
  57. end;
  58.  
  59. function InputPathToFile(): String;
  60.  
  61. var
  62.     Path: String;
  63.     IsCorrect, Flag: Boolean;
  64.     NewFile: TextFile;
  65. begin
  66.     Writeln('Введите путь к файлу:');
  67.     repeat
  68.         repeat
  69.             IsCorrect := true;
  70.             Readln(Path);
  71.             Try
  72.                 AssignFile(NewFile, Path);
  73.                 Reset(NewFile);
  74.             Except
  75.                 Writeln('Ошибка! Путь указан неверно. Введите его заново.');
  76.                 IsCorrect := false;
  77.             End
  78.         Until (IsCorrect);
  79.         Flag := CheckExtension(Path);
  80.     until Flag;
  81.     Close(NewFile);
  82.     InputPathToFile := Path;
  83. end;
  84.  
  85. Function ReceiveRangeFromConsole(): TArray;
  86.  
  87. var
  88.     XStart, XEnd: Integer;
  89.     Range: TArray;
  90.  
  91. begin
  92.     Writeln('Введите первую границу.');
  93.     XStart := InputNumber(-100, 100);
  94.     Writeln('Введите вторую границу.');
  95.     XEnd := InputNumber(-100, 100);
  96.     Range[0] := XStart;
  97.     Range[1] := XEnd;
  98.     ReceiveRangeFromConsole := Range;
  99. end;
  100.  
  101. Function ReceiveRangeFromFile(Path: String): TArray;
  102.  
  103. var
  104.     InputFile: TextFile;
  105.     Range: TArray;
  106.     XStart, XEnd: Integer;
  107.     IsCorrect: Boolean;
  108.  
  109. begin;
  110.     repeat
  111.         IsCorrect := true;
  112.         Assign(InputFile, Path);
  113.         Reset(InputFile);
  114.         try
  115.             Read(InputFile, XStart);
  116.             Read(InputFile, XEnd);
  117.         except
  118.             IsCorrect := false;
  119.             Writeln('Некорректные данные в файле!');
  120.             Close(InputFile);
  121.             Path := InputPathToFile;
  122.         end;
  123.  
  124.     until IsCorrect;
  125.     Range[0] := XStart;
  126.     Range[1] := XEnd;
  127.     ReceiveRangeFromFile := Range;
  128. end;
  129.  
  130. procedure CheckRange(var Path: String);
  131.  
  132. const
  133.     MIN_BORDER = -100;
  134.     MAX_BORDER = 100;
  135.  
  136. var
  137.     InputFile: TextFile;
  138.     Line: String;
  139.     XStart, XEnd: Integer;
  140.     IsCorrect: Boolean;
  141. begin
  142.     repeat
  143.         IsCorrect := true;
  144.         Assign(InputFile, Path);
  145.         try
  146.             Reset(InputFile);
  147.             Read(InputFile, XStart);
  148.             Readln(InputFile, XEnd);
  149.         except
  150.             IsCorrect := false;
  151.             Writeln('Некорректные данные в файле!');
  152.             Close(InputFile);
  153.             Path := InputPathToFile;
  154.         end;
  155.         if (IsCorrect) and ((XStart < MIN_BORDER) or (XStart > MAX_BORDER) or
  156.           (XEnd < MIN_BORDER) or (XEnd > MAX_BORDER)) then
  157.         begin
  158.             IsCorrect := false;
  159.             Writeln('Некорректные данные в файле!');
  160.             Close(InputFile);
  161.             Path := InputPathToFile;
  162.         end;
  163.     until IsCorrect;
  164.     Close(InputFile);
  165. end;
  166.  
  167. Function ReceiveRange(UserWay: Integer): TArray;
  168.  
  169. const
  170.     CONSOLE_WAY = 1;
  171.     FILE_WAY = 2;
  172.  
  173. var
  174.     Path: String;
  175.     Range: TArray;
  176.  
  177. begin;
  178.     case UserWay of
  179.         CONSOLE_WAY:
  180.             begin
  181.                 Range := ReceiveRangeFromConsole();
  182.             end;
  183.          FILE_WAY:
  184.             begin
  185.                 Path := InputPathToFile();
  186.                 CheckRange(Path);
  187.                 Range := ReceiveRangeFromFile(Path);
  188.             end;
  189.     end;
  190.     ReceiveRange := Range;
  191.  
  192. end;
  193.  
  194. Procedure SortRange(var Range: TArray);
  195.  
  196. begin
  197.     if (Range[0] > Range[1]) then
  198.     begin
  199.         Range[0] := Range[0] + Range[1];
  200.         Range[1] := Range[0] - Range[1];
  201.         Range[0] := Range[0] - Range[1];
  202.     end;
  203.  
  204. end;
  205.  
  206. Function SearchMaxFunctionValue(Range: TArray): Double;
  207.  
  208. var
  209.     X, Y, MaxValue: Double;
  210.  
  211. begin
  212.     X := Range[0];
  213.     MaxValue := (2 * X) / (2 * X * X - 3 * X + 4);
  214.     while (X <= Range[1]) do
  215.     begin
  216.         Y := (2 * X + 3) / (2 * X * X - 3 * X + 4);
  217.         X := X + 0.01;
  218.         if (Y > MaxValue) then
  219.         begin
  220.             MaxValue := Y;
  221.         end;
  222.     end;
  223.     MaxValue := SimpleRoundTo(MaxValue, -3);
  224.     SearchMaxFunctionValue := MaxValue;
  225. end;
  226.  
  227. Function CheckExtension(Path: String): Boolean;
  228.  
  229. var
  230.     RigthExtension: Boolean;
  231.  
  232. begin
  233.     if (ExtractFileExt(Path) = '.txt') then
  234.         RigthExtension := true
  235.     else
  236.     begin
  237.         Writeln('Неверное расширение файла.');
  238.         RigthExtension := false;
  239.     end;
  240.     CheckExtension := RigthExtension;
  241. end;
  242.  
  243. Function CheckPermission(Path: String): Boolean;
  244.  
  245. var
  246.     OutputFile: TextFile;
  247.     RightPermission: Boolean;
  248.  
  249. begin
  250.     Assign(OutputFile, Path);
  251.     RightPermission := true;
  252.     try
  253.         Rewrite(OutputFile);
  254.         Close(OutputFile);
  255.     except
  256.         Writeln('Файл закрыт для записи.');
  257.         RightPermission := false;
  258.     end;
  259.     CheckPermission := RightPermission;
  260. end;
  261.  
  262. Procedure PrintResultToFile(Path: String; MaxFunctionValue: Double;
  263.   Range: TArray);
  264.  
  265. var
  266.     OutputFile: TextFile;
  267.  
  268. begin
  269.     Assign(OutputFile, Path);
  270.     Rewrite(OutputFile);
  271.     Writeln(OutputFile,
  272.       'Наибольшее значение функции y=(2x + 3)/(2x^2 - 3x + 4) на отрезке [',
  273.       Range[0], '][', Range[1], '] = ', MaxFunctionValue:4:3);
  274.     Close(OutputFile);
  275. end;
  276.  
  277. Procedure UserWayOfOutput(MaxFunctionValue: Double; Range: TArray);
  278.  
  279. const
  280.     CONSOLE_WAY = '1';
  281.  
  282. var
  283.     UserWay: Char;
  284.     Path: String;
  285.  
  286. begin;
  287.     Writeln('Если хотите записать результат в файл, введите "1". Если не хотите - введите другой символ:');
  288.     Readln(UserWay);
  289.     if (UserWay = CONSOLE_WAY) then
  290.     begin;
  291.         repeat
  292.             Path := InputPathToFile();
  293.         until (CheckPermission(Path));
  294.         PrintResultToFile(Path, MaxFunctionValue, Range);
  295.         Writeln('Результат записан в файл.');
  296.     end;
  297. end;
  298.  
  299. Procedure PrintResult(MaxFunctionValue: Double; Range: TArray);
  300.  
  301. begin;
  302.     Writeln('Наибольшее значение функции y=(2x + 3)/(2x^2 - 3x + 4) на отрезке [',
  303.       Range[0], '][', Range[1], '] = ', MaxFunctionValue:4:3);
  304. end;
  305.  
  306. Procedure Main();
  307.  
  308. var
  309.     UserWay: Integer;
  310.     Range: TArray;
  311.     MaxFunctionValue: Double;
  312.  
  313. begin
  314.     Writeln('Программа находит максимальное значение функции y=(2x + 3)/(2x^2 - 3x + 4) на отрезке [a,b].');
  315.     UserWay := ChooseWayOfInput();
  316.     Range := ReceiveRange(UserWay);
  317.     SortRange(Range);
  318.     MaxFunctionValue := SearchMaxFunctionValue(Range);
  319.     PrintResult(MaxFunctionValue, Range);
  320.     UserWayOfOutput(MaxFunctionValue, Range);
  321.     Writeln('Программа завершена.');
  322.     Readln;
  323. end;
  324.  
  325. begin
  326.     Main();
  327.  
  328. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement