Solved

# Strange result

Posted on 2000-03-14

Hi, according to the previous question, I have done my program, but there are some strange results comes out. Please help.

Here are the code:

----------------------------------------

#include <stdio.h>

#include <math.h>

typedef struct{

double n;

double d;

}fract;

fract add_fract(fract *f1, fract *f2);

fract subtract_fract(fract *f1, fract *f2);

fract multiply_fract(fract *f1, fract *f2);

fract divide_fract(fract *f1, fract *f2);

int main(void){

fract f1, f2, f3_add, f3_subtract, f3_multiply, f3_divide;

printf ("Numerator for f1: ");

scanf ("%lf", &f1.n);

printf ("Denorminator for f1: ");

scanf ("%lf", &f1.d);

printf ("Numerator for f2: ");

scanf ("%lf", &f2.n);

printf ("Denorminator for f2: ");

scanf ("%lf", &f2.d);

f3_add = add_fract(&f1, &f2);

f3_subtract = subtract_fract(&f1, &f2);

f3_multiply = multiply_fract(&f1, &f2);

f3_divide = divide_fract(&f1, &f2);

printf ("\nAdd = %d/%d\n", (int)f3_add.n, (int)f3_add.d);

printf ("Subtract = %d/%d\n", (int)f3_subtract.n, (int)f3_subtract.d);

printf ("Multiply = %d/%d\n", (int)f3_multiply.n, (int)f3_multiply.d);

printf ("Divide = %d/%d\n", (int)f3_divide.n, (int)f3_divide.d);

return (0);

}

fract add_fract(fract *f1, fract *f2){

fract f;

double common, gcd;

if (f1->d != f2->d){

common = f1->d * f2->d; //Find the common denorminator

f1->n = f1->n * f2->d;

f2->n = f2->n * f1->d;

(int)f.n = f1->n + f2->n;

(int)f.d = common;

gcd = euclid(&f.n, &f.d);

}

else{

f.n = f1->n + f2->n;

f.d = f1->d;

gcd = euclid(&f.n, &f.d);

}

return f;

}

fract subtract_fract(fract *f1, fract *f2){

fract f;

double common, gcd;

if (f1->d != f2->d){

common = f1->d * f2->d; //Find the common denorminator

f1->n = f1->n * f2->d;

f2->n = f2->n * f1->d;

f.n = f1->n - f2->n;

f.d = common;

gcd = euclid(&f.n, &f.d);

}

else{

f.n = f1->n + f2->n;

f.d = f1->d;

gcd = euclid(&f.n, &f.d);

}

return f;

}

fract multiply_fract(fract *f1, fract *f2){

fract f;

double gcd;

f.n = f1->n * f2->n;

f.d = f1->d * f2->d;

gcd = euclid(&f.n, &f.d);

return f;

}

fract divide_fract(fract *f1, fract *f2){

fract f;

double gcd;

if (f1->d != 0 || f2->d != 0){

f.n = f1->n * f2->d;

f.d = f1->d * f2->n;

gcd = euclid(&f.n, &f.d);

}

else printf ("Cannot divide by zero\n");

return f;

}

---------------------------------------

The output are as the following if I input 1/3 and 5/6

Add = 7/6

Subtract = -1/2

Multiply = 90/1

Divide = 8/5

THANKS !