Advertisement
LisunovaMaryna

pizdzec_neiki delphi

Nov 14th, 2023
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.79 KB | None | 0 0
  1. program Laba1_4;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. const
  7.     MINSIZE = 3;
  8.     Epsilon = 0.0000000000000001;
  9.  
  10. var
  11.     IsCorrect: Boolean;
  12.     NumbOfVersh, I, K: Integer;
  13.     X, Y: Array of Real;
  14.     Perimetr: Real;
  15.  
  16. begin
  17.     Writeln('Эта программа определяет периметр N-угольника по заданным вершинам.');
  18.     repeat
  19.         IsCorrect := True;
  20.         Write('Введите количество вершин многоугольника: ');
  21.         try
  22.             Readln(NumbOfVersh);
  23.         except
  24.             Writeln('Проверьте правильность ввода и повторите попытку.');
  25.             IsCorrect := False;
  26.         End;
  27.         if IsCorrect And (NumbOfVersh < MINSIZE) Then
  28.         begin
  29.             Writeln('Многоугольник должен иметь хотябы 3 вершины. Повторите попытку.');
  30.             IsCorrect := False;
  31.         end;
  32.     until IsCorrect;
  33.    
  34.     SetLength(X, NumbOfVersh);
  35.     SetLength(Y, NumbOfVersh);
  36.    
  37.     for I := 0 To NumbOfVersh - 1 Do
  38.     begin
  39.         repeat
  40.             repeat
  41.                 IsCorrect := True;
  42.                 Write('Введите абсциссу ', I + 1, ' точки: ');
  43.                 try
  44.                     Readln(X[I]);
  45.                 except
  46.                     Writeln('Проверьте правильность ввода и повторите попытку.');
  47.                     IsCorrect := False;
  48.                 End;
  49.             until IsCorrect;
  50.             repeat
  51.                 IsCorrect := True;
  52.                 Write('Введите ординату ', I + 1, ' точки: ');
  53.                 try
  54.                     Readln(Y[I]);
  55.                 except
  56.                     Writeln('Проверьте правильность ввода и повторите попытку.');
  57.                     IsCorrect := False;
  58.                 End;
  59.             until IsCorrect;
  60.            
  61.             for K := 0 To I - 1 Do
  62.             begin
  63.                 if (IsCorrect) And (Abs(X[i] - X[K]) < Epsilon) And (Abs(Y[I] - Y[K]) < Epsilon) Then
  64.                     IsCorrect := False;
  65.                 Writeln('Координаты точки схожи с одной из предыдущих. Введите другие значения.');
  66.             end;
  67.            
  68.             if (IsCorrect) And (I > 1) Then
  69.             begin
  70.                 for K := 0 To I - 2 Do
  71.                 begin
  72.                     if ((Y[K] - Y[I - 1]) * (X[I] - X[I - 1]) = (X[K] - X[I - 1]) * (Y[I] - Y[I - 1])) And ((X[K] - X[I - 1]) * (X[I] - X[I - 1]) <= Sqr(X[I] - X[I - 1])) And (0 <= (X[K] - X[I - 1]) * (X[I] - X[I - 1])) And ((Y[I] - Y[I - 1]) * (Y[K] - Y[I - 1]) <= Sqr(Y[I] - Y[I - 1])) And (0 <= (Y[K] - Y[I - 1]) * (Y[I] - Y[I - 1])) Or ((Y[I] - Y[k]) * (X[K + 1] - X[K]) = (X[I] - X[K]) * (Y[K + 1] - Y[K])) And ((X[I] - X[K]) * (X[K + 1] - X[K]) <= Sqr(X[K + 1] - X[K])) And (0 <= (X[I] - X[K]) * (X[K + 1] - X[K])) And ((Y[K + 1] - Y[K]) * (Y[I] - Y[K]) <= Sqr(Y[K + 1] - Y[K])) And (0 <= (Y[I] - Y[K]) * (Y[K + 1] - Y[K])) Then
  73.                         IsCorrect := False;
  74.                 end;
  75.                 if IsCorrect And ((Y[I - 2] - Y[I - 1]) * (X[I] - X[I - 1]) = (X[I - 2] - X[I - 1]) * (Y[I] - Y[I - 1])) Then
  76.                     IsCorrect := False;
  77.                 if IsCorrect And (I = NumbOfVersh - 1) Then
  78.                 begin
  79.                     for K := 1 To I - 1 Do
  80.                     begin
  81.                         if ((Y[K] - Y[I]) * (X[0] - X[I]) = (X[K] - X[I]) * (Y[0] - Y[I])) And ((X[K] - X[I]) * (X[0] - X[I]) <= Sqr(X[0] - X[I])) And (0 <= (X[K] - X[I]) * (X[0] - X[I])) And ((Y[0] - Y[I]) * (Y[K] - Y[I]) <= Sqr(Y[0] - Y[I])) And (0 <= (Y[K] - Y[I]) * (Y[0] - Y[I])) Then
  82.                             IsCorrect := False;
  83.                     end;
  84.                     if (Y[1] - Y[I]) * (X[0] - X[I]) = (X[1] - X[I]) * (Y[0] - Y[I]) Then
  85.                         IsCorrect := False;
  86.                 end;
  87.                 if IsCorrect = False Then
  88.                     Writeln('При использовании этой точки многоугольник не получится. Выберите другие значения.');
  89.             end;
  90.         until Iscorrect;
  91.     end;
  92.     Perimetr := Sqrt(Sqr(X[1] - X[0]) + Sqr(Y[1] - Y[0]));
  93.     for I := 2 To NumbOfVersh - 1 Do
  94.     begin
  95.         Perimetr := Perimetr + Sqrt(Sqr(X[I] - X[I - 1]) + Sqr(Y[I] - Y[I - 1]));
  96.     end;
  97.    
  98.     Perimetr := Perimetr + Sqrt(Sqr(X[0] - X[NumbOfVersh - 1]) + Sqr(Y[0] - Y[NumbOfVersh - 1]));
  99.     Writeln('Периметр многоугольника = ', Perimetr:7:3);
  100.     Writeln('Для выхода из программы нажмите Enter');
  101.     Readln;
  102.     Readln;
  103. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement