ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Общий форум

Can I use "Uses Math;" in pascal? I got Crash (ACCESS_VIOLATION)
Послано XiaoTian 20 дек 2002 19:58
Here is my program.

{No.1043 Cover an Arc.}
Uses
     Math;
Var
     X1,Y1,X2,Y2,X3,Y3,A1,A2,B1,B2,C1,C2:LongInt;
     D,DX,DY:Real;
     CX,CY,R,Up1,Down1,Left1,Right1,Theta1,Theta2,Theta3,Real1:Real;
     Up,Down,Left,Right:LongInt;
Begin
     ReadLn(X1,Y1); ReadLn(X2,Y2); ReadLn(X3,Y3);
     A1:=2*(X1-X2); A2:=2*(X2-X3);
     B1:=2*(Y1-Y2); B2:=2*(Y2-Y3);
     C1:=X1*X1+Y1*Y1-X2*X2-Y2*Y2;
     C2:=X2*X2+Y2*Y2-X3*X3-Y3*Y3;
     D:=A1*B2-A2*B1;
     DX:=C1*B2-C2*B1;
     DY:=A1*C2-A2*C1;
     CX:=DX/D; CY:=DY/D;
     R:=Sqrt(Sqr(CX-X1)+Sqr(CY-Y1));

     Theta1:=Arccos((X1-CX)/R);
     If Y1<CY Then Theta1:=2*pi-Theta1;
     Theta2:=Arccos((X2-CX)/R);
     If Y2<CY Then Theta2:=2*pi-Theta2;
     Theta3:=Arccos((X3-CX)/R);
     If Y3<CY Then Theta3:=2*pi-Theta3;
     If Theta1>Theta2 Then
     Begin
          Real1:=Theta1; Theta1:=Theta2; Theta2:=Real1;
     End;
     If (Theta1-Theta3)*(Theta3-Theta2)<0 Then
     Begin
          Real1:=Theta1;
          Theta1:=Theta2-2*pi;
          Theta2:=Real1;
     End;

     If (0>Theta1) And (0<Theta2) Then
          Right1:=CX+R
     Else Begin
          If X1>X2 Then Right1:=X1 Else Right1:=X2;
     End;
     If (pi/2>Theta1) And (pi/2<Theta2) Then
          Up1:=CY+R
     Else Begin
          If Y1>Y2 Then Up1:=Y1 Else Up1:=Y2;
     End;
     If (pi>Theta1) And (pi<Theta2) Then
          Left1:=CX-R
     Else Begin
          If X1>X2 Then Left1:=X2 Else Left1:=X1;
     End;
     If (pi/2*3>Theta1) And (pi/2*3<Theta2) Then
          Down1:=CY-R
     Else Begin
          If Y1>Y2 Then Down1:=Y2 Else Down1:=Y1;
     End;

     Up:=Trunc(Up1);
     Down:=Trunc(Down1);
     Left:=Trunc(Left1);
     Right:=Trunc(Right1);
     If Up1-Trunc(Up1)>1E-7 Then Inc(Up);
     If Trunc(Down1)+1-Down1<1E-7 Then Inc(Down);
     If Right1-Trunc(Right1)>1E-7 Then Inc(Right);
     If Trunc(Left1)+1-Left1<1E-7 Then Inc(Left);
     WriteLn((Up-Down)*(Right-Left));
End.
Now I'm sure that "Uses Math;" will cause Crash. But how can I use arccos?
Послано XiaoTian 21 дек 2002 17:34
I got AC using Arctan instead.
Послано XiaoTian 22 дек 2002 09:06
Can you post it?
Послано I am david. Tabo. 22 дек 2002 13:24
>
ArcSin and ArcCos thru ArcTan for David.
Послано Илья Гофман (Ilya Gofman) 22 дек 2002 18:41
Hi David!
As you know, Pascal has only 3 trigonometrical functions - Sin(), Cos
() and ArcTan().
So, you can calculate ArcSin and ArcTan as follows:
ArcSin(x)=ArcTan(x/sqrt(1-sqr(x))) and
ArcCos(x)=ArcTan(sqrt(1-sqr(x))/x).
This is it.
  Good Luck!