ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Common Board

Can I use "Uses Math;" in pascal? I got Crash (ACCESS_VIOLATION)
Posted by XiaoTian 20 Dec 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?
Posted by XiaoTian 21 Dec 2002 17:34
I got AC using Arctan instead.
Posted by XiaoTian 22 Dec 2002 09:06
Can you post it?
Posted by I am david. Tabo. 22 Dec 2002 13:24
>
ArcSin and ArcCos thru ArcTan for David.
Posted by Илья Гофман (Ilya Gofman) 22 Dec 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!