0
/* A Program testing for rational number*/
#include <stdio.h>
#include <stdlib.h>


typedef struct rational_t {
     int numer;
     int denom;
} rational_t;

int gcd(int a, int b)
{
  /* To reduce the rational number to its lowest form. */
if(b==0)
return a;
else
return gcd(b,a%b);
}
/* r_init: Creates rational number representing numer/denom and returns it*/
rational_t  r_init(int numer, int denom)
{
rational_t z;
z.numer = numer;
z.denom = denom;
return z;

}
/* r_add: Returns a rational_t representing x+y */
rational_t r_add(rational_t  x, rational_t  y)
{
rational_t z;
int numer_x = x.numer;
int denom_x = x.denom;

int numer_y = y.numer;
int denom_y = y.denom;

int numer_z = (numer_x * denom_y) + (numer_y * denom_x);
int denom_z = denom_y * denom_x;

int sd = gcd(numer_z,denom_z);

z.numer = numer_z/sd;
z.denom = denom_z/sd;
return z;


}
/* r_sub: Returns a rational_t representing x-y */
rational_t  r_sub(rational_t  x, rational_t  y)
{
rational_t z;
int numer_x = x.numer;
int denom_x = x.denom;

int numer_y = y.numer;
int denom_y = y.denom;

int numer_z = (numer_x * denom_y) - (numer_y * denom_x);
int denom_z = denom_y * denom_x;

int sd = gcd(numer_z,denom_z);

z.numer = numer_z/sd;
z.denom = denom_z/sd;
return z;


}
/* r_mul: Returns a rational_t representing x*y */
rational_t  r_mul(rational_t  x, rational_t  y)
{
rational_t z;
int numer_x = x.numer;
int denom_x = x.denom;

int numer_y = y.numer;
int denom_y = y.denom;

int numer_z = (numer_x * numer_y); 
int denom_z = denom_y * denom_x;

int sd = gcd(numer_z,denom_z);

z.numer = numer_z/sd;
z.denom = denom_z/sd;
return z;

}
/* r_div: Returns a rational_t representing x/y */
rational_t  r_div(rational_t  x, rational_t  y)
{
rational_t z;
int numer_x = x.numer;
int denom_x = x.denom;

int numer_y = y.numer;
int denom_y = y.denom;

int numer_z = (numer_x * denom_y); 
int denom_z = numer_y * denom_x;

int sd = gcd(numer_z,denom_z);

z.numer = numer_z/sd;
z.denom = denom_z/sd;
return z;


}
/* r_toreal: Returns a double representing x */
double r_toreal(rational_t  x)
{
return x.numer/x.denom;


}

/* r_print: prints rational as x/y (using printf */
void r_print(rational_t  x)
{
printf("%d/%d",x.numer,x.denom);

}



int main(void)
{


     printf("Rational Arithmetic test program\n");

     do {
      int u,v, oper;
      rational_t x, y, z;

      printf("x - numerator: ");
      scanf("%d", &u);
      printf("x - denominator: ");

     HERE:  scanf("%d", &v);
      if(v==0)
      {
      printf("Don't use 0 \n");
      goto HERE;
      }

      x = r_init(u,v);

      printf("y - numerator: ");
      scanf("%d", &u);
      printf("y - denominator: ");
      H:scanf("%d", &v);
       if(v==0)
      {
      printf("Don't use 0 \n");
      goto H;
      }

      y = r_init(u,v);

      printf("x is: ");
      r_print(x);
      printf("\n");

      printf("y is: ");
      r_print(y);
      printf("\n");

      printf("Operation (1=Add,2=Sub,3=Mul,4=Div,0=End): ");

      scanf("%d", &oper);

      switch (oper) {
      case 1:
           z = r_add(x,y);
           break;
      case 2:
           z = r_sub(x,y);
           break;
      case 3:
           z = r_mul(x,y);
           break;
      case 4:
           z = r_div(x,y);
           break;
      case 0:
           return 0;
      default:
           printf("Unknown operation!\n");
           break;
      }

      printf("z is: ");
      r_print(z);
      printf("\n");  
     } while(1);

     return 0;
}

given the code above,hw can i make x and y give me the lowest form of the rational numbers

Edited by Dani: Formatting fixed

2
Contributors
1
Reply
2
Views
7 Years
Discussion Span
Last Post by Tom Gunn
0

hw can i make x and y give me the lowest form of the rational numbers

Do you mean you want to reduce a fraction?

HERE: scanf("%d", &v);
if(v==0)
{
printf("Don't use 0 \n");
goto HERE;
}

HERE is a terrible name for a goto label. But a jump does not buy you anything here. A loop is much clearer:

while (scanf("%d", &v) != 1 || v == 0)
{
    printf("Invalid entry. Try again: ");
}
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.