negtab

2.19.3 Delphi

Oct 23rd, 2024
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.24 KB | None | 0 0
  1. program Lab2193;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TArray = Array Of Double;
  8.  
  9. Procedure PrintTask();
  10. Begin
  11.     Writeln('Эта программа находит количество всех возиожных треугольников по заданным точкам');
  12. End;
  13.  
  14. Function ReadPathToFile() : String;
  15. Var
  16.     PathToFile: String;
  17.     IsCorrect: Boolean;
  18. Begin
  19.     Repeat
  20.         IsCorrect := True;
  21.         Write('Введите путь к файлу с расширением.txt с количеством точек и координатами точек: ');
  22.         Readln(PathToFile);
  23.         If ExtractFileExt(PathToFile) <> '.txt' Then
  24.         Begin
  25.             Writeln('Расширение файла не .txt!');
  26.             IsCorrect := False;
  27.         End;
  28.     Until(IsCorrect);
  29.     ReadPathToFile := PathToFile;
  30. End;
  31.  
  32. Function IsExists(PathToFile : String) : Boolean;
  33. Var
  34.     IsRight: Boolean;
  35. Begin
  36.     IsRight := False;
  37.     If FileExists(PathToFile) Then
  38.         IsRight := True;
  39.     IsExists := IsRight;
  40. End;
  41.  
  42. Function IsNotAbleToReading(Var t: TextFile) : Boolean;
  43. Var
  44.     IsRight: Boolean;
  45. Begin
  46.     IsRight := False;
  47.     Try
  48.         Reset(T);
  49.         CloseFile(T);
  50.     Except
  51.         IsRight := True;
  52.     End;
  53.     IsNotAbleToReading := IsRight;
  54. End;
  55.  
  56. Function IsNotAbleToWriting(PathToFile: String) : Boolean;
  57. Var
  58.     IsRight: Boolean;
  59. Begin
  60.     IsRight := False;
  61.     If FileIsReadOnly(PathToFile) Then
  62.         IsRight := True;
  63.     IsNotAbleToWriting := IsRight;
  64. End;
  65.  
  66. Function IsEmpty(Var T: TextFile) : Boolean;
  67. Var
  68.     IsRight: Boolean;
  69. Begin
  70.     IsRight := False;
  71.     Reset(T);
  72.     If EOF(T) Then
  73.         IsRight := True;
  74.     CloseFile(T);
  75.     IsEmpty := IsRight;
  76. End;
  77.  
  78. Procedure GetFileNormalReading(Var PathToFile: String);
  79. Var
  80.     IsCorrect: Boolean;
  81.     T : TextFile;
  82. Begin
  83.     Repeat
  84.         IsCorrect := True;
  85.         PathToFile := ReadPathToFile();
  86.         If Not IsExists(PathToFile) Then
  87.         Begin
  88.             IsCorrect := False;
  89.             Writeln('Проверьте корректность ввода пути к файлу!');
  90.         End;
  91.         If IsCorrect Then
  92.             AssignFile(T, PathToFile);
  93.         If IsCorrect And IsNotAbleToReading(T) Then
  94.         Begin
  95.             IsCorrect := False;
  96.             Writeln('Файл закрыт для чтения!');
  97.         End;
  98.         If IsCorrect And IsEmpty(T) Then
  99.         Begin
  100.             IsCorrect := False;
  101.             WriteLn('Файл пуст!');
  102.         End;
  103.     Until IsCorrect;
  104. End;
  105.  
  106. Procedure GetFileNormalWriting(Var PathToFile: String);
  107. Var
  108.     T : TextFile;
  109.     IsCorrect: Boolean;
  110. Begin
  111.     Repeat
  112.         IsCorrect := True;
  113.         PathToFile := ReadPathToFile();
  114.         If IsExists(PathToFile) Then
  115.         Begin
  116.             IsCorrect := False;
  117.             Writeln('Проверьте корректность ввода пути к файлу!');
  118.         End;
  119.         If IsCorrect Then
  120.             AssignFile(T, PathToFile);
  121.         If IsCorrect And IsNotAbleToWriting(PathToFile) Then
  122.         Begin
  123.             IsCorrect := False;
  124.             WriteLn('Файл закрыт для записи!');
  125.         End;
  126.     Until IsCorrect;
  127. End;
  128.  
  129. Function InputInt(Min, Max : Integer) : Integer;
  130. Var
  131.     IsCorrect : Boolean;
  132.     N : Integer;
  133. Begin
  134.     Repeat
  135.         IsCorrect := True;
  136.         Try
  137.             Readln(N);
  138.         Except
  139.            IsCorrect := False;
  140.         End;
  141.         If(Not IsCorrect) Or (N > Max) Or (N < Min) Then
  142.         Begin
  143.             IsCorrect := False;
  144.             Writeln('Неверный ввод');
  145.         End;
  146.     Until IsCorrect;
  147.     InputInt := N;
  148. End;
  149.  
  150. Function InputIntWithText(S: String; Min, Max : Integer) : Integer;
  151. Var
  152.     IsCorrect : Boolean;
  153.     N : Integer;
  154. Begin
  155.     Repeat
  156.         Write(S, ' от ', Min, ' до ', Max, ' : ');
  157.         IsCorrect := True;
  158.         Try
  159.             Readln(N);
  160.         Except
  161.            IsCorrect := False;
  162.         End;
  163.         If(Not IsCorrect) Or (N > Max) Or (N < Min) Then
  164.         Begin
  165.             IsCorrect := False;
  166.             Writeln('Неверный ввод');
  167.         End;
  168.     Until IsCorrect;
  169.     InputIntWithText := N;
  170. End;
  171.  
  172. Function InputArrayOfDouble(S: String; CountOfPoints : Integer; Var Points: TArray; Min, Max : Double) : TArray;
  173. Var
  174.     IsCorrect : Boolean;
  175.     Counter, I : Integer;
  176. Begin
  177.     I := 0;
  178.     Counter := 0;
  179.     SetLength(Points, CountOfPoints*2);
  180.     While(I < countOfPoints * 2 - 1) Do
  181.     Begin
  182.         Repeat
  183.             Write(S,' x', I + 1 - Counter, ' от ', Min:2:1, ' до ', Max:2:1, ' : ');
  184.             IsCorrect := True;
  185.             Try
  186.                 Readln(Points[i]);
  187.             Except
  188.                IsCorrect := False;
  189.             End;
  190.             If(Not IsCorrect) Or (Points[I] > Max) Or (Points[I] < Min) Then
  191.             Begin
  192.                 IsCorrect := False;
  193.                 Writeln('Неверный ввод');
  194.             End;
  195.         Until IsCorrect;
  196.         Repeat
  197.             Write(S,' y', I + 1 - Counter, ' от ', Min:2:1, ' до ', Max:2:1, ' : ');
  198.             IsCorrect := True;
  199.             Try
  200.                 Readln(Points[I + 1]);
  201.             Except
  202.                IsCorrect := False;
  203.             End;
  204.             If(Not IsCorrect) Or (Points[I + 1] > Max) Or (Points[I + 1] < Min) Then
  205.             Begin
  206.                 IsCorrect := False;
  207.                 Writeln('Неверный ввод');
  208.             End;
  209.         Until IsCorrect;
  210.         Counter := Counter + 1;
  211.         I := I + 2;
  212.     End;
  213.     InputArrayOfDouble := Points;
  214. End;
  215.  
  216. Function ReadFileInt(Var PathToFile : String; Min, Max : Integer) : Integer;
  217. Var
  218.     N : Integer;
  219.     S : String;
  220.     IsCorrect : Boolean;
  221.     T : TextFile;
  222. Begin
  223.     AssignFile(T,PathToFile);
  224.     Reset(T);
  225.     IsCorrect := True;
  226.     Try
  227.         Readln(T, N);
  228.     Except
  229.         IsCorrect := False;
  230.     End;
  231.     If(Not IsCorrect) Or (N > Max) Or (N < Min) Then
  232.     Begin
  233.         IsCorrect := False;
  234.         Writeln('Неверный ввод');
  235.     End;
  236.     CloseFile(T);
  237.     ReadFileInt := N;
  238. End;
  239.  
  240. Function ReadFileArrayOfDouble(Var PathToFile : String; CountOfPoints : Integer; Points : TArray; Min, Max : Double) : TArray;
  241. Var
  242.     N, I, First, Second : Integer;
  243.     IsCorrect : Boolean;
  244.     S : String;
  245.     T : TextFile;
  246. Begin
  247.     I := 0;
  248.     First := 0;
  249.     Second := 1;
  250.     SetLength(Points, CountOfPoints*2);
  251.     AssignFile(T,PathToFile);
  252.     Reset(T);
  253.     Readln(T,S);
  254.     While(I < countOfPoints * 2 - 1) Do
  255.     Begin
  256.         IsCorrect := True;
  257.         Try
  258.             Read(T, Points[I]);
  259.         Except
  260.            IsCorrect := False;
  261.         End;
  262.         If(Not IsCorrect) Or (Points[I] > Max) Or (Points[I] < Min) Then
  263.         Begin
  264.             IsCorrect := False;
  265.             Writeln('Неверный ввод');
  266.         End;
  267.  
  268.         IsCorrect := True;
  269.         Try
  270.             Readln(N, Points[I + 1]);
  271.         Except
  272.            IsCorrect := False;
  273.         End;
  274.         If(Not IsCorrect) Or (Points[I + 1] > Max) Or (Points[I + 1] < Min) Then
  275.         Begin
  276.             IsCorrect := False;
  277.             Writeln('Неверный ввод');
  278.         End;
  279.         I := I + 2;
  280.     End;
  281.     CloseFile(T);
  282.     ReadFileArrayOfDouble := Points;
  283. End;
  284.  
  285. Function SolveTheProblem(Var CountOfPoints : Integer; Var Points : Array Of Double) : Integer;
  286. Var
  287.     MaxCountOfTriangles, I, J, K : Integer;
  288.     X1, X2, Y1, Y2 : Double;
  289. Begin
  290.     MaxCountOfTriangles := CountOfPoints * (CountOfPoints - 1) * (CountOfPoints - 2) Div 6;
  291.     I := 0;
  292.     While (I < CountOfPoints * 2 - 1) Do
  293.     Begin
  294.         J := I + 2;
  295.         While(J < CountOfPoints * 2 - 3) Do
  296.         Begin
  297.             X1 := Points[J] - Points[I];
  298.             Y1 := Points[J + 1] - Points[I + 1];
  299.             K := J + 1;
  300.             While(K < CountOfPoints - 1) Do
  301.             Begin
  302.                 X2 := Points[K] - Points[J];
  303.                 Y2 := Points[K + 1] - Points[J + 1];
  304.                 If (X1 * Y2 = X2 * Y1) Then
  305.                     MaxCountOfTriangles := MaxCountOfTriangles - 1;
  306.                 K := K + 2;
  307.             End;
  308.             J := J + 2;
  309.         End;
  310.         I := I + 2;
  311.     End;
  312.     SolveTheProblem := MaxCountOfTriangles;
  313. End;
  314.  
  315. Procedure WriteSolveToFile(Var PathToFile : String; N : Integer);
  316. Var
  317.     T : TextFile;
  318. Begin
  319.     AssignFile(T, PathToFile);
  320.     ReWrite(T);
  321.     Writeln(T, 'Количество возможных треугольников: ', N);
  322.     Close(T);
  323. End;
  324.  
  325. Function ChooseTheInput() : Integer;
  326. Begin
  327.     Write('Выберите ввод из консоли(1) или из файла(2): ');
  328.     ChooseTheInput := InputInt(1,2);
  329. End;
  330.  
  331. Function ChooseTheOutput() : Integer;
  332. Begin
  333.     Write('Выберите вывод в консоль(1) или в файл(2): ');
  334.     ChooseTheOutput := InputInt(1,2);
  335. End;
  336.  
  337. Procedure Input(Var CountOfPoints : Integer; Var Points : TArray);
  338. Var
  339.     IntChooseTheInput : Integer;
  340.     PathToFile : String;
  341. Begin
  342.     IntChooseTheInput := ChooseTheInput();
  343.     If(IntChooseTheInput = 1) Then
  344.     Begin
  345.         CountOfPoints := InputIntWithText('Введите количество точек',1, 10);
  346.  
  347.         InputArrayOfDouble('Введите координату координату', CountOfPoints, Points, -10.0, 10.0);
  348.     End
  349.     Else
  350.     Begin
  351.         GetFileNormalReading(PathToFile);
  352.         CountOfPoints := ReadFileInt(PathToFile, 1, 10);
  353.         ReadFileArrayOfDouble(PathToFile, CountOfPoints, Points, -10.0, 10.0);
  354.     End;
  355. End;
  356.  
  357. Procedure Output(Var CountOfPoints : Integer; Var Points : TArray);
  358. Var
  359.     IntChooseTheInput : Integer;
  360.     PathToFile : String;
  361.     T : TextFile;
  362. Begin
  363.     IntChooseTheInput := ChooseTheInput();
  364.     If(IntChooseTheInput = 1) Then
  365.     Begin
  366.          Writeln('Количество возможных треугольников: ', SolveTheProblem(CountOfPoints, Points));
  367.          Readln;
  368.     End
  369.     Else
  370.     Begin
  371.         GetFileNormalWriting(PathToFile);
  372.         WriteSolveToFile(pathToFile, solveTheProblem(countOfPoints, points));
  373.     End;
  374. End;
  375.  
  376. Var CountOfPoints : Integer;
  377.     Points : TArray;
  378. Begin
  379.     PrintTask();
  380.     Input(CountOfPoints, Points);
  381.     Output(CountOfPoints, Points);
  382. End.
Advertisement
Add Comment
Please, Sign In to add comment