HP Forums
multi criteria IF statement - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: HP Prime (/forum-5.html)
+--- Thread: multi criteria IF statement (/thread-17093.html)



multi criteria IF statement - Amer7 - 06-11-2021 11:06 AM

Hello,

I'm trying to write a program for directional angle calculation.

But my issue are the IF statements.

I have to test two variables in 4 different scenarios.

example Local y,x,n;

IF ( y>0 and x>0) then n:=ATAN( y/x); /// 1' scenario if the y or x is not greater next test
IF( y>0 and x<0) then n:=ATAN (y/x)+180; //// 2' scenario
IF( y<0 and x<0) then n:=ATAN(y/x)+180; //// 3' scenario
IF ( y<0 and x>0) then n:=ATAN(y/x)+360; ///// 4'

And i'm not sure how to write it.

Code:
IF ( y>0) THEN
    IF (x>0) THEN
    n:=ATAN(y/x);
    ELSE
IF ( y>0) THEN
    IF( x<0) THEN
    n:=(ATAN(y/x))+pi;
    ELSE
IF ( y<0) THEN
    IF(x<0) THEN
    n:=(ATAN(y/x))+pi;
    ELSE
    n:=(ATAN(y/x))+(2*pi);

I have tried like that, but i't doesnt give the correct awnser. And also at end of program i have to write END; like 6 times or so.


RE: multi criteria IF statement - roadrunner - 06-11-2021 11:37 AM

I would probably use a case statement for that task:

Code:
EXPORT Amer7scode(x,y)
BEGIN
 LOCAL n, orig;
 orig:=HAngle; 
 HAngle:=1;
 CASE
  IF y>0 AND x>0 THEN n:=ATAN(y/x) END;
  IF y>0 AND x<0 THEN n:=ATAN(y/x)+180 END;
  IF y<0 AND x<0 THEN n:=ATAN(y/x)+180 END;
  IF y<0 AND x>0 THEN n:=ATAN(y/x)+360 END;
  DEFAULT n:="error"
 END;
 HAngle:=orig;
 RETURN n;
END;

-road


RE: multi criteria IF statement - Amer7 - 06-11-2021 11:59 AM

Thanks,
that worked like charm. I wonder where, and how you learn these tricks and expressions.

Here is the complete code for Directional Angle - Geodesy - HP Prime
Code:
EXPORT Directional()
BEGIN
LOCAL Ay,Ax,By,Bx;
INPUT({Ay,Ax,By,Bx},"Direkcioni", {"Y tacke A","X tacke A","Y tacke B","X tacke b"});

LOCAL y,x,n,c;
y:=By-Ay;
x:=Bx-Ax;

CASE
  IF y>0 AND x>0 THEN n:=ATAN(y/x) END;
  IF y>0 AND x<0 THEN n:=ATAN(y/x)+180 END;
  IF y<0 AND x<0 THEN n:=ATAN(y/x)+180 END;
  IF y<0 AND x>0 THEN n:=ATAN(y/x)+360 END;
  DEFAULT n:="error"
 END;
 c:=→HMS(n);
 RETURN c;
END;



RE: multi criteria IF statement - toml_12953 - 06-11-2021 02:04 PM

(06-11-2021 11:06 AM)Amer7 Wrote:  Hello,

I'm trying to write a program for directional angle calculation.

Why write a function when one is already built in?

look up ARG(X+i*Y)


RE: multi criteria IF statement - Liamtoh Resu - 06-11-2021 10:09 PM

As a new prime user I appreciate seeing smaller programs even if they replicate built-in functions.

I have several questions.

1. How does the program know that the calculator is in degrees mode versus radians?

2. What does "c:=→HMS(n);" mean? It probably has to do with the HMS function
which I haven't used yet.

3. What is the english translation for the word "tacke"

Thanks.


RE: multi criteria IF statement - Dougggg - 06-12-2021 03:05 AM

I can answer the 1st 2

1 there is a system varable HAngle you can set to 0 for radian and 1 for degrees, by default it is set in the setup screen or app

2 →HMS() changes a degree to DMS
HMS→() changes DMS to degree

3 I dont know


RE: multi criteria IF statement - Albert Chan - 06-12-2021 11:53 AM

(06-12-2021 03:05 AM)Dougggg Wrote:  there is a system varable HAngle you can set to 0 for radian and 1 for degrees, by default it is set in the setup screen or app

On HP Prime emulator, HAngle cannot be set to 0 in CAS (Why?)

CAS> HAngle := 0       → "HAngle(0) Error: Bad Argument Value"

It might be better to use AAngle instead, see http://edspi31415.blogspot.com/2018/02/hp-prime-custom-app-geomcalc.html

Code:
EXPORT bearing(x,y) // x=north, y=east
BEGIN
IF x = 0 THEN       // avoid divide-by-0
    y := sign(y)*90;
ELSE
    AAngle := 2;    // degree mode
    y := atan(y/x) + (x<0)*180;
    AAngle := 0;    // restore
END;
return →HMS(y MOD 360);
END;

(06-11-2021 02:04 PM)toml_12953 Wrote:  Why write a function when one is already built in?

look up ARG(X+i*Y)

Because there is a bug in ARG ?
see https://www.hpmuseum.org/forum/thread-16977.html

We can use atan2 instead.

Code:
EXPORT bearing(x,y) // x=north, y=east
BEGIN
AAngle := 2;        // degree mode
y := atan2(y,x);
AAngle := 0;        // restore
return →HMS(y MOD 360);
END;



RE: multi criteria IF statement - David Hayden - 06-12-2021 02:28 PM

Don't forget to handle points on the vertical axis, including the origin. I'll arbitrarily assign 0 to atan(0,0). I haven't had nearly enough coffee yet and I'm not fluent in PPL, but in C++:

Code:
        if (x==0) {
            if (y == 0)
                n = 0;      // at the origin
            else
                n = 90 + 180*(y<0);  // on the y axis
        } else {
            // C++ atan() returns radians, so convert to degrees
            n = atan(y/x) * 180 / 3.141592653589792; // assume 1st quadrant
            if (x < 0) n += 180;    // adjust for quadrants 2 and 3
            else if (y < 0) n += 360; // adjust for quadrant 4
        }



RE: multi criteria IF statement - toml_12953 - 06-13-2021 05:35 AM

(06-12-2021 11:53 AM)Albert Chan Wrote:  
(06-12-2021 03:05 AM)Dougggg Wrote:  there is a system varable HAngle you can set to 0 for radian and 1 for degrees, by default it is set in the setup screen or app

On HP Prime emulator, HAngle cannot be set to 0 in CAS (Why?)

CAS> HAngle := 0       → "HAngle(0) Error: Bad Argument Value"

It might be better to use AAngle instead, see http://edspi31415.blogspot.com/2018/02/hp-prime-custom-app-geomcalc.html

Code:
EXPORT bearing(x,y) // x=north, y=east
BEGIN
IF x = 0 THEN       // avoid divide-by-0
    y := sign(y)*90;
ELSE
    AAngle := 2;    // degree mode
    y := atan(y/x) + (x<0)*180;
    AAngle := 0;    // restore
END;
return →HMS(y MOD 360);
END;

(06-11-2021 02:04 PM)toml_12953 Wrote:  Why write a function when one is already built in?

look up ARG(X+i*Y)

Because there is a bug in ARG ?
see https://www.hpmuseum.org/forum/thread-16977.html

The bug must have been fixed again. I get the proper 45 with all the examples in that thread.


RE: multi criteria IF statement - Joe Horn - 06-13-2021 01:10 PM

(06-13-2021 05:35 AM)toml_12953 Wrote:  
(06-12-2021 11:53 AM)Albert Chan Wrote:  Because there is a bug in ARG ?
see https://www.hpmuseum.org/forum/thread-16977.html

The bug must have been fixed again. I get the proper 45 with all the examples in that thread.

Strange... my G2 running firmware 14588 (2021 05 05) still has that bug (namely, arg(3+3.*i) in CAS view returns its answer in radians even when Prime is in Degrees mode). Make sure you're in CAS view, degree mode, and include the decimal point.


RE: multi criteria IF statement - toml_12953 - 06-13-2021 03:19 PM

(06-13-2021 01:10 PM)Joe Horn Wrote:  
(06-13-2021 05:35 AM)toml_12953 Wrote:  The bug must have been fixed again. I get the proper 45 with all the examples in that thread.

Strange... my G2 running firmware 14588 (2021 05 05) still has that bug (namely, arg(3+3.*i) in CAS view returns its answer in radians even when Prime is in Degrees mode). Make sure you're in CAS view, degree mode, and include the decimal point.

I just checked it again. Now it comes up with radians. I was sure I checked the angular mode before but I must not have. Of course in Home mode, it does work properly and that's the mode I always use so I never would have run into this bug.


RE: multi criteria IF statement - Liamtoh Resu - 06-16-2021 02:58 AM

I found that while in CAS mode the prime allows HAngle to be set to one or two.

After an attempt to do

HAngle:=0

an error message appears, namely:

"HAngle(0) Error: Bad Argument Value"

I wonder if this a feature or a bug and if it is causing the problems
noted in this thread.

It seems that setting AAngle is not affected.

Thanks.