Rechenprogramm

M

Metro_2033

Gast
Hey Leute, ich muss gerade ein Programm programmieren. Man soll eine Addition oder Subtraktion eingeben, die wird in einem String gespeichert und soll anschließend addiert/subtrahiert werden und das Ergebnis soll ausgegeben werden. Wichtig ist das eine Schreibweise wie 17 + 3 egal sein muss und die Zahl soviele Stellen wie möglich haben kann, außerdem sollen auch mehrere Terme funktionieren. Ich bin im Moment hier:

Java:
public class Rechenprogramm{
	public static void main (String [] args){

		Output out = new Output();
		System.out.println("Bitte geben sie eine Addition oder Subtraktion ein:");
		String eingaberechnung = out.inString("");
		String rechnungfertig="";
		String zahl="";
		int term=0;
		int hilfeterm=0;
		int ergebnis=0;
		boolean operator=false;
		boolean first=true;
		for(int i=1;i<=rechnungfertig.length();i++){
			char ziffer = rechnungfertig.charAt(i);
			do{
				if(ziffer=='+'||ziffer=='-'){
					operator=true;
				}else{
					zahl=zahl+ziffer;
				}
			}while(operator==false);
			if(ziffer!='+'||ziffer!='-')
				term = Integer.parseInt(zahl);
			if(first==false){
				if(ziffer=='+')
					ergebnis+=hilfeterm+term;
				else
					ergebnis+=hilfeterm-term;
			}else{
				ergebnis=term;
				if(i==2)
					first=false;
			}
			hilfeterm=term;
			operator=false;
			zahl="";
		}
		System.out.println(ergebnis);
	} // end main
} // end class

Das Programm gibt am Schluss irgendwie 0 aus. :/

Ich hoffe sehr ihr könnt mir helfen, danke ;)

mfg
 
G

Gonzo17

Gast
Ungeachtet aller anderen Begebenheiten lässt du eine for-Schleife über einen leeren String laufen. Das löst vielleicht dein erstes Problem. Dort sollte wohl eher
Code:
eingaberechnung
verwendet werden, oder?
 
M

Metro_2033

Gast
Ungeachtet aller anderen Begebenheiten lässt du eine for-Schleife über einen leeren String laufen. Das löst vielleicht dein erstes Problem. Dort sollte wohl eher
Code:
eingaberechnung
verwendet werden, oder?

Ach verdammt, hatte vorher noch einen kurzen Teil stehen der die Sonderzeichen aussortiert und der fertige, sortierte String war dann eben Eingaberechnung. Danke, aber jetzt bekomme ich diesen Fehler:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:470)
at java.lang.Integer.parseInt(Integer.java:499)
at Rechenprogramm.main(Rechenprogramm.java:24)

Process completed.

mfg
 
S

SlaterB

Gast
die Schleife 16 bis 22 macht dann eine Endlosschleife draus.., und es wird erst beim zweiten Zeichen angefangen zu lesen,

da möchte ich an den Grundsatz erinnern, nicht erst ein riesiges komplexes Programm zu schreiben (ca. 75 Schleifen, 400 Variablen) und dann zu testen,
sondern erstmal nur den Eingabestring zu zerlegen, jedes Zeichen auszugeben, wenn das läuft wäre schon ein schöner Schritt geschafft

übrigens für die ca. 100 Testläufe lieber einen String "17 + 4" im Programm definieren, nicht bei jedem Durchlauf eintippen..,
Benutzereingabe kann man als letztes einbauen, wenn der Algorithmus scheinbar läuft

edit:
für den neuesten Fehler wäre es wiederum günstig anzuschauen, was denn in der String-Variablen zahl steht (ok, wohl "" wie die Fehlermeldung schreibt),
und dann nachzuvollziehen was daran schlecht ist (z.B. Leerzeichen drin oder ganz leer) und den Ablauf korrigieren,
nur Fehler hier posten, das ist keine Programierung
 
G

Gonzo17

Gast
Passt wahrscheinlich in dieser Zeile:
Code:
term = Integer.parseInt(zahl);

Da musst du mal debuggen. Weiß nicht genau, was an dieser Stelle
Code:
zahl
ist. Setz doch mal nen Breakpoint an die Stelle und schau, was drin steht. Eventuell ist es "nur" ein Leerzeichen, das da im String ist.

Edit: Was SlaterB sagt ist übrigens vollkommen richtig. Dein Program hat noch einige Schwächen. Daher wäre es ratsam, wenn du einzelne Schritte erst einfach programmierst und dann testest. Erst wenn der Schritt abgeschlossen und getestet ist, dann mit dem nächsten Schritt anfangen. So kannst du dich an Aufgabenstellungen herantasten, die als Ganzes zu komplex sind, um sie auf einmal zu erfassen.
 
Zuletzt bearbeitet von einem Moderator:
M

Metro_2033

Gast
So, hab das Programm jetzt kurz neu geschrieben, trotzdem noch immer der gleiche Runtime Error:

Java:
public class Rechenprogramm{
	public static void main (String [] args){

		Output out = new Output();
		String eingabe = out.inString("Rechung: ");
		String rechnung="";
		boolean operator=false;
		int ergebnis=0;
		int term2=0;
		for(int zaehlvariable=1;zaehlvariable<=eingabe.length();zaehlvariable++){
			char ziffer = eingabe.charAt(zaehlvariable);
			while(operator==false){
				if(ziffer=='+'||ziffer=='-')
					operator=true;
				else
					rechnung+=ziffer;
			}
			int term = 3;
			if(ziffer=='+')
				ergebnis+=term2+term;
			else
				ergebnis+=term2-term;
			term2=term;
			rechnung="";
		}
		System.out.println("Ergebnis: "+ergebnis);
	} // end main
} // end class

Vielleicht findet ihr jetzt den Fehler, der Code ist auf jeden Fall leichter :D

mfg
 
M

Metro_2033

Gast
interessant, wo es doch gar keine Zeile mehr mit parseInt() gibt..

Das ist die Zeile 18, da hab ich zum testen 3 eingeben, nur um zu sehen ob der Teil funktioniert. Ich hab jetzt mal einiges im Programm probiert und bin drauf gekommen das in der Schleife 12-17 eine Endlosschleife ist, nur was ist da falsch?

mfg
 
S

SlaterB

Gast
überleg doch einfach bzw. erkläre, was der Sinn dieser Codezeilen sein soll,
stell dir vor sie wären alle weg, was ist der Nachteil/ was ist der Vorteil der erreicht werden soll?

in Moment ist es eine Schleife, die ewig läuft, und wartet bis das immer gleich Zeichen sich zu einem Operator verändert,
wenig sinnvoll, oder? vielleicht die Schleife weg und nur das if darin weiter verwenden?
 
G

Gonzo17

Gast
Ich hab jetzt mal einiges im Programm probiert und bin drauf gekommen das in der Schleife 12-17 eine Endlosschleife ist, nur was ist da falsch?

Nunja, ein Denkfehler deinerseits. Dort ist eine while-Schleife, deren Abbruchbedingung niemals zutreffen wird, weil die Variable
Code:
operator
erst dann
Code:
true
wird, wenn die aktuelle "Ziffer" ein + oder - ist. Da du aber immer auf der gleichen Ziffer bleibst, bekommst du immer das, was du als allererstes eingeben hast. Bei "17 + 4" wäre das "1". Der Fehler in deiner Logik liegt darin, dass du die for-Schleife um die while-Schleife herum gebaut hast, wo doch eigentlich die for-Schleife den String durchlaufen soll, was ja nie geschehen kann, wenn du während dem Durchlaufen in einer while-Schleife hängst, die vom Durchlaufen der for-Schleife abhängt. ;)
 
S

SlaterB

Gast
> Bei "17 + 4" wäre das "1".
bzw. bei derzeitigen Code die 7, wie ein Log ganz leicht zeigen würde,
der einfachste Code der Welt:
in jedem Schleifendurchlauf erstmal das aktuelle Zeichen ausgeben:
System.out.println("aktuelles Zeichen: "+zeichen);

so unendlich leicht, und doch immer ignoriert, und dann hier fragen..
 

timbeau

Gesperrter Benutzer
Falsch ist mE der Weg wie du Fehler beseitigen möchtest.

Deiner ist aktuell: Proggen - > Error -> ins Forum und kompleten Code posten

Der richtige Weg ist: Proggen ->
while (Error)
-Sysouts in den Code schreiben
-Literatur zu Rate ziehen
-nochmal nachdenken wo man was in der reinen Logik übersehen hat


-> ins Forum gehen

Deine Probleme sind ja keine Java technischen Probleme.
 

Ähnliche Java Themen

Neue Themen


Oben