Programm für Geld-Abheben

Status
Nicht offen für weitere Antworten.
Hallo liebe Community,
ich habe heute mein erstes Programm aufgestellt, aber leider kann es einen eingelesenen String nicht mit dem Passwort "a" vergleichen.
Code:
import java.util.Scanner;

public class KontoApp {
  public static void main(String[] args) {
    int kontostand = 5000;
    String p = "a";
    System.out.println("Bitte geben Sie Ihr Passwort ein");
    Scanner a = new Scanner (System.in);
    String x = a.nextLine();
    if (p==x) {
      geldAbheben(kontostand);
    }
    else {
      System.out.println("Falsche Eingabe.\nSie haben noch zwei Chancen");
      Scanner b = new Scanner (System.in);
      String y = b.nextLine();
      if (p==y) {
        geldAbheben(kontostand);
      }
      else { 
        System.out.println("Falsche Eingabe.\nSie haben noch eine Chance");
        Scanner c = new Scanner (System.in);
        String z = c.nextLine();
        if (p==z) {
          geldAbheben(kontostand);
        }
        else System.out.println("Das Konto ist jetzt gesperrt");
      }
    }
  }
  static void geldAbheben (int x) {
    System.out.println("Richtige Eingabe\nAuf Ihrem Konto sind " + x + "Euro gutgeschrieben. Wie viel möchten Sie abheben?");
    Scanner d = new Scanner (System.in);
    int m = d.nextInt();
    System.out.println("Auf Ihrem Konto sind jetzt " + (m-x) + " Euro gutgeschrieben.");
  }
}
Außerdem würde ich gerne noch eine Methode falscheEingabe() erstellen für den else-Fall, aber was sind denn dabei die Parameter? Ist sonst alles richtig oder welche Verbesserungsvorschläge könnt ihr mir geben?
Wäre sehr dankbar für eure Hilfe.
MfG
 
du kannst es auch wie folgt machen

Code:
String a = JOptionPane.showInputDialog("Gib dein Passwort ein!");
 
Strings vergleicht man mit
x.equals(y)
nicht mit
x == y


Das erste vergleicht das, was in den Strings jeweils drinsteht, das "==" vergleicht jedoch nur ob es die exaxt SELBE String instanz ist
 
Wenn das Passwort nur aus Zahlen besteht kannst du den String auch in einen Integer Umwandeln und dann vergleichen ...
 
und was soll das bringen? Das er dann noch extra nen try/catch Block drumrumbauen muss um etwaige NumberFormatExceptions aufzufangen? Quark
 
Ja aber ich fände das einfacher da ich auch neu in Java eingestiegen bin und das rech tunkompliziert geht...
Klar ist das andere einfacher wenn man es kennt...
 
zu deiner anderen Frage:

[HIGHLIGHT="Java"]Scanner a = new Scanner (System.in);
int versuche = 3;
String eingabe;
boolean okay = true;
while(!(eingabe = a.nextLine()).equals(a)){
System.out.println("Falsche Eingabe. Sie haben noch "+eingabe+" Versuche");
if(--versuche == 0){
okay = false;
break;
}
}
if(okay){
geldAbheben(kontostand);
}
else{
System.out.println("Sie haben Ihre Versuche aufgebraucht. Konto gesperrt.");
}[/HIGHLIGHT]

Das ist zwar jetzt nicht in eine Methode ausgelagert, weil sie ja nur diese
Meldung beinhalten würde. Kannst du aber natürlich auch noch machen.
 
Zuletzt bearbeitet:
Ich danke euch allen für eure hilfreichen Beiträge.
@Schandro: x.equals(y) genau das hat mir gefehlt, dankeschön.
@hdi: an eine while-Anweisung, die den Schreibaufwand senken könnte, habe ich auch gedacht, aber ich wusste nicht wie ich es anstellen könnte. Deiner Empfehlung bin ich auch nachgegangen, und zwar so:

[highlight=Java]import java.util.Scanner;

public class KontoApp {
public static void main(String[] args) {
int versuche = 3;
int kontostand = 5000;
String eingabe = "java";
boolean okay = true;
System.out.println("Bitte geben Sie Ihr Passwort ein");
Scanner a = new Scanner (System.in);

while(!(eingabe = a.nextLine()).equals(a)){ //???
System.out.println("Falsche Eingabe. Sie haben noch "+eingabe+" Versuche");
if(--versuche == 0){
okay = false;
break;
}
}
if(okay){
geldAbheben(kontostand);
}

else{
System.out.println("Sie haben Ihre Versuche aufgebraucht. Konto gesperrt.");
}
}
static void geldAbheben (int x) {
System.out.println("Auf Ihrem Konto sind " + x + " Euro gutgeschrieben. Wie viel möchten Sie abheben?");
Scanner c = new Scanner (System.in);
int m = c.nextInt();
int n = x-m;
if (n >= 0) System.out.println("Auf Ihrem Konto sind jetzt " + n + " Euro gutgeschrieben.");
else System.out.println("Sie haben nicht so viel Geld auf Ihrem Konto.");
}
}[/highlight]
Das klappt aber nicht, z.B. kommt "Falsche Eingabe. Sie haben noch f Versuche
Sie haben Ihre Versuche aufgebraucht. Konto gesperrt." raus wenn ich f eingebe.

Noch eine allg. Frage: Ich habe das Programm noch erweitert, soll ich meine Lösung hier eingeben oder kann es sein, dass sich niemand dafür interessieren würde?
Danke noch mals.
 
in Zeile 12 vergleichst du ein String-Object mit eine Scanner-Object, obwohl du dieses eigetlich mit nem Passwort vergleichen willst (welches noch nirgendswo existiert)
In zeile 13 willst du wahrscheinlich die Variable versuche und nicht die Variable eingabe ausgeben...
 
ja sry dafür war ungetestet hingerotzt. Paar Flüchtigkeitsfehler, Schandro hat sie
schon erwähnt.

Also versuche statt eingabe, und dein passwort "p" oder was statt dem a in
der while-bedingung.
 
Ok danke, ich möchte euch das funktionierende und erweiterte Programm jetzt zeigen, denn ich habe noch eine Idee und wenn mir jemand helfen könnte es in die Realität um zu setzen, wäre es genial, denn es hat etwas mit objektorientierter Programmierung zu tun, was sehr zentral in Java ist.

[highlight=Java]
import java.util.Scanner;

public class KontoAppMitWhileSchleife {
public static void main(String[] args) {
int versuche = 3;
int kontostand = 5000;
String passwort = "java";
boolean okay = true;
System.out.println("Bitte geben Sie Ihr Passwort ein");
Scanner a = new Scanner (System.in);

while(!(passwort = a.nextLine()).equals("java")) {
versuche--;
if (versuche > 1) System.out.println("Falsche Eingabe. Sie haben noch " + versuche + " Versuche");
else if (versuche == 1) System.out.println("Falsche Eingabe. Sie haben noch " + versuche + " Versuch");
else if (versuche == 0) {
okay = false;
break;
}
}

if (okay) aktion(kontostand, passwort);
else System.out.println("Sie haben Ihre Versuche aufgebraucht. Ihr Konto ist jetzt gesperrt.");

}
static void aktion (int x, String y) {
System.out.println("Wenn Sie Geld abheben möchten drücken Sie die 0. Wenn Sie Geld einzahlen möchten drücken Sie die 1.\nWenn Sie Ihr Passwort ändern möchten drücken Sie die 2.");
Scanner b = new Scanner (System.in);
int z = b.nextInt();
if (z == 0) geldAbheben(x);
else if (z == 1) geldEinzahlen(x);
else if (z == 2) System.out.println("Ihr neues Passwort lautet: " + passwortÄnderung(y));
else {
System.out.println("Falsche Eingabe!");
aktion(x, y);
}
}
static void geldAbheben (int x) {
System.out.println("Auf Ihrem Konto sind " + x + " Euro gutgeschrieben. Wie viel möchten Sie abheben?");
Scanner c = new Scanner (System.in);
int m = c.nextInt();
int n = x-m;
if (n >= 0) System.out.println("Auf Ihrem Konto sind jetzt " + n + " Euro gutgeschrieben.");
else {
System.out.println("Sie haben nicht so viel Geld auf Ihrem Konto!");
geldAbheben(x);
}
}
static void geldEinzahlen (int x) {
System.out.println("Auf Ihrem Konto sind " + x + " Euro gutgeschrieben. Wie viel möchten Sie einzahlen?");
Scanner c = new Scanner (System.in);
int m = c.nextInt();
int n = x+m;
System.out.println("Auf Ihrem Konto sind jetzt " + n + " Euro gutgeschrieben.");;
}
static String passwortÄnderung (String x) {
System.out.println("Bitte geben Sie jetzt Ihr neues Passwort ein");
Scanner c = new Scanner (System.in);
String m = c.nextLine();
x = m;
return x;
}
}[/highlight]

Ich möchte jetzt statt des vorgegebenen "kontostand" und "passwort" zwei Kunden erstellen, wobei der eine dem anderen Geld überweist. Kann mir jemand einen Anhaltspunkt geben wo und wie ich das machen kann? Ich sitze schon seit Stunden daran und komme nicht weiter.
Noch zwei zusätzliche Fragen:
1. while(!(passwort = a.nextLine()).equals("java"))
Diese Zeile scheint mir sehr mysteriös zu sein, denn wenn ich statt "java" in der Klammer passwort eingebe funktioniert es nicht. Ach ich verstehe diese Zeile eigentlich allgemein nicht.
2. Wie und wo kann ich dafür sorgen, dass das neue Passwort aus der Methode passwortÄnderung (String x) das Passwort aus der main-Methode überschreibt ohne das gesamte Programm durcheinander zu bringen?
 
Überleg dir was deine "Kunden" so machen / können müssen.
Laut deinem Code brauchst du ja in etwa Folgendes (was ich versuche so einfach wie möglich zu halten):
Membervariablen:
- Name (Zur Unterscheidung der Kunden / denke mal bei so einem einfachen Beispiel brauch man da nix kryptisches oder IDs nehmen)
- Passwort (das "private" Passwort des Kunden)
- Kontostand (initialier Wert)
Funktionen:
- geldAbholen(betrag) (von Bank)
- geldEinzahlen(betrag) (zur Bank)
- geldUeberweisen(andererKunde, betrag)
+ gegebenenfalls getter/setter für die Membervariablen
 
Was gee versucht zu sagen:
Du vermischt das Objekt-orientierte mit Prozeduralem.
D.h. du solltest eine eigene Klasse "Konto" machen, mit den von gee genannten
Membervariablen und Methoden.
Diese Klasse enthält keine main-Methode!

Und dann eine andere Klasse "TransactionTest" oder so, und diese hat eine main.
In dieser main erstellst du 2 Konten und du kannst ja darauf die Methoden aufrufen.
D.h. eine Überweisung solltest du hinkriegen, kannste ja statisch machen:

[HIGHLIGHT="Java"]private static boolean ueberweise(Konto von, Konto zu, double betrag){
boolean valid = (von.getKontostand() >= betrag);
if(valid){
von.hebeAb(betrag);
zu.zahleEin(betrag);
}
return valid;
}[/HIGHLIGHT]
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben