Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Begin DO_NOT_MODIFY_REGION */
- #include <stdio.h>
- #include <stdlib.h> /* Provides the abs function */
- #include <string.h>
- typedef struct fraction {
- int numerator;
- int denominator;
- } Fraction;
- int gcd(int x, int y);
- /* Precondition: a and b must be positive */
- Fraction ReduceFraction(Fraction R);
- Fraction inputFraction();
- /* Prompts for, inputs and returns a single fraction */
- Fraction AddFractions(Fraction R1, Fraction R2);
- /* Returns R1+R2 in reduced form */
- Fraction SubtractFractions(Fraction R1, Fraction R2);
- /* Returns R1-R2 in reduced form */
- Fraction MultiplyFractions(Fraction R1, Fraction R2);
- /* Returns R1*R2 in reduced form */
- Fraction DivideFractions(Fraction R1, Fraction R2);
- /* Precondition: in reduced form R2 must be nonzero
- Returns R1/R2 */
- void PrintResult(Fraction R1, Fraction R2, int op);
- /* Carries out the operation indicated by op and prints
- a string showing the two operand, the operator and the result */
- void GetAndDoFractionOp(int op);
- /* Prompts for two fractions
- then carries out the specified operation and prints
- the result. In the case of division, checks to see
- if the second fraction is zero; if so, continues
- prompting for and inputing fractions until a nonzero
- fraction is input */
- int main()
- {
- char response, theOp;
- do {
- printf("\n\n-----------------------------------------");
- printf("\n\nEnter the operator you want to apply (+,-,*,/)\n");
- scanf(" %c",&theOp);
- while(getchar() != '\n');
- while( theOp != '+' && theOp != '-' && theOp != '*' && theOp != '/')
- {
- printf("%c is not a valid operator; try again\n",theOp);
- scanf(" %c",&theOp);
- while(getchar() != '\n');
- }
- GetAndDoFractionOp(theOp);
- printf("Do you wish to do another (Y/N)?");
- scanf(" %c",&response);
- } while(toupper(response) == 'Y');
- printf("Normal termination\n\n");
- return 0;
- }
- int gcd(int x, int y)
- {
- if (x%y == 0)
- return y;
- return gcd(y,x%y);
- }
- Fraction ReduceFraction(Fraction R)
- {
- int d;
- if (R.numerator == 0)
- {
- R.denominator = 1;
- return R;
- }
- d = gcd(abs(R.numerator),abs(R.denominator));
- R.numerator /= d;
- R.denominator /= d;
- if (R.denominator < 0)
- {
- R.numerator *= -1;
- R.denominator *= -1;
- }
- return R;
- }
- /* End DO_NOT_MODIFY_REGION */
- /* You supply the definitions for the remaining functions */
- Fraction InputFraction()
- /* No prompts; just input the fraction */
- {
- Fraction R = { 0, 0};
- scanf("%d/%d", &R.numerator, &R.denominator);
- while (R.denominator == 0){
- printf("The denominator cannot be 0, input again (n/d) \n");
- scanf("%d/%d", &R.numerator, &R.denominator);
- }
- return R;
- }
- Fraction AddFractions(Fraction R1, Fraction R2)
- {
- Fraction R3 = {0, 0};
- R3.denominator = R1.denominator * R2.denominator;
- R3.numerator = R1.numerator * R2.denominator + R2.numerator * R1.denominator;
- R3 = ReduceFraction(R3);
- return R3;
- }
- Fraction SubtractFractions(Fraction R1, Fraction R2)
- {
- Fraction R3 = {0, 0};
- R3.denominator = R1.denominator * R2.denominator;
- R3.numerator = R1.numerator * R2.denominator - R2.numerator * R1.denominator;
- R3 = ReduceFraction(R3);
- return R3;
- }
- Fraction MultiplyFractions(Fraction R1, Fraction R2)
- {
- Fraction R3 = { 0, 0};
- R3.numerator = R1.numerator * R2.numerator;
- R3.denominator = R1.denominator * R2.denominator;
- R3 = ReduceFraction(R3);
- return R3;
- }
- Fraction DivideFractions(Fraction R1, Fraction R2)
- {
- Fraction R3 = {0, 0};
- int temp = 0; /* place holder */
- temp = R2.numerator;
- R2.numerator = R2.denominator;
- R2.denominator = temp;
- R3.numerator = R1.numerator * R2.numerator;
- R3.denominator = R1.denominator * R2.denominator;
- R3 = ReduceFraction(R3);
- return R3;
- }
- void PrintResult(Fraction R1, Fraction R2, int op)
- {
- Fraction R3 = {0, 0};
- if (op == '*'){
- R3 = MultiplyFractions (R1, R2);
- R3 = ReduceFraction(R3);
- printf ("%d/%d * %d/%d = %d/%d\n", R1.numerator, R1.denominator, R2.numerator, R2.denominator, R3.numerator, R3.denominator);
- }else if (op == '+'){
- R3 = AddFractions (R1, R2);
- R3 = ReduceFraction(R3);
- printf("%d/%d + %d/%d = %d/%d\n", R1.numerator, R1.denominator, R2.numerator, R2.denominator, R3.numerator, R3.denominator);
- }else if (op == '-'){
- R3 = SubtractFractions (R1, R2);
- R3 = ReduceFraction(R3);
- printf("%d/%d - %d/%d = %d/%d\n", R1.numerator, R1.denominator, R2.numerator, R2.denominator, R3.numerator, R3.denominator);
- }else {
- while (R2.numerator == 0 || R2.denominator == 0){
- printf ("Cannot divide by 0, input another fraction\n");
- R2 = InputFraction();
- }
- R3 = DivideFractions (R1, R2);
- R3 = ReduceFraction(R3);
- printf("%d/%d / %d/%d = %d/%d\n", R1.numerator, R1.denominator, R2.numerator, R2.denominator, R3.numerator, R3.denominator);
- }
- }
- void GetAndDoFractionOp(int op)
- {
- Fraction R1 = {0, 0}, R2 = {0, 0};
- printf("Enter the first fraction argument (n/d): \n");
- R1 = InputFraction();
- printf("Enter the second fraction argument (n/d): \n");
- R2 = InputFraction();
- PrintResult (R1, R2, op);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement