Link to home
Start Free TrialLog in
Avatar of clo1
clo1

asked on

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 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 !
ASKER CERTIFIED SOLUTION
Avatar of Wyn
Wyn

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Wyn
Wyn

FYI :
You'd call it this way:
add_fract(f1, f2);

Follow suit all functions and You will get correct output.

Regards
W.Yinan
Hi!

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

Andrew
Avatar of clo1

ASKER

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 !
->I'm sorry but what does the function euclid do?
==============================
Yes ,clo1 ?