Code not advancing after using Scanner in Java

时间:2015-08-07 02:37:26

标签: java java.util.scanner

I've been picking through this code for a while and can't find out why the code won't continue to execute after the user has entered all of their fractions from the console. Here's the code:

Edit - added Fraction class below. May be the toString function on this class?

package AddingFractions;
import java.util.Scanner;

public class AddingFractions {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        System.out.println("How many fractions are you adding?");
        int numOfFractions = input.nextInt();
        input.nextLine();
        Fraction[] fractions = new Fraction[numOfFractions];
        System.out.println("Enter fractions in format Num/Denom: ");
        String[] userFraction = input.nextLine().split("/");

        //add all fractions to the array
        for(int i = 0; i < numOfFractions - 1; i++){
            //takes user input and initializes fractions with long values
            fractions[i] = new Fraction(Long.parseLong(userFraction[0]),Long.parseLong(userFraction[1]));
            System.out.println("Next fraction: ");
            userFraction = input.nextLine().split("/");
        }
        //add fractions together consecutively, reducing as it goes
        for(int i = 0; i < numOfFractions - 1; i++){
            fractions[i+1] = Fraction.reduce(Fraction.addFractions(fractions[i], fractions[i + 1]));
            fractions[i] = null;
            for(int j = 0; j < numOfFractions - 1; j++){
                System.out.println(fractions[j]);
            }
        }
        //prints final reduced fraction
        System.out.println(fractions[numOfFractions - 1].getNumerator() + " / " +
            fractions[numOfFractions - 1].getDenominator());
    }

And here is a sample interaction with the console. I can keep pressing ENTER at the end and I'm still not getting to any of the other statements.

How many fractions are you adding?
3
Enter fractions in format Num/Denom: 
4/65
Next fraction: 
45/100
Next fraction: 
3/10

Fraction class

package AddingFractions;

public class Fraction {

    private long numerator;
    private long denominator;

    public Fraction(long newNumerator,long newDenominator){
        this.numerator = newNumerator;
        this.denominator = newDenominator;
    }

    public long getNumerator() {
        return numerator;
    }

    public void setNumerator(long newNumerator) {
        this.numerator = newNumerator;
    }

    public void setDenominator(long newDenominator) {
        this.denominator = newDenominator;
    }

    public long getDenominator() {
        return denominator;
    }

    public static Fraction addFractions(Fraction fractionA, Fraction fractionB) {
        //gcd = greatest common denominator
        long gcd = getGreatestCommonDenominator(fractionA, fractionB);
        //multiples all values by the gcd
        fractionA.setNumerator(fractionA.getNumerator() * gcd);
        fractionA.setDenominator(fractionB.getDenominator() * gcd);
        fractionB.setNumerator(fractionB.getNumerator() * gcd);
        fractionB.setDenominator(fractionB.getDenominator() * gcd);
        //adds fractions together and returns new fraction
        return new Fraction((fractionA.getNumerator()+fractionB.getNumerator()),
                (fractionB.getDenominator()+fractionA.getDenominator()));
    }

    public static long getGreatestCommonDenominator(Fraction fractionA, Fraction fractionB) {
        long aDenom = fractionA.getDenominator();
        long bDenom = fractionB.getDenominator();

        if(aDenom == 0){
            return bDenom;
        }
        while (bDenom != 0){
            if(bDenom > aDenom){
                aDenom = aDenom - bDenom;
            }
            else{
                bDenom = bDenom - aDenom;
            }
        }
        return aDenom;
    }

    public static long getGreatestCommonDivisor(long a, long b){
        if(a == 0){
            return b;
        }
        while (b != 0){
            if(b > a){
                a = a - b;
            }
            else{
                b = b - a;
            }
        }
        return a;
    }

    public static Fraction reduce(Fraction unreducedFraction){
        long gcd = getGreatestCommonDivisor(unreducedFraction.getNumerator(),unreducedFraction.getDenominator());
        long newDenominator = unreducedFraction.getDenominator()/gcd;
        long newNumerator = unreducedFraction.getNumerator()/gcd;

        Fraction reducedFraction = new Fraction(newNumerator, newDenominator);

        return reducedFraction;
    }
}

1 个答案:

答案 0 :(得分:1)

你的问题在这里:

while (bDenom != 0){
    if(bDenom > aDenom){
        aDenom = aDenom - bDenom;
    }
    else{
        bDenom = bDenom - aDenom;
    }
}

无限循环。

如果您尝试使用&lt; 3 fractions

运行程序,也会出现一堆错误
相关问题