Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.24 KB | None | 0 0
  1. /* Begin DO_NOT_MODIFY_REGION */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>  /* Provides the abs function */
  5. #include <string.h>
  6.  
  7. typedef struct fraction {
  8.       int numerator;
  9.       int denominator;
  10. } Fraction;
  11.  
  12. int gcd(int x, int y);
  13. /* Precondition: a and b must be positive */
  14.  
  15. Fraction ReduceFraction(Fraction R);
  16.  
  17. Fraction inputFraction();
  18. /* Prompts for, inputs and returns a single fraction */
  19.  
  20.  
  21. Fraction AddFractions(Fraction R1, Fraction R2);
  22. /* Returns R1+R2 in reduced form */
  23. Fraction SubtractFractions(Fraction R1, Fraction R2);
  24. /* Returns R1-R2 in reduced form */
  25. Fraction MultiplyFractions(Fraction R1, Fraction R2);
  26. /* Returns R1*R2 in reduced form */
  27. Fraction DivideFractions(Fraction R1, Fraction R2);
  28. /* Precondition: in reduced form R2 must be nonzero
  29.    Returns R1/R2 */
  30.  
  31. void PrintResult(Fraction R1, Fraction R2, int op);
  32. /* Carries out the operation indicated by op and prints
  33.    a string showing the two operand, the operator and the result */
  34.  
  35. void GetAndDoFractionOp(int op);
  36. /* Prompts for two fractions
  37.    then carries out the specified operation and prints
  38.    the result.  In the case of division, checks to see
  39.    if the second fraction is zero; if so, continues
  40.    prompting for and inputing fractions until a nonzero
  41.    fraction is input */
  42.  
  43. int main()
  44. {
  45.    char response, theOp;
  46.  
  47.    do {
  48.       printf("\n\n-----------------------------------------");
  49.       printf("\n\nEnter the operator you want to apply (+,-,*,/)\n");
  50.       scanf(" %c",&theOp);
  51.       while(getchar() != '\n');
  52.       while( theOp != '+' && theOp != '-' && theOp != '*' && theOp != '/')
  53.       {
  54.      printf("%c is not a valid operator; try again\n",theOp);
  55.      scanf(" %c",&theOp);
  56.      while(getchar() != '\n');
  57.       }
  58.       GetAndDoFractionOp(theOp);
  59.       printf("Do you wish to do another (Y/N)?");
  60.       scanf(" %c",&response);
  61.    } while(toupper(response) == 'Y');
  62.  
  63.    printf("Normal termination\n\n");
  64.    return 0;
  65. }
  66.  
  67. int gcd(int x, int y)
  68. {
  69.    if (x%y == 0)
  70.       return y;
  71.    return gcd(y,x%y);
  72. }
  73.  
  74. Fraction ReduceFraction(Fraction R)
  75. {
  76.    int d;
  77.    if (R.numerator == 0)
  78.    {
  79.       R.denominator = 1;
  80.       return R;
  81.    }
  82.    d = gcd(abs(R.numerator),abs(R.denominator));
  83.    R.numerator /= d;
  84.    R.denominator /= d;
  85.  
  86.    if (R.denominator < 0)
  87.    {
  88.       R.numerator *= -1;
  89.       R.denominator *= -1;
  90.    }
  91.    return R;
  92. }
  93.  
  94. /* End DO_NOT_MODIFY_REGION */
  95.  
  96. /* You supply the definitions for the remaining functions */
  97.  
  98. Fraction InputFraction()
  99. /* No prompts; just input the fraction */
  100. {
  101.    Fraction R = { 0, 0};
  102.    scanf("%d/%d", &R.numerator, &R.denominator);
  103.    while (R.denominator == 0){
  104.     printf("The denominator cannot be 0, input again (n/d) \n");
  105.     scanf("%d/%d", &R.numerator, &R.denominator);
  106.    }
  107.    return R;
  108. }
  109.  
  110. Fraction AddFractions(Fraction R1, Fraction R2)
  111. {
  112.    Fraction R3 = {0, 0};
  113.  
  114.    R3.denominator = R1.denominator * R2.denominator;
  115.    R3.numerator = R1.numerator * R2.denominator + R2.numerator * R1.denominator;
  116.    R3 = ReduceFraction(R3);
  117.    return R3;
  118. }
  119.  
  120. Fraction SubtractFractions(Fraction R1, Fraction R2)
  121. {
  122.    Fraction R3 = {0, 0};
  123.  
  124.    R3.denominator = R1.denominator * R2.denominator;
  125.    R3.numerator = R1.numerator * R2.denominator - R2.numerator * R1.denominator;
  126.    R3 = ReduceFraction(R3);
  127.    return R3;
  128. }
  129.  
  130. Fraction MultiplyFractions(Fraction R1, Fraction R2)
  131. {
  132.    Fraction R3 = { 0, 0};
  133.  
  134.    R3.numerator = R1.numerator * R2.numerator;
  135.    R3.denominator = R1.denominator * R2.denominator;
  136.    R3 = ReduceFraction(R3);
  137.    return R3;
  138. }
  139.  
  140. Fraction DivideFractions(Fraction R1, Fraction R2)
  141. {
  142.    Fraction R3 = {0, 0};
  143.    int temp = 0; /* place holder */
  144.  
  145.    temp = R2.numerator;
  146.  
  147.    R2.numerator = R2.denominator;
  148.    R2.denominator = temp;
  149.  
  150.    R3.numerator = R1.numerator * R2.numerator;
  151.    R3.denominator = R1.denominator * R2.denominator;
  152.    R3 = ReduceFraction(R3);
  153.    return R3;
  154.  
  155. }
  156.  
  157. void PrintResult(Fraction R1, Fraction R2, int op)
  158. {
  159.    Fraction R3 = {0, 0};
  160.  
  161.    if (op == '*'){
  162.       R3 = MultiplyFractions (R1, R2);
  163.       R3 = ReduceFraction(R3);
  164.       printf ("%d/%d * %d/%d = %d/%d\n", R1.numerator, R1.denominator, R2.numerator, R2.denominator, R3.numerator, R3.denominator);
  165.    }else if (op == '+'){
  166.       R3 = AddFractions (R1, R2);
  167.       R3 = ReduceFraction(R3);
  168.       printf("%d/%d + %d/%d = %d/%d\n", R1.numerator, R1.denominator, R2.numerator, R2.denominator, R3.numerator, R3.denominator);
  169.    }else if (op == '-'){
  170.       R3 = SubtractFractions (R1, R2);
  171.       R3 = ReduceFraction(R3);
  172.       printf("%d/%d - %d/%d = %d/%d\n", R1.numerator, R1.denominator, R2.numerator, R2.denominator, R3.numerator, R3.denominator);
  173.    }else {
  174.       while (R2.numerator == 0 || R2.denominator == 0){
  175.      printf ("Cannot divide by 0, input another fraction\n");
  176.      R2 = InputFraction();
  177.       }
  178.       R3 = DivideFractions (R1, R2);
  179.       R3 = ReduceFraction(R3);
  180.       printf("%d/%d / %d/%d = %d/%d\n", R1.numerator, R1.denominator, R2.numerator, R2.denominator, R3.numerator, R3.denominator);
  181.    }
  182.  
  183. }
  184.  
  185. void GetAndDoFractionOp(int op)
  186. {
  187.    Fraction R1 = {0, 0}, R2 = {0, 0};
  188.    printf("Enter the first fraction argument (n/d): \n");
  189.    R1 = InputFraction();
  190.    printf("Enter the second fraction argument (n/d): \n");
  191.    R2 = InputFraction();
  192.    PrintResult (R1, R2, op);
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement