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 !