Unknow logical error

Can somebody help me, I don't know how come I will got 0 for the output, but I am ok if I use "int" for the struct. All I have to use is "double" in this program. Please help. Thanks !!

#include <stdio.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;
  char key;
 
  printf ("Enter the n & d for f1 ");
  scanf ("%f %f", &f1.n, &f1.d);

  printf ("Enter the n & d for f2 ");
  scanf ("%f %f", &f2.n, &f2.d);

  f3 = add_fract(f1, f2);

  printf ("f3 = %f/%f\n", f3.n, f3.d);

  return (0);
}

fract add_fract(fract f1, fract f2){
  fract f;
  int common, temp1, temp2;

  if (f1.d != f2.d){
    common = f1.d * f2.d;

      temp1 = common / f1.d;
      temp2 = common / f2.d;

      f1.n = f1.n * temp1;
      f2.n = f2.n * temp2;

      f.n = f1.n + f2.n;
      f.d = common;
  }
  else{
    f.n = f1.n + f2.n;
      f.d = f1.d;
  }
  return f;
}
LVL 2
clo1Asked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
deightonConnect With a Mentor Commented:
Voila!

                   #include <stdio.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;
                     char key;

                     printf ("Enter the n & d for f1 ");
                 scanf ("%lf %lf", &f1.n, &f1.d);

                     printf ("Enter the n & d for f2 ");
                 scanf ("%lf %lf", &f2.n, &f2.d);

                     f3 = add_fract(f1, f2);

                 printf ("f3 = %lf/%lf\n", f3.n, f3.d);

                     return (0);
                   }

                   fract add_fract(fract f1, fract f2){
                     fract f;
                     int common, temp1, temp2;

                     if (f1.d != f2.d){
                       common = f1.d * f2.d;

                   temp1 = common / f1.d;
                   temp2 = common / f2.d;

                   f1.n = f1.n * temp1;
                   f2.n = f2.n * temp2;

                   f.n = f1.n + f2.n;
                   f.d = common;
                     }
                     else{
                       f.n = f1.n + f2.n;
                   f.d = f1.d;
                     }
                     return f;
                   }
0
 
ntdragonCommented:
it a joke to give only 5 point for a questions like that but i"ll try to help you anyway

but i have a question first what did you mean about the "int" and the "double"???
0
 
clo1Author Commented:
I mean the declaration in the structure. It's okay for the output if it is "int", but not for "double". Thanks !
0
SMB Security Just Got a Layer Stronger

WatchGuard acquires Percipient Networks to extend protection to the DNS layer, further increasing the value of Total Security Suite.  Learn more about what this means for you and how you can improve your security with WatchGuard today!

 
ntdragonCommented:
first the add func is very stupid you
use:

common = f1.d * f2.d;

temp1 = common / f1.d;
temp2 = common / f2.d;

f1.n = f1.n * temp1;
f2.n = f2.n * temp2;

but temp1=f2.d
and temp2=f1.d
so why to use the temp

second i still don't know so first check with the debuger
if you don't lost any data when you entered the add func
i mean check f1.n,f1.d,f2.n,f2.d
when you just enter the func
0
 
daks2003Commented:
common is int
wheras fract members are double.
Did you give that intentionally or is it a mistake. common = f1.d*f2.d wont give proper result to common.
0
 
deightonCommented:
I forgot to mention.  I believe the problem was the use of %f in scanf, you need to use %lf in scanf & printf with a double (thats all I changed). %f would be used for a float.  That lets you get the data into your program so you can test it out.

A double is a sort of 'long float'

0
 
ntdragonCommented:
try to use common,temp1,temp2 as doubles
else they will be rounded
0
 
clo1Author Commented:
Very good. I can make it work now. Thanks for the remind. Cause I was totally forgot the %lf. Thanks

clo1
0
All Courses

From novice to tech pro — start learning today.