Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Laba1_4;
- Uses
- System.SysUtils;
- const
- MINSIZE = 3;
- Epsilon = 0.0000000000000001;
- var
- IsCorrect: Boolean;
- NumbOfVersh, I, K: Integer;
- X, Y: Array of Real;
- Perimetr: Real;
- begin
- Writeln('Эта программа определяет периметр N-угольника по заданным вершинам.');
- repeat
- IsCorrect := True;
- Write('Введите количество вершин многоугольника: ');
- try
- Readln(NumbOfVersh);
- except
- Writeln('Проверьте правильность ввода и повторите попытку.');
- IsCorrect := False;
- End;
- if IsCorrect And (NumbOfVersh < MINSIZE) Then
- begin
- Writeln('Многоугольник должен иметь хотябы 3 вершины. Повторите попытку.');
- IsCorrect := False;
- end;
- until IsCorrect;
- SetLength(X, NumbOfVersh);
- SetLength(Y, NumbOfVersh);
- for I := 0 To NumbOfVersh - 1 Do
- begin
- repeat
- repeat
- IsCorrect := True;
- Write('Введите абсциссу ', I + 1, ' точки: ');
- try
- Readln(X[I]);
- except
- Writeln('Проверьте правильность ввода и повторите попытку.');
- IsCorrect := False;
- End;
- until IsCorrect;
- repeat
- IsCorrect := True;
- Write('Введите ординату ', I + 1, ' точки: ');
- try
- Readln(Y[I]);
- except
- Writeln('Проверьте правильность ввода и повторите попытку.');
- IsCorrect := False;
- End;
- until IsCorrect;
- for K := 0 To I - 1 Do
- begin
- if (IsCorrect) And (Abs(X[i] - X[K]) < Epsilon) And (Abs(Y[I] - Y[K]) < Epsilon) Then
- IsCorrect := False;
- Writeln('Координаты точки схожи с одной из предыдущих. Введите другие значения.');
- end;
- if (IsCorrect) And (I > 1) Then
- begin
- for K := 0 To I - 2 Do
- begin
- 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
- IsCorrect := False;
- end;
- 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
- IsCorrect := False;
- if IsCorrect And (I = NumbOfVersh - 1) Then
- begin
- for K := 1 To I - 1 Do
- begin
- 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
- IsCorrect := False;
- end;
- if (Y[1] - Y[I]) * (X[0] - X[I]) = (X[1] - X[I]) * (Y[0] - Y[I]) Then
- IsCorrect := False;
- end;
- if IsCorrect = False Then
- Writeln('При использовании этой точки многоугольник не получится. Выберите другие значения.');
- end;
- until Iscorrect;
- end;
- Perimetr := Sqrt(Sqr(X[1] - X[0]) + Sqr(Y[1] - Y[0]));
- for I := 2 To NumbOfVersh - 1 Do
- begin
- Perimetr := Perimetr + Sqrt(Sqr(X[I] - X[I - 1]) + Sqr(Y[I] - Y[I - 1]));
- end;
- Perimetr := Perimetr + Sqrt(Sqr(X[0] - X[NumbOfVersh - 1]) + Sqr(Y[0] - Y[NumbOfVersh - 1]));
- Writeln('Периметр многоугольника = ', Perimetr:7:3);
- Writeln('Для выхода из программы нажмите Enter');
- Readln;
- Readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement