Advertisement
Vernon_Roche

Задание 1 Delphi (Лабораторная работа 2, вариант без функций)

Oct 8th, 2023 (edited)
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.14 KB | None | 0 0
  1. Program Lab1;
  2.  
  3. Uses
  4.   System.SysUtils;
  5.  
  6. Var
  7.     N, Npl, K, I: Integer;
  8.     Area, Vpr1, Vpr2, Vpr3, Vpr4: Real;
  9.     Coordinates: Array of Array[0..1] of Real;
  10.     IsCorrect: Boolean;
  11.  
  12. Begin
  13.     Writeln('Программа считает площадь многоугольника по координатам его вершин.');
  14.     Writeln('Введите количество вершин многоугольника (не более 10^6): ');
  15.     Repeat
  16.         IsCorrect := True;
  17.         Try
  18.             Readln(N);
  19.         Except
  20.             Writeln('Ошибка ввода. Введите натуральное число.');
  21.             IsCorrect := False;
  22.         End;
  23.         If IsCorrect And ((N <= 2) Or (N > 1000000)) Then
  24.         Begin
  25.             Writeln('Ошибка ввода. Введите натуральное число в промежутке [3;10^6]');
  26.             IsCorrect := False;
  27.         End;
  28.     Until IsCorrect;
  29.     Npl := N + 1;
  30.     SetLength(Coordinates, Npl);
  31.     Repeat
  32.         For K := 0 To N - 1 Do
  33.             Repeat
  34.                 Repeat
  35.                     IsCorrect := True;
  36.                     Writeln('Введите координату X', k + 1, ' ',  'в диапазоне (-10000; 10000):');
  37.                     Try
  38.                         Readln(Coordinates[K][0]);
  39.                     Except
  40.                         Writeln('Ошибка ввода. Введите действительное число.');
  41.                         IsCorrect := False;
  42.                     End;
  43.                     If IsCorrect And ((Abs(Coordinates[k][0]) > 10000)) Then
  44.                     Begin
  45.                         Writeln('Ошибка ввода. Введите координату точки в диапазоне (-10000; 10000)');
  46.                         IsCorrect := False;
  47.                     End;
  48.                 Until IsCorrect;
  49.                 Repeat
  50.                     IsCorrect := True;
  51.                     Writeln('Введите координату Y', k + 1, ' ',  'в диапазоне (-10000; 10000):');
  52.                     Try
  53.                         Readln(Coordinates[K][1]);
  54.                     Except
  55.                         Writeln('Ошибка ввода. Введите действительное число.');
  56.                         IsCorrect := False;
  57.                     End;
  58.                     If IsCorrect And ((Abs(Coordinates[K][1]) > 10000)) Then
  59.                     Begin
  60.                         Writeln('Ошибка ввода. Введите координату точки в диапазоне (-10000; 10000)');
  61.                         IsCorrect := False;
  62.                     End;
  63.                 Until IsCorrect;
  64.                 I := 1;
  65.                 While IsCorrect And (I < K - 1) Do
  66.                 Begin
  67.                     Vpr1 := (Coordinates[K][0] - Coordinates[K - 1][0]) * (Coordinates[I - 1][1] - Coordinates[K - 1][1]) - (Coordinates[I - 1][0] - Coordinates[K - 1][0]) * (Coordinates[K][1] - Coordinates[K - 1][1]);
  68.                     Vpr2 := (Coordinates[K][0] - Coordinates[K - 1][0]) * (Coordinates[I][1] - Coordinates[K - 1][1]) - (Coordinates[I][0] - Coordinates[K - 1][0]) * (Coordinates[K][1] - Coordinates[K - 1][1]);
  69.                     Vpr3 := (Coordinates[I][0] - Coordinates[I - 1][0]) * (Coordinates[K - 1][1] - Coordinates[I - 1][1]) - (Coordinates[K - 1][0] - Coordinates[I - 1][0]) * (Coordinates[I][1] - Coordinates[I - 1][1]);
  70.                     Vpr4 := (Coordinates[I][0] - Coordinates[I - 1][0]) * (Coordinates[K][1] - Coordinates[I - 1][1]) - (Coordinates[K][0] - Coordinates[I - 1][0]) * (Coordinates[I][1] - Coordinates[I - 1][1]);
  71.                     If (((Vpr1 = 0) And (Vpr2 <> 0)) Or ((Vpr1 = 0) And (Vpr2 <> 0))) And (((Vpr3 = 0) And (Vpr4 <> 0)) Or ((Vpr3 <> 0) And (Vpr4 = 0))) Or ((((Vpr1 > 0) And (Vpr2 < 0)) Or ((Vpr1 < 0) And (Vpr2 > 0))) And (((Vpr3 > 0) And (Vpr4 < 0)) Or ((Vpr3 < 0) And (Vpr4 > 0)))) Then
  72.                     Begin
  73.                         Writeln('Вы ввели координаты вершин самопересекающегося многоугольника! Повторите ввод.');
  74.                         IsCorrect := False;
  75.                      End;
  76.                     I := I + 1;
  77.                 End;
  78.             Until IsCorrect;
  79.         Coordinates[N][0] := Coordinates[0][0];
  80.         Coordinates[N][1] := Coordinates[0][1];
  81.         I := 2;
  82.         While IsCorrect And (I < N - 1) Do
  83.         Begin
  84.             Vpr1 := (Coordinates[N][0] - Coordinates[N - 1][0]) * (Coordinates[I - 1][1] - Coordinates[N - 1][1]) - (Coordinates[I - 1][0] - Coordinates[N - 1][0]) * (Coordinates[N][1] - Coordinates[N - 1][1]);
  85.             Vpr2 := (Coordinates[N][0] - Coordinates[N - 1][0]) * (Coordinates[I][1] - Coordinates[N - 1][1]) - (Coordinates[I][0] - Coordinates[N - 1][0]) * (Coordinates[N][1] - Coordinates[N - 1][1]);
  86.             Vpr3 := (Coordinates[I][0] - Coordinates[I - 1][0]) * (Coordinates[N - 1][1] - Coordinates[I - 1][1]) - (Coordinates[N - 1][0] - Coordinates[I - 1][0]) * (Coordinates[I][1] - Coordinates[I - 1][1]);
  87.             Vpr4 := (Coordinates[I][0] - Coordinates[I - 1][0]) * (Coordinates[N][1] - Coordinates[I - 1][1]) - (Coordinates[N][0] - Coordinates[I - 1][0]) * (Coordinates[I][1] - Coordinates[I - 1][1]);
  88.             If (((Vpr1 = 0) And (Vpr2 <> 0)) Or ((Vpr1 = 0) And (Vpr2 <> 0))) And (((Vpr3 = 0) And (Vpr4 <> 0)) Or ((Vpr3 <> 0) And (Vpr4 = 0))) Or ((((Vpr1 > 0) And (Vpr2 < 0)) Or ((Vpr1 < 0) And (Vpr2 > 0))) And (((Vpr3 > 0) And (Vpr4 < 0)) Or ((Vpr3 < 0) And (Vpr4 > 0)))) Then
  89.             Begin
  90.                 Writeln('Вы ввели координаты вершин самопересекающегося многоугольника! Повторите ввод.');
  91.                 IsCorrect := False;
  92.             End;
  93.             I := I + 1;
  94.         End;
  95.     Until IsCorrect;
  96.     For I := N Downto 1 Do
  97.         Area := Area + Coordinates[I - 1][0] * Coordinates[I][1] - Coordinates[I - 1][1] * Coordinates[I][0];
  98.     Area := Abs(Area / 2);
  99.     Writeln('Площадь заданного многоугольника равна ', Area:14:5);
  100.     Readln;
  101. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement