Hallo,
ich habe einen Taschenrechner programmiert mittels Stacks.
Die Klasse TaschenrechnerUIJWindow beinhaltet die GUI. Nun soll der Operator auf Höherwertigkeit, Gleichwertigkeit etc. geprüft werden. Dazu gibt es eine Methode checkoperator(), die den obersten Operator vom Stack mit dem über einen Button übertragenen Operator vergleicht. Das gibt auch keine Probleme. Der Fall Höherwertig ist natürlich einfach. Wenn allerdings der Operator gleichwertig ist (also z.B. mal und geteil oder mal und mal), dann soll zuerst ein ergebnis errechnet werden, aus den operanden 1 und 2 vom stapel und dem operator 1 vom stapel.
Nun sollte der oberste Operator vom Stapel genommen werden, die obersten Operanden gegen das Ergebnis der zwischenrechnung ausgetauscht werden und alles erneut geprüft werden.
Nun hänge ich etwas fest. Wie kriege ich es hin, dass dieser Prozess (erst rechnen, dann erneut prüfen) solange durchgeführt wird, bis der operatorenstapel leer ist oder der Operator höherwertig ist? Kann man das mit einer Schleife lösen oder braucht man rekursive Ansätze?
Mit freundlichem Gruß
ich habe einen Taschenrechner programmiert mittels Stacks.
Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import zentralabi.linear.Stack;
public class TaschenrechnerModel implements ActionListener{
private String operatorstand;
private int sizeoperanden = 0;
private double zwischenergebnis;
private String usedoperator;
private String lastbutton;
public static void main(String[] args) {
TaschenrechnerModel objekt = new TaschenrechnerModel();
}
public TaschenrechnerModel(){
}
public void checkoperator(String operatora, Object operatorb){
/*
* Ist gleich
*/
if (((operatora == "*" || operatora == "/") && (operatorb == "*" || operatorb == "/")) || ((operatora == "-" || operatora == "+") && (operatorb == "-" || operatorb == "+"))){
rechne();
}
/*
* Ist niedriger +/- dann mal geteilt
*/
else if ((operatora == "-" || operatora == "+") && (operatorb == "*" || operatorb == "/")){
System.out.println("ist niedriger");
}
/*
* Ist höher
*/
else if ((operatora == "*" || operatora == "/") && (operatorb == "+" || operatorb == "-")){
System.out.println("ist Höher");
}
}
public void rechne(){
if (sizeoperanden >=2 && !TaschenrechnerUIJWindow.operatoren.isEmpty()){
double operandaint = Double.valueOf((String)TaschenrechnerUIJWindow.operanden.top());
TaschenrechnerUIJWindow.operanden.pop();
sizeoperanden--;
double operandbint = Double.valueOf((String)TaschenrechnerUIJWindow.operanden.top());
TaschenrechnerUIJWindow.operanden.pop();
sizeoperanden--;
String operator = (String)TaschenrechnerUIJWindow.operatoren.top();
TaschenrechnerUIJWindow.operatoren.pop();
if (operator == "*"){
zwischenergebnis = operandaint * operandbint;
}
else if (operator == "/"){
zwischenergebnis = operandaint / operandbint;
}
else if (operator == "+"){
zwischenergebnis = operandaint + operandbint;
}
else if (operator == "-"){
zwischenergebnis = operandaint - operandbint;
}
TaschenrechnerUIJWindow.operanden.push(zwischenergebnis);
sizeoperanden++;
}
}
public void addOperand(StringBuilder operand){
TaschenrechnerUIJWindow.operanden.push(operand.toString());
TaschenrechnerUIJWindow.operandenstrings.setLength(0);
}
public void actionPerformed(ActionEvent e) {
/*
* Operanden werden auf den Operandenstapel gelegt
*/
if (e.getSource()==TaschenrechnerUIJWindow.nine){
TaschenrechnerUIJWindow.operandenstrings.append(9);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+9);
}
else if (e.getSource()==TaschenrechnerUIJWindow.eight){
TaschenrechnerUIJWindow.operandenstrings.append(8);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+8);
}
else if (e.getSource()==TaschenrechnerUIJWindow.seven){
TaschenrechnerUIJWindow.operandenstrings.append(7);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+7);
}
else if (e.getSource()==TaschenrechnerUIJWindow.six){
TaschenrechnerUIJWindow.operandenstrings.append(6);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+6);
}
else if (e.getSource()==TaschenrechnerUIJWindow.five){
TaschenrechnerUIJWindow.operandenstrings.append(5);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+5);
}
else if (e.getSource()==TaschenrechnerUIJWindow.four){
TaschenrechnerUIJWindow.operandenstrings.append(4);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+4);
}
else if (e.getSource()==TaschenrechnerUIJWindow.three){
TaschenrechnerUIJWindow.operandenstrings.append(3);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+3);
}
else if (e.getSource()==TaschenrechnerUIJWindow.two){
TaschenrechnerUIJWindow.operandenstrings.append(2);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+2);
}
else if (e.getSource()==TaschenrechnerUIJWindow.one){
TaschenrechnerUIJWindow.operandenstrings.append(1);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+1);
}
else if (e.getSource()==TaschenrechnerUIJWindow.zero){
TaschenrechnerUIJWindow.operandenstrings.append(0);
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+0);
}
/*
* Operatoren werden überprüft und je nach "Gewichtung" auf den Operatorenstapel gelegt
*/
if (e.getSource()==TaschenrechnerUIJWindow.mal){
usedoperator = "*";
if (TaschenrechnerUIJWindow.operandenstrings.toString() != ""){
addOperand(TaschenrechnerUIJWindow.operandenstrings);
sizeoperanden++;
}
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+usedoperator);
if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
TaschenrechnerUIJWindow.operatoren.push(usedoperator);
}
else {
checkoperator(usedoperator,TaschenrechnerUIJWindow.operatoren.top());
}
}
else if (e.getSource()==TaschenrechnerUIJWindow.geteilt){
usedoperator = "/";
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+usedoperator);
if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
TaschenrechnerUIJWindow.operatoren.push(usedoperator);
}
else {
checkoperator(usedoperator,TaschenrechnerUIJWindow.operatoren.top());
}
}
else if (e.getSource()==TaschenrechnerUIJWindow.plus){
usedoperator = "+";
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+usedoperator);
if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
TaschenrechnerUIJWindow.operatoren.push(usedoperator);
}
else {
checkoperator(usedoperator,TaschenrechnerUIJWindow.operatoren.top());
}
}
else if (e.getSource()==TaschenrechnerUIJWindow.minus){
usedoperator = "-";
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+usedoperator);
if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
TaschenrechnerUIJWindow.operatoren.push(usedoperator);
}
else {
checkoperator(usedoperator,TaschenrechnerUIJWindow.operatoren.top());
}
}
else if (e.getSource()==TaschenrechnerUIJWindow.comma){
usedoperator = ".";
TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+usedoperator);
TaschenrechnerUIJWindow.operandenstrings.append(".");
}
else if (e.getSource()==TaschenrechnerUIJWindow.plusminus){
usedoperator = "*";
}
else if (e.getSource()==TaschenrechnerUIJWindow.MC){
if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
}
else {
checkoperator("*",TaschenrechnerUIJWindow.operatoren.top());
}
}
else if (e.getSource()==TaschenrechnerUIJWindow.Mplus){
if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
}
}
else if (e.getSource()==TaschenrechnerUIJWindow.Mminus){
if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
}
}
else if (e.getSource()==TaschenrechnerUIJWindow.MR){
if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
}
}
else if (e.getSource()==TaschenrechnerUIJWindow.C){
if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
}
}
else if (e.getSource()==TaschenrechnerUIJWindow.giveresult){
System.out.println(TaschenrechnerUIJWindow.operanden.top());
}
}
}
Die Klasse TaschenrechnerUIJWindow beinhaltet die GUI. Nun soll der Operator auf Höherwertigkeit, Gleichwertigkeit etc. geprüft werden. Dazu gibt es eine Methode checkoperator(), die den obersten Operator vom Stack mit dem über einen Button übertragenen Operator vergleicht. Das gibt auch keine Probleme. Der Fall Höherwertig ist natürlich einfach. Wenn allerdings der Operator gleichwertig ist (also z.B. mal und geteil oder mal und mal), dann soll zuerst ein ergebnis errechnet werden, aus den operanden 1 und 2 vom stapel und dem operator 1 vom stapel.
Nun sollte der oberste Operator vom Stapel genommen werden, die obersten Operanden gegen das Ergebnis der zwischenrechnung ausgetauscht werden und alles erneut geprüft werden.
Nun hänge ich etwas fest. Wie kriege ich es hin, dass dieser Prozess (erst rechnen, dann erneut prüfen) solange durchgeführt wird, bis der operatorenstapel leer ist oder der Operator höherwertig ist? Kann man das mit einer Schleife lösen oder braucht man rekursive Ansätze?
Mit freundlichem Gruß