分数计算器添加

时间:2014-11-24 22:46:56

标签: java calculator

您好我是java的新手并正在使用Fraction计算器,我无法弄清楚如何让计算器减少简单分数并添加混合分数。 例: 减少:1/2 + -5/6 = -1/3
混合分数:4_15 / 16 + -3_11 / 16 = 1_1 / 4 编辑:对于混合分数,我试图从分母中减去num> den的分子得到整数和余数并返回并打印但是它没有打印出任何东西。

import java.util.Scanner;

public class Fraction {
public static void main(String[] args) {
    System.out.println("Enter an Expression or quit:");
    Scanner input = new Scanner(System.in);
    String text = input.nextLine();
    while (!text.equals("quit")){
    String frac1 = text.substring(0,text.indexOf(" "));
    String oper = text.substring((text.indexOf(" "))+1,(text.indexOf(" "))+2);
    String frac2 = text.substring((text.indexOf(" "))+3);
    int fn1 = num(frac1); //frac1 numerator
    int fd1 = den(frac1); //frac1 denominator
    int fn2 = num(frac2); //frac2 numerator
    int fd2 = den(frac2); //frac2 denominator
    if (oper.equals("+")){
        int sumfinalnum = add(fn1, fd1, fn2, fd2);
        if (fd1 == 1 && fd2 == 1){
            System.out.println(sumfinalnum);
            }
        else if ((fn1 + fn2)==0){
            System.out.println("0");
        }
        else if (fd1 == fd2){
            if (sumfinalnum>fd1){
                    System.out.println(extractWholePart(sumfinalnum,fd1)+"_"+extractNumPart(sumfinalnum,fd1)+"/"+fd1);
            }
            else{
        System.out.println(sumfinalnum+"/"+fd1);
        }
        }
        else if (!(fd1 == fd2)){
        System.out.println(sumfinalnum+"/"+(fd1*fd2));
        }
        System.out.println("Enter an Expression or quit:");
        text = input.nextLine();
        }
    }
    }

public static int num(String input){
    if (input.contains("_")){ //mixed to improper
        String a = input.substring(0,input.indexOf("_"));
        String b = input.substring((input.indexOf("_"))+1,input.indexOf("/"));
        String c = input.substring((input.indexOf("/"))+1);
        int a1 = Integer.parseInt(a);
        int b1 = Integer.parseInt(b);
        int c1 = Integer.parseInt(c);
        int d = a1*c1;
        int e = d+b1;
        return e;           
    }
    else if (!input.contains("/")){
        int input1 = Integer.parseInt(input);
        return input1;
    }
    else {
    String strnum1 = input.substring(0,input.indexOf("/"));
    int num1 = Integer.parseInt(strnum1);
    return num1;
    }
}
public static int den(String input){
    if(!input.contains("/")) {     //whole
        return 1;
    }
    String strnum2 = input.substring((input.indexOf("/"))+1);
    int num2 = Integer.parseInt(strnum2);
    return num2;

}

public static int add(int fn1,int fd1,int fn2,int fd2){
    if (fd1 == fd2){ //matching denominator
        int numadd = fn1 + fn2;
        return numadd;
    }
    else if (fd1 == 1 && fd2 == 1){ //whole numbers no denom
        int sum = fn1 + fn2;
        return sum;
    }
    else if (!(fd1 == fd2)){ //different denominator***
        int dencomadd = fd1*fd2;
        int gcd1 = dencomadd/fd1;
        int gcd2 = dencomadd/fd2;
        int comf1num = fn1*gcd1;
        int comf2num = fn2*gcd2;
        int total = comf1num+comf2num;
        return total;
    }
    else{
        return 0;

    }


}
public static int extractWholePart(int finalnum, int finalden){
    int whole = 0;
    while (finalnum > finalden){
        whole++;
    }
    return whole;
}
public static int extractNumPart(int finalnum, int finalden){
    while (finalnum > finalden){
        finalnum -= finalden;
    }
    return finalnum;
}
}

2 个答案:

答案 0 :(得分:0)

让我们开始吧 - 这是java,不要害怕使用更大的变量名。 fn1很可能被称为fraction1Numerator

接下来,有一个方法来完成它的设计目的。在[{1}}中使用add方法需要四个else-ifs并不是一个好主意。

创建具有成员变量mainFraction的对象numerator将允许您的denominator函数返回整个答案。毕竟你有代码来添加看起来不错的混合分数。

add

我还添加了“整体”以表示简化后的整个部分。 class Fraction{ public int whole; public int numerator; public int denominator; } 函数不会有签名

add

提取整数很简单 - 从分子中减去分母,直到你再也不能这样做。

public static Fraction add(Fraction fraction1, Fraction fraction2) ...
另一方面,简化就是将最大公约数除以分母和分母 - 计算的算法可以在互联网上轻易找到。

答案 1 :(得分:0)

尝试这样的事情

float mixedToDecimal(String data)
// data would be like this "1 5/8";
String[] parts = data.split(" ");
if(!(parts.lenght > 0)) // this mean that if data is NOT mixedfraction then just return -1
   return -1;
float value = Integer.parseInt(parts[0]);
if (parts.length > 1) {
    // has fractional part
    parts = parts[1].split("/");
    float numerator = Integer.parseInt(parts[0]);
    float denominator = Integer.parseInt(parts[1]);
    value += numerator / denominator;
}
// value contains 1.625
return value;