Java interpretiert Zahl falsch

Status
Nicht offen für weitere Antworten.

pcplanet

Mitglied
Sers Leute...Ich will einen Automat schreiben. Das klappt soweit ganz gut! Nur wenn ich das Programm laufen lassen, dann kommt wenn ich Geld 1 eingebe immer 100cent! jedes mal!! Bei 2 interpretiert er es als 10 cent, bei 3 als 20cent. Bei 1 macht er aber immer 100cent draus. Woran kann das liegen?

Java:
import java.io.*;
class Fahrkartenautomat
{
	public static void main (String[] args) throws IOException
	{
		
		Reader reader=new InputStreamReader(System.in);
		BufferedReader input = new BufferedReader(reader);
		int tarif=0;
		while (tarif > 3 || tarif <= 0)
		{
			tarif=Eingabe.readInt(input, "Tarif","Wählen Sie einen Tarif: 1=Tarif 1; 2=Tarif 2; 3=Tarif 3");		// Tarifwahl
		}
		int geldspeicher = 0;
		int geld = 0;
		
		if (tarif == 1)
			{
			int preis = 150;
			int betrag = 150;			
			System.out.println("Werfen sie 1,50 Euro ein.");
   
			while (geldspeicher < preis)
				{
				betrag = preis - geldspeicher;
				System.out.println ("Bitte werfen Sie noch "+betrag+" Cent(s) ein.");
				geld=Eingabezwei.readInt(input, "Cent","1 ergibt 5cent, 2 10cent..etc.");
				if (geld == 1)
				geld = 5;
				if (geld == 2)
				geld = 10;
				if (geld == 3)
				geld = 20;
				if (geld == 4)
				geld = 50;
				if (geld == 5)
				geld = 100;
				if (geld == 6)
				geld = 200;
				if (geld == 7)
				geld = 500;
				if (geld == 8)
				geld = 1000;
				if (geld == 9)
				geld = 2000;
				geldspeicher = geldspeicher + geld;
				
				
					if (geldspeicher == preis)
					{
					System.out.println ("Ihr Ticket wird gedruckt. Vielen Dank");
					break;
					}
					if (geldspeicher >= preis)
					{
					betrag = geldspeicher - preis;
					System.out.println ("Ihr Ticket wird gedruckt. Sie bekommen "+betrag+" zurück");
					break;
					}
				System.out.println ("Bitte geben Sie mehr Geld ein");	
				}		
			}
 
...äh genau...
Wieso hälst du die Beträge nicht in einem int-Array und benutzt die Eingabe als Index?
Java:
int[] betraege = {1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000};
geld = betraege[geld];
 
@Model: Leuchtet mir ein... iwie muss ich dass umschreiben

@Space: Keine Ahnung was du meinst... ich bin noch relativ neu. So wies programm jetzt läuft ist das schon richtig...
 
Was Spacerat meint ist, dass es einfacher und übersichtlicher ist, wenn du ein Array benutzt, in dem du die einzelnen Werte speicherst. Google java Array wenn du nicht weisst was das ist.

Btw:
Java:
geld = betraege[geld-1];
wäre es dann in deinem Code.
 
danke hdi!

Was ich gern noch machen würde:

Der Automat soll sich merken, was für Münzen ich eingeworfen habe: Also ich werfe 50cent ein und dann 20cent. Jetzt will ich abbrechen und will genau dieses Geld wieder...

Mit welcher Überlegung stelle ich das geschickt an. Wie gesagt, einfache java Befehle,.... ich bin noch relativ frisch.
 
Btw:
Java:
geld = betraege[geld-1];
wäre es dann in deinem Code.
😳 Danke...
Mit welcher Überlegung stelle ich das geschickt an. Wie gesagt, einfache java Befehle,.... ich bin noch relativ frisch.
Mit 'ner Collection würd' ich sagen. Z.B.:
Java:
List<Integer> rueck = new ArrayList<Integer>();
rueck.add(geld); // nach jeder Eingabe und Wandlung in den Betrag.
Beim Abbruch kann man sich dann die Beträge ausgeben lassen:
Java:
for(Integer i : rueck) {
  System.out.println(i + "ct.");
}
 
Zuletzt bearbeitet von einem Moderator:
Also das ist mein Java Code aktuell:

Zu Spacerat: Ich muss mich erstmal in deine Befehle reinarbeiten 😀

Ich werde mir das mal angucken, wie und wo ich deine Befehle gut einfügen könnte...

Java:
import java.io.*;
class Fahrkartenautomat
{
	public static void main (String[] args) throws IOException
	{
		
		Reader reader=new InputStreamReader(System.in);
		BufferedReader input = new BufferedReader(reader);
		int tarif=0;
		while (tarif > 3 || tarif <= 0)
		{
			tarif=Eingabe.readInt(input, "Tarif","Wählen Sie einen Tarif: 1=Tarif 1; 2=Tarif 2; 3=Tarif 3");		// Tarifwahl
		}
		int geldspeicher = 0;
		int geld = 0;

		
		if (tarif == 1)
			{
			int preis = 150;
			int betrag = 150;			
			System.out.println("Werfen sie 1,50 Euro ein.");
			int[] betraege = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000};
			while (geldspeicher < preis)
				{
				
				betrag = preis - geldspeicher;
				System.out.println ("Bitte werfen Sie noch "+betrag+" Cent(s) ein.");
				geld=Eingabe.readInt(input, "Cent","1 ergibt 5cent, 2 10cent..etc.");
				geld = betraege[geld-1];
				geldspeicher = geldspeicher + geld;
				
					if (geldspeicher == preis)
					{
					System.out.println ("Ihr Ticket wird gedruckt. Vielen Dank");
					break;
					}
					if (geldspeicher >= preis)
					{
					betrag = geldspeicher - preis;
					System.out.println ("Ihr Ticket wird gedruckt. Sie bekommen "+betrag+" zurück");
					break;
					}
				System.out.println ("Werfen Sie noch mehr Geld ein");				
				}		
			}	
	    if (tarif == 2)
			{
			int preis = 250;
			int betrag = 250;
			int eingabe = 0;
			System.out.println("Werfen sie 2,50 Euro ein.");
 			int[] betraege = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000};
			while (geldspeicher < preis)
				{
				
				betrag = preis - geldspeicher;
				System.out.println ("Bitte werfen Sie noch "+betrag+" Cent(s) ein.");
				geld=Eingabe.readInt(input, "Cent","1 ergibt 5cent, 2 10cent..etc.");
				geld = betraege[geld-1];
				geldspeicher = geldspeicher + geld;
				
					if (geldspeicher == preis)
					{
					System.out.println ("Ihr Ticket wird gedruckt. Vielen Dank");
					break;
					}
					if (geldspeicher >= preis)
					{
					betrag = geldspeicher - preis;
					System.out.println ("Ihr Ticket wird gedruckt. Sie bekommen "+betrag+" zurück");
					break;
					}
				System.out.println ("Werfen Sie noch mehr Geld ein");				
				}		
			}	
		else if (tarif == 3)
			System.out.println("Werfen sie 5,00 Euro ein.");

	}
}
 
Zu Spacerat: Ich muss mich erstmal in deine Befehle reinarbeiten 😀
Hast du ein Glück, dass das hier nicht die Bundeswehr ist, sondern nur ein Javaforum. Ich ziehe deswegen auch den Begriff Anweisung vor, aber frag' mich nicht nach dem Unterschied😀.
Zu deinem Code:
Das sieht ja schon recht manierlich aus. Meine Idee mit dem Array sehe ich umgesetzt, ist also verstanden. Schön.
Schöner wäre es allerdings, wenn man das Array, einmal für alle, vor der ganzen Tarifabfrage macht:[JAVA=17] int[] betraege = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000};
if(tarif == 1) {
...[/code]Die Zeilen 23 und 53 können (müssen) dann entfallen. Aber eines nach dem anderen.
 
Noch eine Frage.. aber was zu boolean:

Das ist ein Ausschnitt meines Programms. Wie kann ich es machen, dass er bei dem untersten if, dass Programm neustartet bzw. beendet.

[Java]
boolean eingabeAufforderungzwei = true;

while (eingabeAufforderungzwei)
{
eingabeAufforderungzwei = false;
eingabe=Eingabezwei.readInt(input, "Cent","1 ergibt 5cent, 2 10cent..etc.");

if(eingabe > 9){
System.out.println("Sie haben was falsch gemacht. Bitte geben Sie erneut eine Zahl ein");
eingabeAufforderungzwei = true;
}

if (eingabe <= 0){
System.out.println("Sie haben das Programm beendet! Der Karlsruher Verkehrsverbund wünscht Ihnen noch einen schönen Tag");
eingabeAufforderungzwei = ??? ;
}
}
[/code]
ich will, dass er das Programm beendet....also statt den ??? was...?
 
ich will, dass er das Programm beendet....also statt den ??? was...?
Java:
System.exit(0);

edit: Also natürlich kannst du das nicht einem boolean zuweisen. Vllt versteh ich nicht was du grad versuchst zu tun.. Auf jeden Fall beendet obiger Code sofort das komplette Programm.
 
hdi 😉) hilft dir immer? 😉)

Mein Automat soll 1-9 lesen könenn. 1 sind 5ct... 5 sind 10ct.. etc

Mehr als 20€ akzeptiert er nicht. Also startert er die while Schleife neu. Das wäre 10 und größer.

Bei 0 folgt ein Automatischer Abbruch des Programms.


eingabeAufforderungzwei = System.exit(0) ;

dann?
 
hdi hilft dir immer?
Du bist schon der zweite, der das sagt 😀 Aber ne, das hat damit nix zu tun 😉

Erstmal die Zuweisung geht nicht, wie ich schon sagte (im edit). System.exit(0) ist eine Anweisung (Methoden-Aufruf), die keinen Rückgabewert hat. Also kannst du das auch nicht irgendwie in eine Variable speichern. Das beendet die JVM, das heißt dein Java-Programm. Meinst du was anderes mit "Programm", kann das sein?
 
Ich würde gern den Programmcodee ganz posten. K.A. ob es Kammeraden von mir entdecken... deswegen bin ich vorsichtig.

Ich will erreichen, dass bei der Eingabe 0 das Programm wieder ganz zum anfang zurückgeht.....zur Tarifwahl in dem Fall (siehe en bissel weiter oben)
 
Java:
tarifwahl:
   while(...){
        ....
        while(eingabeaufforderungZwei){
            ...
            else if(eingabe == 0){
                continue tarifwahl;
            }
         }
    }

edit: Das sind Label Statements, sollte man aber nur in letzter Instanz nutzen. So wie du deinen Code verschachtelt hast, macht es hier durchaus sinn mit Labels zu arbeiten, statt 9 booleans zu setzen oder sowas 😉
 
Zuletzt bearbeitet:
Java:
public static void main(String[] args) {
		meinLabel: for (int i = 1; i <= 5; i++) {
			for (int j = 1; j <= 5; j++) {
				System.out.println(i + "," + j);
				if (i == 2 && j == 2) {
					System.out.println("continue at label (next iteration)");
					continue meinLabel;
				}
			}
		}

	}

kA seit welcher Java Version es das gibt. Was nutzt du denn für ne JDK?
 
Labels gibt es afaik von Anfang an. Sie müssen afaik stets am Zeilenanfang stehen.
@Edit: OK... Das mit dem Zeilenanfang war ein Irrtum.
 
Zuletzt bearbeitet von einem Moderator:
@hdi:

Merci trotzdem. Aber ich glaube es ist nicht anwendbar auf mein Programm, da hier zu viele while und if ineinander laufen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben