Problem mit dem Rechner

Status
Nicht offen für weitere Antworten.

cantayus

Neues Mitglied
Hallo alle,
Ich habe ein package fur einen Rechner geschrieben. Aber ich habe ein Problem. Ich kann aber Dezimalzahlen und mehrstellige Zahlen nicht einfuhren. Ich glaube, ich hab ein Problem mit isValidExpression method.

Weiss jemand, was das Problem sein kann?

Das ist mein Code fur Starter Engine (Das eigentliche Program)


Code:
package kenroyG.assignment03.calculator;


public class StarterEngine extends Engine {

   public String evaluateExpression(String inExpr) {
      if (!isValidExpression(inExpr = inExpr.replaceAll(" ", "")))
	 return "invalid";

      inExpr = ""+eval(inExpr.toCharArray());
      if (inExpr.endsWith(".0"))
	 return inExpr.substring(0,inExpr.length()-2);
      return inExpr;
   }


   private double eval(char[] expr) {
      double result = 0;
      if (expr.length > 0)
	 result = Character.getNumericValue(expr[0]);
      
      for (int i=1; i<expr.length; i+=2)
	 result = eval(result, expr[i], Character.getNumericValue(expr[i+1]));

      return result;
   }


   private double eval(double a, char op, double b) {
      switch (op) {
      case '+': return a+b;
      case '-': return a-b;
      case '*': return a*b;
      case '/': return a/b;
      }
      throw new RuntimeException ("Unknown operator '"+op+"'");
   }

   protected String getDeleteString() {
      return "Bksp";
   }



   protected String getEvalString() {
      return "=";
   }


   public String[][] getInputLayout() {
      return new String[][] { {"7", "8", "9", "/"},
			      {"4", "5", "6", "*"},
			      {"1", "2", "3", "+"},
			      {"0", getDeleteString(), getEvalString(), "-"} };
   }


  
   protected String[][] getTest() {
      return new String[][] { {"-2/1+5", "invalid"},    // unary
			      {"1+5/9*3.3+2", "invalid"},   // decimal
			      {"9*88+2-5", "invalid"}, // multi digit
			      {"6-4*+7", "invalid"}, // multi operator
			      {"2+3-a/6", "invalid"}, // illegal char
			      {"*", "invalid"},
			      {"5+3/7*", "invalid"},
			      {"2", "2"},
			      {"2/1+5", "7"},
			      {"8+4/3*5+2", "22"},
			      {"9*8+2-5", "69"},
			      {"6-4+7+9/3/2*3*2-6/5", "2.4"} };
   }



 
   public boolean isValidExpression(String input) {
      char[] expr = input.toCharArray();

      boolean op = false;

      for (int i=0; i<expr.length; i++) {
	 if (Character.isDigit(expr[i]) && !op)
	    op = !op;
	 else if (isOperator(expr[i]) && op)
	    op = !op;
	 else
	    return false;
      }

      return op;
   }



   private boolean isOperator(char op) {
      return op=='+' || op=='-' || op=='*' || op=='/';
   }


   protected String updateExpression(String input, String expression) {
      return super.updateExpression(input, expression);
   }



   public String toString() {
      return "Starter Engine";
   }
}
[/code]
 
> Ich glaube, ich hab ein Problem mit isValidExpression method.
> Weiss jemand, was das Problem sein kann?

die Frage ist: was hindert dich daran, es selber herauszufinden?
dein Programm durchläuft alle Zeichen und führt dazu irgendwelche ifs aus,
da kannst du doch genau nachprüfen, entwder per Debugger oder mit Ausgaben a la

System.out.println("starte isValidExpression mit Wort: "...);
System.out.println("prüfe Zeichen:"...);
System.out.println("erstes if ergibt: "...);

usw.
was genau ist das Problem?
 
Ich kann mit mehrstelligen und Dezimalzahlen nicht rechnen. Das ist das Problem. Hast du or hat hat jemand eine Idee das zu veraendern?
 
Ich kann mit mehrstelligen und Dezimalzahlen nicht rechnen. Das ist das Problem. Hast du or hat hat jemand eine Idee das zu veraendern?
 
das hängt alles von deinen Regeln ab,
im Moment gibts anscheinend die Regel, dass nach einer Ziffer eine op erwartet wird,
ändere das in 'nach einer Ziffer ist eine op oder eine Ziffer erlaubt',
also z.B. das && !op im ersten if weglassen,

wenn du auch noch Punkte zulassen willst, dann musst du das extra vergleichen,
dann solltest du besser noch die Regel aufnehmen, dass ein Punkt nur nach einer Ziffer erlaubt ist,
das ist wiederum nur mit neuen boolean-Zuständen wie op zu erreichen,

jetzt frag aber nicht nochmal ganz banal 'wie geht das?',
das sollst du programmieren 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben