Einfacher Rechner in Java

335917
Jim

Ich habe Java seit ungefähr 3 Wochen gelernt und ich hoffte, dass jemand meinen Code für mich überprüfen und mir mitteilen kann, wie ich mich verbessern kann.

Mir ist bekannt, dass die Mathematikklasse entfernt werden konnte (ich hätte answer = inputA * inputBin der switch-Anweisung usw. eingeben können), aber dies ist nur deshalb so, weil ich mit mehreren Klassen üben wollte.

import java.util.Scanner;

public class Calculator {

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    Maths Maths = new Maths();

    double answer = 0;
    double inputA, inputB;
    char operator;
    boolean done = false;

     while (done == false) {
        System.out.print("Please enter your sum: ");

        inputA = input.nextDouble();
        operator = input.next().charAt(0);
        inputB = input.nextDouble();        

        switch (operator) {
            case '+': answer = Maths.add(inputA, inputB);
                      break;
            case '-': answer = Maths.subtract(inputA, inputB);
                      break;
            case '*': answer = Maths.multiply(inputA, inputB);
                      break;
            case '/': answer = Maths.divide(inputA, inputB);
                      break;
            case '^': answer = Maths.power(inputA, inputB);
                      break;
        }

            System.out.println(answer);             
    }       

    input.close();

  }

}

Und meine zweite Klasse ...

public class Maths {

    double add(double a, double b) {
        double answer = a+b;
        return answer;          
    }

    double subtract(double a, double b) {
        double answer = a-b;
        return answer;          
    }

    double multiply(double a, double b) {
        double answer = a*b;
        return answer;          
    }

    double divide(double a, double b) {
        double answer = a/b;
        return answer;          
    }

    double power(double a, double b){
        double answer =a;

        for (int x=2; x<=b; x++){
            answer *= a;
        }

        return answer;
    }

}
Antworten
11
rhetorische Frage: Warum verwendet Java: öffentliche statische Double sqrt (double a) `? Siehe die API http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#sqrt%28double%29. Hinweis: gutes Buch, effektives Java, 2. Auflage. Manchmal sollten Methoden ** statisch sein. Thufir vor 7 Jahren 0

2 Antworten auf die Frage

17
cHao
  • power should probably be using Math.pow(). I'm picturing how slow your code would be at calculating 1.00000015000000. Or how inaccurate it'll be when someone wants to raise to a non-integer power. If those are not intended to be allowed, then passing doubles all over the place seems odd. But it'd be better to check beforehand and throw an error than return a blatantly incorrect result, in my opinion.

  • You never set done to true, and thus have an infinite loop; take out the flag and say while (true) or for (;;), so that that's apparent. Don't add the flag back til you're also adding the code that sets it.

  • The fact that you use objects doesn't make your code object-oriented. How you use them is what makes the difference. In this case, you're using classes as namespaces for functions, which is not very object-oriented at all.

    In your case, Maths is entirely useless; everything it does would be better done in your own code. This is an example of gratuitous use of objects. If you wanted to practice your OOP, you might want to think about how you'd get rid of that switch statement. Hint:

    public interface BinaryOperation {
        public double resultFor(double left, double right);
    }
    
    
    class Multiplication implements BinaryOperation {
        public double resultFor(double left, double right) {
            return left * right;
        }
    }
    
    class Addition implements BinaryOperation {
        public double resultFor(double left, double right) {
            return left + right;
        }
    }
    
    private Map<Character, BinaryOperation> operations;
    
    ...
    
    operations.put('*', new Multiplication());
    operations.put('+', new Addition());
    
    ...
    
    BinaryOperation op = operations.get(operator);
    if (op != null) {
        answer = op.resultFor(inputA, inputB);
    }
    else {
        System.out.println("Error: Unknown operator");
    ]
    
Eine Klasse nur für die Multiplikation zu machen, ist übertrieben. OP ist nur ein Anfänger, er braucht Zeit, um etwas über Map zu erfahren. Gib ihm Zeit zum Verdauen: P. Anirban Nag 'tintinmj' vor 7 Jahren 1
@tintinmj: Er wollte etwas über OOP lernen. Bei OOP geht es nicht nur darum, viel "neu" zu sagen. : P Wenn er keinen Polymorphismus verwendet oder etwas einkapselt, verwendet er kein OOP. In solchen Fällen wäre es besser *, * es nicht zu verwenden, als es von Anfang an falsch zu verwenden und die falschen Ideen zu verwirklichen. cHao vor 7 Jahren 5
Danke-- das nehme ich an Bord. Wie Sie sagen, möchte ich nicht früh in schlechte Gewohnheiten gehen Jim vor 7 Jahren 1
13
Anirban Nag 'tintinmj'

For a beginner it's a good approach. You need to know about Java Naming Convention. We use mixed case for naming any variable or instance of a class. So in your code Maths Maths = new Maths(); should be Maths maths = new Maths();.

Or even better make all the methods in Maths class public static as the instance of the class doesn't play any part in computation. Point to be noted in Java we make utility class's methods static as you can see in API's Math class, Array class.

Suggestions

  • In add, subtract methods you don't need to introduce a new answer variable. Just return the result like return (a+b); or return (a-b);.
  • while (done == false) is yukkk. Just make it while (!done).

Thumbs up for closing the Scanner. Now read about Exception handling. Happy programming!!! :D

Wenn der Scanner zu System.in geöffnet wird, sollte er eigentlich * nicht * geschlossen werden. Danach können Sie System.in nicht mehr verwenden. ksnortum vor 2 Jahren 0
@ksnortum Kannst du es mit einem Beispiel oder einer beliebigen Quelle erklären? Anirban Nag 'tintinmj' vor 2 Jahren 0
@tintinmj, Hier gehts: https://gist.github.com/ksnortum/22eeae450122a1112d3e6c1a674359e2 ksnortum vor 2 Jahren 0