// 02262008.cpp, P H Anderson, Feb 26, '08

#include <stdio.h>
#include <math.h>

typedef struct
{
    float x;
    float y;
} RECT;

typedef struct 
{
    float r;
    float ang;
} POLAR;

typedef struct
{
    float num;
    float denom;
} FRACT;

POLAR rect_to_polar(RECT a);
RECT polar_to_rect(POLAR a);
FRACT sub_f(FRACT a, FRACT b);

int main()
{
    RECT v1, v2;
    POLAR v3, v4;
    FRACT v5, v6, v7;
    
    v1.x = 3.0; v1.y = 4.0;  // 3.0 + j4.0           
    v4 = rect_to_polar(v1);
    printf("%.2f %.2f\n", v4.r, v4.ang);
    
    v3.r = 13.2; v3.ang = M_PI / 4;  // 13.2 at 45 degrees
    v2 = polar_to_rect(v3);
    printf("%.2f %.2f\n", v2.x, v2.y);    
    
    v5.num = 3; v5.denom = 4; v6.num = 1.0; v6.denom = 8.0; // 3/4 - 1/8
    
    v7 = sub_f(v5, v6);
    printf("%.2f %.2f\n", v7.num, v7.denom);
    printf("%.2f\n", v7.num / v7.denom);
    
    while(getchar() != 'x')
    {
    }    
        
}

POLAR rect_to_polar(RECT a)
{
    POLAR v;
    v.r = hypot(a.x, a.y);
    v.ang = atan2(a.y, a.x);
    return(v);
}

RECT polar_to_rect(POLAR a)
{
    RECT b;
    b.x = a.r * cos(a.ang);
    b.y = a.r * sin(a.ang);
    return(b);
}

FRACT sub_f(FRACT a, FRACT b)
{
    FRACT c;
    c.denom = a.denom * b.denom;
    c.num = a.num * b.denom - b.num * a.denom;
    return(c);
}
/* Results
5.00 0.93
9.33 9.33
20.00 32.00
0.63
*/