Java program for calculating fractions

2019-02-25 17:51发布

问题:

The purpose of the program is to get two user inputs for a fraction, receive a operator from the user, and then to get two more user inputs for a second fraction. The program must check that the numbers used in both fractions range between 0-99 and have a non-zero denominator. The program also has to make sure that the user inputs a valid operator (-,+,*,/).

The only problem I am facing now is that none of my variables are being initialized and that I don't know how to make the output look like so:

 1     1      3
--- + ---  = ---
 4     8      8

Here is the code I have so far, any help would be much appreciated because my knowledge for using java is minimal:

import java.util.Scanner;
public class FractionCalculator {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);

int n1;
int n2;
int d1;
int d2;
int n;
int d;
char o;
int m1,m2; 
int tempN1, tempN2;
int lcm, x;

System.out.println("Enter a numerator for fraction 1: ");
n1 = in.nextInt();
System.out.println("Enter a denominator for fraction 1: ");
d1 = in.nextInt();

if  (d1 > 0) {
  System.out.println(); 
} else {
  System.out.println("Invalid denominator");
  System.exit(0); 
}

System.out.println("Enter an operator: ");
o = in.next().toCharArray()[0]; 
System.out.println("Enter a numerator for fraction 2: ");
n2 = in.nextInt();
System.out.println("Enter a denominator for fraction 2: ");
d2 = in.nextInt();

if (d2 > 0) {
  System.out.println(); 
} else {
  System.out.println("Invalid denominator");
  System.exit(0); 
}


switch(o){
    case '*':
        n = n1 * n2;
        d = d1 * d2;
        break;

    case '/':
        n = n1 * d2;
        d = n2 * d1;
        break;

    case '+':
        int max=n1>d1?n1:d1;
        int min=n1<d1?n1:d1; 
        for(int i=1;i<=min;i++)
            x=max*i;
            if (x%min==0)
            lcm=x;      
        tempN1=n1*m1;
        tempN2=n2*m2;
        m1=lcm/d1;
        m2=lcm/d2;
        n = tempN1 + tempN2;
        d = lcm;
        break; 

    case '-':
        n = tempN1 - tempN2;
        d = lcm;
        break;
    default:
        System.out.println("Illegal Operator: "+ o);
        break; }
 }
}

回答1:

Maybe you want to enter OOP (object oriented programming):

Q x = new Q(1, 4);
Q y = new Q(1, 8);
Q z = x.plus(y);
System.out.println("%s + %s = %s%n", x, y, z);

(1 / 4) + (1 / 8) = (3 / 8)

public class Q {
    final int numerator;
    final int denominator;

    public Q(int numerator, int denominator) {
        int g = gcd(numerator, denominator);
        this.numerator = numerator / g;
        this.denominator = denominator / g;
    }

    @Override
    public String toString() {
        return String.format("(%d / %d)", numerator, denominator);
    }

    public Q plus(Q rhs) {
        return new Q(numerator * rhs.denominator + rhs.numerator * denominator,
            denominator * rhs.denominator);
    }


回答2:

One part of the problem: You have some logic that you need to perform both for '+' and '-', but the way you've written it, it will be executed for '+' only:

switch(o){
    ... other cases
    case '+':
        ... logic to compute lcm and other things
        n = tempN1 + tempN2;
        d = lcm;
        break; 

    case '-':
        n = tempN1 - tempN2;
        d = lcm;
        break;

When the user enters '-', the program won't go into the part under case '+'. This means that tempN1, tempN2, and lcm won't be set up. If you're getting errors from the compiler about uninitialized variables, this is one reason why.

One way to write code that is executed for multiple cases:

switch(o){
    ... other cases
    case '+':
    case '-':
        ... whatever logic will apply to both cases
        if (o == '+') {
            ... whatever logic will apply to + only
        } else {
            ... whatever logic will apply to - only
        }
        ... if you have more logic for both cases, you can put it here
        break;

That is, when you have more than one case right next to each other, with no code in between, the following code applies to multiple cases. (This is because of "fall-through". It actually goes to the case '+', and then since there's no break in the case '+' code, it falls through to the case '-'. But it's not recommended to take advantage of fall-through, except when there is no code at all as in the above.)



回答3:

UPDATE:

Be aware that this is my no means complete and/or the best solution, but at least it should take you in the right direction. You will still have to reduce fractions and do some other tweaks.

import java.math.BigInteger;
import java.util.Scanner;

public class FractionCalculator {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int n1;
        int n2;
        int d1;
        int d2;
        int n = 0;
        int d;
        char o;

        System.out.println("Enter a numerator for fraction 1: ");
        n1 = in.nextInt();
        System.out.println("Enter a denominator for fraction 1: ");
        d1 = in.nextInt();

        if (d1 > 0) {
            System.out.println();
        } else {
            System.out.println("Invalid denominator");
            System.exit(0);
        }

        System.out.println("Enter an operator: ");
        o = in.next().toCharArray()[0];
        System.out.println("Enter a numerator for fraction 2: ");
        n2 = in.nextInt();
        System.out.println("Enter a denominator for fraction 2: ");
        d2 = in.nextInt();

        if (d2 > 0) {
            System.out.println();
        } else {
            System.out.println("Invalid denominator");
            System.exit(0);
        }

        switch (o) {
            case '*':
                n = n1 * n2;
                d = d1 * d2;

                break;

            case '/':
                n = n1 * d2;
                d = n2 * d1;

                break;

            case '+':
            case '-':

                d = gcd(d1, d2);

                n1 *= d / d1;
                n2 *= d / d2;

                if(o == '+') {
                    n = n1 + n2;
                }
                else if(o == '-') {
                    n = n1 - n2;
                }

                break;
            default:
                System.out.println("Illegal Operator: " + o);
                return;
        }

        System.out.printf(" %d     %d     %d\n", n1, n2, n);
        System.out.printf("--- %c --- = ---\n", o);
        System.out.printf(" %d     %d     %d\n", d1, d2, d);
    }

    private static int gcd(int d1, int d2) {
        BigInteger gcd = new BigInteger(String.valueOf(d1)).gcd(new BigInteger(String.valueOf(d2)));
        return gcd.intValue();
    }
}