# Strange result

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 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_subtract = subtract_fract(&f1, &f2);
f3_multiply = multiply_fract(&f1, &f2);
f3_divide = divide_fract(&f1, &f2);

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 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

Subtract = -1/2
Multiply = 90/1
Divide = 8/5

THANKS !
LVL 2
###### Who is Participating?

Commented:
clo1 ,
The output is right by the logic code you give.

The problem is you change the F1 and F2 in Add and Substract function ,if you check it,you will find after substract function.the F1 become 36/3 ,F2 become 45/6.
Thus,you multiply them get:
90/1....

You'd pass F1 and F2 by value.
Change funciton declaration:
For example:
change
to

Regards
W.Yinan
0

Commented:
FYI :
You'd call it this way:

Follow suit all functions and You will get correct output.

Regards
W.Yinan
0

Commented:
Hi!

I'm sorry but what does the function euclid do?

Andrew
0

Author Commented:
Cool. Thanks for the help, cause I never notice the subtract function, I just thought that is the proble of the multiply and divide procedure. THANKS AGAIN !
0

Commented:
->I'm sorry but what does the function euclid do?
==============================
Yes ,clo1 ?
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.