Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Lab1;
- Uses
- System.SysUtils;
- Var
- N, Npl, K, I: Integer;
- Area, Vpr1, Vpr2, Vpr3, Vpr4: Real;
- Coordinates: Array of Array[0..1] of Real;
- IsCorrect: Boolean;
- Begin
- Writeln('Программа считает площадь многоугольника по координатам его вершин.');
- Writeln('Введите количество вершин многоугольника (не более 10^6): ');
- Repeat
- IsCorrect := True;
- Try
- Readln(N);
- Except
- Writeln('Ошибка ввода. Введите натуральное число.');
- IsCorrect := False;
- End;
- If IsCorrect And ((N <= 2) Or (N > 1000000)) Then
- Begin
- Writeln('Ошибка ввода. Введите натуральное число в промежутке [3;10^6]');
- IsCorrect := False;
- End;
- Until IsCorrect;
- Npl := N + 1;
- SetLength(Coordinates, Npl);
- Repeat
- For K := 0 To N - 1 Do
- Repeat
- Repeat
- IsCorrect := True;
- Writeln('Введите координату X', k + 1, ' ', 'в диапазоне (-10000; 10000):');
- Try
- Readln(Coordinates[K][0]);
- Except
- Writeln('Ошибка ввода. Введите действительное число.');
- IsCorrect := False;
- End;
- If IsCorrect And ((Abs(Coordinates[k][0]) > 10000)) Then
- Begin
- Writeln('Ошибка ввода. Введите координату точки в диапазоне (-10000; 10000)');
- IsCorrect := False;
- End;
- Until IsCorrect;
- Repeat
- IsCorrect := True;
- Writeln('Введите координату Y', k + 1, ' ', 'в диапазоне (-10000; 10000):');
- Try
- Readln(Coordinates[K][1]);
- Except
- Writeln('Ошибка ввода. Введите действительное число.');
- IsCorrect := False;
- End;
- If IsCorrect And ((Abs(Coordinates[K][1]) > 10000)) Then
- Begin
- Writeln('Ошибка ввода. Введите координату точки в диапазоне (-10000; 10000)');
- IsCorrect := False;
- End;
- Until IsCorrect;
- I := 1;
- While IsCorrect And (I < K - 1) Do
- Begin
- 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]);
- 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]);
- 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]);
- 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]);
- 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
- Begin
- Writeln('Вы ввели координаты вершин самопересекающегося многоугольника! Повторите ввод.');
- IsCorrect := False;
- End;
- I := I + 1;
- End;
- Until IsCorrect;
- Coordinates[N][0] := Coordinates[0][0];
- Coordinates[N][1] := Coordinates[0][1];
- I := 2;
- While IsCorrect And (I < N - 1) Do
- Begin
- 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]);
- 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]);
- 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]);
- 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]);
- 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
- Begin
- Writeln('Вы ввели координаты вершин самопересекающегося многоугольника! Повторите ввод.');
- IsCorrect := False;
- End;
- I := I + 1;
- End;
- Until IsCorrect;
- For I := N Downto 1 Do
- Area := Area + Coordinates[I - 1][0] * Coordinates[I][1] - Coordinates[I - 1][1] * Coordinates[I][0];
- Area := Abs(Area / 2);
- Writeln('Площадь заданного многоугольника равна ', Area:14:5);
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement