首页 > 解决方案 > 分数程序 - Java

问题描述

我目前正在开发一个程序,该程序允许用户选择四种方法之一,并在 5 个预定义分数的列表中对其进行测试。第一种方法将分数转换为字符串,第二种方法减少分数,第三种方法将分数输出为带分数,第四种方法以十进制形式表示分数。

我的一切工作都有几个小缺陷:

  1. 如果用户在第一种方法之前选择第二种方法,第一种方法将以简化形式而不是其原始形式打印出来。
  2. 当混合数字为负数时,它将在混合数字中的每个数字之前打印一个“-”符号(示例:-5 5/6 打印为 -5 -5/-6)

下面是我的代码:

public class TestFractionBrandonBischoff
{

/**
 * @param args the command line arguments
 */
public static void main(String[] args)
{
    // Create fraction array
    Fraction [] fractionArray;
    fractionArray = new Fraction[5];

    for (int i=0; i<fractionArray.length; i++)
        fractionArray[i] = new Fraction();

    fractionArray[0].numerator = -125;
    fractionArray[0].denominator = 30;
    fractionArray[1].numerator = 100;
    fractionArray[1].denominator = -4;
    fractionArray[2].numerator = 23;
    fractionArray[2].denominator = 50;
    fractionArray[3].numerator = 60;
    fractionArray[3].denominator = 40;
    fractionArray[4].numerator = 30;
    fractionArray[4].denominator = 390;

    //Prompt user to select a method to test
    System.out.println("Select which method you would like to perform: ");
    System.out.println("1. Test the toString() method");
    System.out.println("2. Test the reduce() method");
    System.out.println("3. Test the toMixed() method");
    System.out.println("4. Test the getDecimal() method");
    System.out.println("5. Quit");

    Scanner method;
    method = new Scanner(System.in);
    int methodChoice;
    methodChoice = method.nextInt();

    while(methodChoice != 5){
    //Use user input to call specific method
    if (methodChoice == 1){
        System.out.println(fractionArray[0].toString());
        System.out.println(fractionArray[1].toString());
        System.out.println(fractionArray[2].toString());
        System.out.println(fractionArray[3].toString());
        System.out.println(fractionArray[4].toString());
        }
    else if(methodChoice == 2){
        fractionArray[0].reduce();
        fractionArray[1].reduce();
        fractionArray[2].reduce();
        fractionArray[3].reduce();
        fractionArray[4].reduce();

        System.out.println(fractionArray[0].toString());
        System.out.println(fractionArray[1].toString());
        System.out.println(fractionArray[2].toString());
        System.out.println(fractionArray[3].toString());
        System.out.println(fractionArray[4].toString());
    }
    else if (methodChoice == 3){
        System.out.println(fractionArray[0].toMixed());
        System.out.println(fractionArray[1].toMixed());
        System.out.println(fractionArray[2].toMixed());
        System.out.println(fractionArray[3].toMixed());
        System.out.println(fractionArray[4].toMixed());
    }
    else if (methodChoice == 4){
        System.out.println(fractionArray[0].getDecimal());
        System.out.println(fractionArray[1].getDecimal());
        System.out.println(fractionArray[2].getDecimal());
        System.out.println(fractionArray[3].getDecimal());
        System.out.println(fractionArray[4].getDecimal());
    }
    else

    //Prompt user to select a method to test
    System.out.println("Select which method you would like to perform: ");
    System.out.println("1. Test the toString() method");
    System.out.println("2. Test the reduce() method");
    System.out.println("3. Test the toMixed() method");
    System.out.println("4. Test the getDecimal() method");
    System.out.println("5. Quit");

    methodChoice = method.nextInt();

    }

}

}

class Fraction
{
    int numerator;
    int denominator;

@Override
public String toString(){
    return numerator + "/" + denominator;
}

//Method to return decimal form of fraction
public double getDecimal(){
    double result;
    result = 1.0 * numerator/denominator;
    return result;
}


//Method to reduce fraction to simplest form
public void reduce() {
int n = numerator;
int d = denominator;

while (d != 0) {
int t = d;
d = n % d;
n = t;
}

int gcd = n;

numerator /= gcd;
denominator /= gcd;
}

//Method to return mixed number form of fraction
public String toMixed(){
    String mixedNum;
    int wholeNum;
    wholeNum = Math.floorDiv(numerator,denominator);

    if (wholeNum == 0){
        mixedNum = numerator + "/" + denominator;
    }
    else if (numerator % denominator == 0)
        mixedNum = wholeNum + "";
    else
    mixedNum = wholeNum + " " +
            (numerator - wholeNum*denominator) + "/" + denominator;

    return mixedNum;
}

如果您能帮助我解决这两个小错误,将不胜感激。先感谢您!

标签: javaarraysclassmethods

解决方案


错误一:很可能是因为你在reduce中修改了实例变量;我建议使用局部变量。

错误 2:您正在打印整数和分数的单个字符串。所以基本上你得到整数,这将是负数,然后你对分数执行单独的操作,这也是负数。然后你打印这两个底片;我建议事先确定分数的符号,然后对所有内容进行绝对值并在函数末尾打印符号。


推荐阅读