简体   繁体   English

用于计算分数的Java程序

[英]Java program for calculating fractions

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. 程序必须检查两个小数中使用的数字是否在0-99之间并且分母为非零。 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: 这是我到目前为止所拥有的代码,由于我对使用Java的了解很少,因此任何帮助将不胜感激:

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; }
 }
}

Maybe you want to enter OOP (object oriented programming): 也许您想输入OOP(面向对象编程):

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);
    }

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 '+' . 当用户输入'-' ,程序不会进入case '+'的部分。 This means that tempN1 , tempN2 , and lcm won't be set up. 这意味着将不会设置tempN1tempN2lcm 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. 就是说,当您有一个以上的case彼此相邻且中间没有代码时,以下代码适用于多个案例。 (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.) (这是由于“ fall-through”造成的。实际上,它进入case '+' ,然后由于case '+'代码没有break ,因此落入case '-' 。但是,不建议这样做充分利用掉线的优势,除非上面完全没有代码。)

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();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM