Geldautomaten

ReBack13

Mitglied
Hallo zsm.
Ich habe vor 2 Tagen mit dem programmieren von Java angefangen. In der Schule machen wir bald das Thema "Geldautomaten mit Java programieren" und da mir das da alles etwas zu langsam geht und ich den anderen ein wenig vorraus sein will wollte ich es mal selbst versuchen.
Nun habe ich ein Problem. Der compiler zeigt mir Errors an, wenn ich das programm compilieren will. Ich hab schon alles kontroliert aber ich weiß nicht wo da der Fehler ist. Ich kann nichtmal testen ob das so klappt würde wie ich es mir vorgestellt habe.
Ich hoffe ihr könnt mir helfen.

Hier der Quelltext:
Java:
import java.io.*;
public class Geldautomat
{
	public static void main(String argv[]) throws IOException
	{
		BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
		String str;
		int pin,pinr,fehleingabe,karteneinzug;
		pinr = 1234;
		fehleingabe = 1;
		System.out.print("Bitte geben sie den PIN ein: ");
		do
		{
			str = input.readLine();
			pin = Integer.parseInt(str);
			if (pin == pinr)
			{
				System.out.println("Die Eingabe war erfolgreich.");
			}
			else
			{
				System.out.print("Die Eingabe war falsch. Versuchen sie es erneut: ");
				karteneinzug = fehleingabe +1;
			}
		} while (pin != pinr || karteneinzug <= 3);
		if (karteneinzug != 3)
		{
			System.out.println("Die Eingabe war erfolgreich.");
		}
		else
		{
			System.out.println("Sie haben drei mal einen falschen PIN eingegeben. Die Karte wird nun einbehalten.");
		}
	}
}


Und hier die Fehlermeldung:
Code:
Compile C:\java\Geldautomat\Geldautomat.java....
C:\java\Geldautomat\Geldautomat.java:25: variable karteneinzug might not have been initialized

		} while (pin != pinr || karteneinzug <= 3);

		                        ^

1 error
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Wie beinahe immer hat der Compiler recht ;-)

Wenn du von Anfang an die richtige Pin eingibst, wird die Variable karteneinzug nicht gesetzt und "while" könnte ein Problem haben.

Es gibt so eine ungeschrieben Regel, dass jede Variable gleich bei der Deklaration initialisiert werden soll

Mach doch so ;-)
Java:
int pin = 1234;
int pinr = 0;
int fehleingabe = 1;
int karteneinzug = 0;
// unnötig        pinr = 1234;
// unnötig        fehleingabe = 1;
 

ReBack13

Mitglied
So hatte ich das noch garnicht gesehen.

Jetzt hat das geklappt aber ich habe ein anderes Problem.

Weder die Fehlermeldung, dass die Karte eingezogen wird, wenn man 3 mal den falschen pin eingibt kommt noch wird das Porgramm beendet. Also egal wie oft ich den richtigen oder den falschen Pin eingebe, das Programm hört nie auf.

Das zeichen || steht doch für "oder"?! Oder liege ich da falsch? So müsste das doch gehen oder habe ich da nen Denkfehler.
 
M

MiDniGG

Gast
Java:
karteneinzug = fehleingabe + 1;

=> Karteneinzug steht IMMER auf 2 ;)

Lass Dir doch mal ein bisschen die Eingaben ausgeben, ob da auch alles richtig eingelesen wird und so weiter.
 

ReBack13

Mitglied
Wieso steht der immer auf 2?

Versteh ich nicht.
Und wie soll ich mir die Eingaben ausgeben? Sry kenn mich da noch so gut wie garnicht aus
 
B

bone2

Gast
Java:
fehleingabe = 1;

karteneinzug = fehleingabe + 1;
darum.

naja und mit eingaben ausgeben ist gemeint. einfach nach jeder eingabe oder berechnung ein systemout zu schreiben und die veränderte variable auszugeben. dann sieht man ws passiert
 

ReBack13

Mitglied
Achso meinst du das.
Wie kann ich das denn machen, das der dann immer den neuen Wert übernimmt?

Also wenn da steht
Java:
karteneinzug = fehleingabe +1;
das dann fehleingabe und somit auch karteneinzug den wert 2 bekommt?
 

Andi_CH

Top Contributor
Wieso steht der immer auf 2?

Versteh ich nicht.
Und wie soll ich mir die Eingaben ausgeben? Sry kenn mich da noch so gut wie garnicht aus

Weil du die Variable fehleingabe, die mit 1 initialisiert wird, nie veränderst. Die ist auf ewige Zeiten == 1

Dann zählst du 1 dazu - das gibt 2 und das weist du karteinzug zu .... tja

Ausgaben? Na, wenn das das Schwierigste ist, das löse ich für dich ;-)
Java:
import java.io.*;
public class Geldautomat
{
    public static void main(String argv[]) throws IOException
    {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        String str;
        int pin = 1234;
        int pinr = 0;
        int fehleingabe = 1;
        int karteneinzug = 0;
        System.out.print("Bitte geben sie den PIN ein: ");
        do
        {
            str = input.readLine();
            pin = Integer.parseInt(str);
            System.out.println("pin = " + pin);
            System.out.println("pinr = " + pinr);
            if (pin == pinr)
            {
                System.out.println("Die Eingabe war erfolgreich.");
            }
            else
            {
                System.out.print("Die Eingabe war falsch. Versuchen sie es erneut: ");
                karteneinzug = fehleingabe +1;
                System.out.println("fehleingabe = " + fehleingabe);
                System.out.println("karteneinzug = " + karteneinzug);
            }
        } while (pin != pinr || karteneinzug <= 3);
        if (karteneinzug != 3)
        {
            System.out.println("Die Eingabe war erfolgreich.");
        }
        else
        {
            System.out.println("Sie haben drei mal einen falschen PIN eingegeben. Die Karte wird nun einbehalten.");
        }
    }
}
 
Zuletzt bearbeitet:

Niki

Top Contributor
Java:
} while (pin != pinr || karteneinzug <= 3);

das kann auch nicht ganz stimmen, denn solange die pin nummer ungültig ist kommst du nicht aus der schleife raus. du musst die bedingungen mit && verknüpfen.
 
B

bone2

Gast
@ReBack13
Java:
import java.io.*;
public class Geldautomat
{
    public static void main(String argv[]) throws IOException
    {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        String str = null;
        int pin = 0;
        int pinr = 1234;
        int fehleingabe = 0;

        System.out.print("Bitte geben sie den PIN ein: ");
        do
        {
            str = input.readLine();
            pin = Integer.parseInt(str);
            if (pin == pinr)
            {
                System.out.println("Die Eingabe war erfolgreich.");
            }
            else
            {
                System.out.print("Die Eingabe war falsch. Versuchen sie es erneut: ");
                fehleingabe = fehleingabe +1;
            }
        } while (pin != pinr && fehleingabe < 3);
        if (fehleingabe < 3)
        {
            System.out.println("Die Eingabe war erfolgreich.");
        }
        else
        {
            System.out.println("Sie haben drei mal einen falschen PIN eingegeben. Die Karte wird nun einbehalten.");
        }
    }
}

@niki hat recht
 
Zuletzt bearbeitet von einem Moderator:

Niki

Top Contributor
doch...

bei einer oderverknüpfung reichts, wenn eine bedingung true zurück liefert. also nochmal verständlich: solange pin != pinr zutrifft, wird die schleife durchlaufen, egal ob die anzahl > 3 ist. probiers einfach aus und du wirst sehen dass ich recht habe
 
B

bone2

Gast
Ach ja du hast recht. Denkfehler^^

Er läuft ja weiter, solange zumindest eins true ist und bricht nicht ab sobald ein false ist.

Hab es mal oben korrigiert.

edit: Geht es eigentlich nur mir so, das ich das do while aka repeat until ist total unübersichtlich finde und die standard while schleife um welten besser?
 
Zuletzt bearbeitet von einem Moderator:
B

bone2

Gast
Sorry war ein versehn^^ Hoffe der TE verzeiht mir. aber wahrscheinlich wart er nie wieder gesehn
 

Niki

Top Contributor
@bone2 ja, ich bin auch kein fan der do-while schleife. ich würd das ganze überhaupt anders gestalten. ca. so

pseudocode...
Java:
int trys = 0;
boolean isOk = false;
while(trys < 3){
  String eingabe = getInput...
  if(isOk(eingabe)){
    isOk = true;
    break;
  }  
  trys++;
}
if(isOk){
//alles ok
} else {
// Karte einziehen
}
 

ReBack13

Mitglied
Jetzt funktioniert das, wenn ich richtig eingebe, das dann die bestätigung kommt das es richtg war. nur jetzt beendet der das programm trotzdem nicht nach den drei angaben.
Es läuft immer weiter egal welche zahl ich eingebe(solange es nicht die richtige ist)...

Also mit "drei mal falsch = sperre" ist nix.
 
Zuletzt bearbeitet:
B

bone2

Gast
funktioniert tadellos.

2056qo0.jpg
 
Zuletzt bearbeitet von einem Moderator:

ReBack13

Mitglied
Ok es geht... Aber geholfen hat mir das nicht wirklich was. Ich seh jetzt den richtigen Quelltext von ihm und weiß trotzdem nicht was daran jetzt genau der fehler war und wie ich den fehler demnächst vermeiden kann.

Und mit dem Quelltext von Niki kann ich mal garnichts anfangen..
 
B

bone2

Gast
ich habe einfach deinen karteneinzug durch fehlereingabe ersetzt.

Java:
fehlereingabe = fehlereingabe + 1;
2 variablen zu haben die genau das gleiche enthalten ist ziemlich überflüssig. dann noch die while bedingung von "oder" zu "und" geändert und unten < statt != benutzt beim if


wenn du karteneinzug unbedingt behalten willst, wäre es:
Java:
fehlereingabe = fehlereingabe +1; // erhöht den fehler
karteneinzug = fehlereingabe; // speicher den fehler nochmal in karteneinzug


auch pseudocode verstehen will gelernt sein, hier ist der weg von Niki:
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test
{
    public static void main(String argv[]) throws IOException
    {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        String str = null;
        int pin = 0;
        int pinr = 1234;

        int versuche = 0;
        boolean pinStimmt = false; // isOk

        System.out.print("Bitte geben sie den PIN ein: ");

        while (versuche < 3) {
            str = input.readLine();
            pin = Integer.parseInt(str);

            if (pin == pinr) { //eingegebener Pin isOK
                pinStimmt = true;
                break;
            }

            System.out.print("Die Eingabe war falsch. Versuchen sie es erneut: ");
            versuche++; //versuch um 1 erhöhen
        }

        if (pinStimmt) {
            System.out.println("Die Eingabe war erfolgreich.");
        }
        else {
            System.out.println("Sie haben drei mal einen falschen PIN eingegeben. Die Karte wird nun einbehalten.");
        }
    }
}

hach is mir gerade langweilig beim ergebnisse abwarten^^
 
Zuletzt bearbeitet von einem Moderator:

Andi_CH

Top Contributor
Ok es geht... Aber geholfen hat mir das nicht wirklich was. Ich seh jetzt den richtigen Quelltext von ihm und weiß trotzdem nicht was daran jetzt genau der fehler war und wie ich den fehler demnächst vermeiden kann.

Und mit dem Quelltext von Niki kann ich mal garnichts anfangen..

Du hattest drei ganz kleine Fehler drin die wir dir nach und nach erkärt haben.

Ich hab dir die Zwischenlösung hingestellt - mit den sysouts drin - wenn du den output nicht interpretieren und nicht mit einem debugger umgehen kannst, frage ich mich was du denn überhaupt machst?

Wenn ich mir dir Ohren zustopfe kann ich nicht mal mit deutscher Sprache was anfangen.

So Frust raus - thread für mich beendet.
 

ReBack13

Mitglied
Gott kannst du nicht lesen? Ich bin hab vor 2 Tagen angefangen java zu programmieren und wenn ihr mir da manche sachen erklärt mir fachbegriffen die ich nicht verstehe oder einfach den fehler zeigt ohne mir zu sagen was genau daran falsch ist und wie es besser geht wie soll ich das dann verstehen.

wenn du den output nicht interpretieren und nicht mit einem debugger umgehen kannst, frage ich mich was du denn überhaupt machst?

Wenn du C# nicht könntest, es aber lernen willst dann ist kla das du nach 2 Tagen dich nicht wirklich damit auskennst. Wenn ich dann schon an ein Forum gehe um mehr zu lernen ist ja wohl logisch das ich manche sachen nicht verstehe. Dafür bin ich doch hier.


Aber wenigstens ist einer hier noch nett und wird nicht gleich sauer wenn ein unerfahrener kommt und was fragt...!!!

Danke bone2. Jetzt habe ich es richtig verstanden.
 

Neue Themen


Oben