PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wer findet den Fehler?


Java-Schüler
2007-06-25, 22:18:52
Hallo !
Ich bin gerade dabei Java zu lernen und habe ein Programm, das ich zZ schreibe.
Es geht darum, dass man einen Rechenterm (zb 42+5*87/(3+7)...) gegeben bekommt und dieser in seine Bestandteile zerlegt werden soll.
Man bekommt den Term als String und ausgespuckt wird er dann als Vektor.

Vector<Token> tokenize() {
Vector<Token> tokens = new Vector<Token>();

int number[] = {'0','1','2','3','4','5','6','7','8','9'}; // Der zu scannende String wird jeweils mit diesen Strings bzw dem Array verglichen.
String operator = "+-*/";
String brack = "()";


for(int i=0; i<src.length(); i++){
// Scanne nach Zahlen
boolean detected = true;
Stack<Integer> counter = new Stack<Integer>();

while(detected){
for(int j=0; j<9; j++){
detected = false;
if(src.charAt(i) == number[j]){
counter.push(j);
detected = true;
i++;
}
}
}
if(!counter.empty()){
int zahl = 0;
int k=0;
while(!counter.empty()){
zahl = zahl + (counter.pop() * (int)Math.pow(10,k));
k++;
}
tokens.add(new Num(zahl));
}


// Scanne nach Rechenzeichen
for(int j = 0; j < operator.length(); j++){

if(src.charAt(i) == operator.charAt(j)){

tokens.add(new Op(operator.charAt(j)));
}
}
// Scanne nach Klammern
for(int j = 0; j < brack.length(); j++){

if(src.charAt(i) == brack.charAt(j)){

tokens.add(new Bracket(brack.charAt(j)));
}
}
}
return tokens;
}

Java-Schüler
2007-06-25, 22:22:03
Pardon, ich wollte das Problem natürlich noc schildern:

Es werden nicht alle mehrstelligen Zahlen richtig erkannt, gibt man zB "/+10*4 5-/84 12 1" ein, so erkennt das Prog.:
/; +; 1; *; 4; 5; -; /; 84; 12; 1;

Ich arbeite im Übrigen mit BlueJ, falls das relevant sein sollte.

Danke :-)

Gast
2007-06-25, 22:32:11
Ist zwar keine direkte Antwort auf deine Frage,
aber dafür kann man besser JavaCC verwenden.
Du definierst eine Grammatik und der Rest wird automatisch generiert.

Java-Schüler
2007-06-25, 22:38:45
Hm, leider muss es irgendwie so gehen... kann höchstens sein dass mein Ansatz völlig falsch ist.

src ist übrigens der String, der den Term repräsentiert, der wurde außerhalb der methode schon definiert.
Es treten keinerlei Synthaxfehler auf, das Problem liegt wirklich innerhalb des von mir geposteten Bereichs, der Rest muss stimmen.

Matrix316
2007-06-25, 22:49:52
Es fehlt ja nur bei der 10 die 0, oder soll das "*4 5-" 45 sein?


Man kann doch aber auch einen String nehmen und den mit Regular Expressions splitten. Das sollte eigentlich ganz einfach gehen. Nimmst 4 Strings für jede Rechenart und splittest dann nach und nach nach jeder Rechenart.

aus 1+45*13-12/14 wird dann bei der Reihenfolge + - * /

1, 45*13-12/14

Daraus wird wenn du für jeden neuen String mit - weiter machst:

1,45*13,12/14

dann

1,45,13,12/14

dann normal

1,45,13,12,14

Danach musste eigentlich nur noch nach der Rechenart parsen und könntest dir aus den zwei Strings das Ergebnis zusammenstellen.

Java-Schüler
2007-06-25, 22:53:49
Okay, danke für den Tipp, ich hab gerade nen Tipp bekommen und es entdeckt, probleme mit der durchlaufvariablen j innerhalb der while-schleife....

Trotzdem danke und gute nacht :-)

Python rocks!
2007-06-25, 22:59:06
Um's genauer zu sagen, hinter das i++ muss noch ein j=0, damit für die nächste Stelle wieder die numbers-Liste von vorn durchsucht wird.

Guts Nächtle...