Erste Schritte Feedback erwünscht

thelegend27

Aktives Mitglied
Sehr geehrte Forummitglieder,

Ich bin ein Anfänger und habe zur Übung ein kleines Programm geschrieben, welches "Bankkonten" erstellt und verwaltet.
Das Programm funktioniert (bei richtigen Eingaben) einwandfrei, jedoch ist es etwas verwirrend und wahrscheinlich wurde von mir auch nicht der einfachste Lösungsweg gewählt.
Nun möchte ich euch bitten meinen Quellcode anzusehen, und mir Feedback/Verbesserungsvorschläge/Kritik zu geben.

Java:
class BankKonto {

    String kontoInhaber, kontoNummer, kontoPIN;
    int kontoStand;

    BankKonto(String ktoInhaber, String ktoNummer, int start, String ktoPIN) {
        kontoInhaber = ktoInhaber;
        kontoNummer = ktoNummer;
        kontoPIN = ktoPIN;
        kontoStand = start;

    }

    void hebeGeldAb(int betrag) {
        kontoStand = kontoStand - betrag;
    }

    void zahleGeldEin(int betrag) {
        kontoStand = kontoStand + betrag;
    }

    String gibKontoNummer() {
        return kontoNummer;

    }

    String gibKontoPIN() {
        return kontoPIN;
    }
    String gibName() {
        return kontoInhaber;
   
    }
    int gibKontoStand() {
        return kontoStand;
    }

}

public class Bank {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        Scanner scan = new Scanner(System.in);                                                                                                             
        System.out.println("Wilkommen in der Bank");       
        System.out.println();
        System.out.println("-----------------------");
        BankKonto[] konten = new BankKonto[10000];
        String[] kontoNummer = new String[10000];
        int nextIndex = 0;
        int freeMe = 0;

        do {
            while (freeMe == 0) {
                String name;
                System.out.println();
                System.out.println("Geben sie bitte Ihren Namen ein, um sich zu registrieren!");
                name = scan.nextLine();

                String pin = String.valueOf((int) (Math.random() * 10000 + 1000));
                nextIndex++;
                kontoNummer[nextIndex] = String.valueOf((int) (Math.random() * 10000));

                konten[Integer.parseInt(kontoNummer[nextIndex])] = new BankKonto(name, kontoNummer[nextIndex], 0, pin);

                System.out.println("Herzlichen Glückwunsch ihr Konto wurde erfolgreich eingerichtet!");
                System.out.println();
                System.out.println("Ihre Kontonummer lautet: " + konten[Integer.parseInt(kontoNummer[nextIndex])].gibKontoNummer());
                System.out.println("Ihre 4 stellige PIN lautet: " + konten[Integer.parseInt(kontoNummer[nextIndex])].gibKontoPIN());
                System.out.println("Ihr derzeitiges Guthaben beträgt: " + konten[Integer.parseInt(kontoNummer[nextIndex])].gibKontoStand());
                System.out.println();
                freeMe++;
            }
            System.out.println("registrieren = 0");
            System.out.println("einloggen = 1");
            int checkIn = gibInt();
            if (checkIn < 0 || checkIn > 1) {
                System.out.println("Geben sie bitte eine von den gültigen Zahlen ein!");
            }
            if (checkIn == 0) {

                String name;
                System.out.println("Geben sie bitte Ihren Namen ein, um sich zu registrieren!");
                name = scan.nextLine();

                String pin = String.valueOf((int) (Math.random() * 10000 + 1000));
                nextIndex++;
                //kontoNummer[nextIndex] = String.valueOf(nextIndex);
                kontoNummer[nextIndex] = String.valueOf((int) (Math.random() * 10000));
                konten[Integer.parseInt(kontoNummer[nextIndex])] = new BankKonto(name, kontoNummer[nextIndex], 0, pin);

                System.out.println("Herzlichen Glückwunsch ihr Konto wurde erfolgreich eingerichtet!");
                System.out.println();
                System.out.println("Ihre Kontonummer lautet: " + konten[Integer.parseInt(kontoNummer[nextIndex])].gibKontoNummer());
                System.out.println("Ihre 4 stellige PIN lautet: " + konten[Integer.parseInt(kontoNummer[nextIndex])].gibKontoPIN());
                System.out.println("Ihr derzeitiges Guthaben beträgt: " + konten[Integer.parseInt(kontoNummer[nextIndex])].gibKontoStand());
                System.out.println();
            }
            if (checkIn == 1) {

                System.out.println("Geben Sie bitte Ihre Kontonummer ein!");
                String eingabeNummer = scan.nextLine();
                System.out.println("Geben Sie bitte Ihre 4 Stellige Pin  ein!");
                String eingabePIN = scan.nextLine();
                if (eingabeNummer.equals(konten[Integer.parseInt(eingabeNummer)].gibKontoNummer()) && eingabePIN.equals(konten[Integer.parseInt(eingabeNummer)].gibKontoPIN())) {
                    System.out.println("Login erfolgreich");
                    System.out.println();
                    System.out.println("Herzlich Wilkommen : " + konten[Integer.parseInt(eingabeNummer)].gibName());
                    System.out.println("Guthaben einsehen = 0");
                    System.out.println("Geld abheben = 1");
                    System.out.println("Geld einzahlen = 2");
                    System.out.println("ausloggen = 3");
                    do {

                        checkIn = gibInt();

                        if (checkIn == 0) {
                            System.out.println("Ihr Guthaben beträgt:" + konten[Integer.parseInt(eingabeNummer)].gibKontoStand());
                        }
                        if (checkIn == 1) {
                            System.out.println("Geben Sie an wieviel Geld sie abheben wollen!");
                            int betrag = gibInt();
                            konten[Integer.parseInt(eingabeNummer)].hebeGeldAb(betrag);
                            System.out.println("Ihr Guthaben beträgt: " + konten[Integer.parseInt(eingabeNummer)].gibKontoStand());

                        }
                        if (checkIn == 2) {
                            System.out.println("Geben Sie an wieviel Geld sie einzahlen wollen!");
                            int betrag = gibInt();
                            konten[Integer.parseInt(eingabeNummer)].zahleGeldEin(betrag);
                            System.out.println("Ihr Guthaben beträgt: " + konten[Integer.parseInt(eingabeNummer)].gibKontoStand());
                        }
                        if (checkIn == 3) {
                            break;
                        }

                    } while (true);

                } else {
                    System.out.println("Ungültige Kontonummer/PIN");
                }

            }

        } while (true);
    }

    static int gibInt() {
        Scanner scan = new Scanner(System.in);
        boolean ok = false;
        int rueckgabe = 0;
        do {
            try {
                rueckgabe = Integer.parseInt(scan.nextLine());
                ok = true;
            } catch (Exception e) {
                System.out.println("NaN!");
            }
        } while (!ok);
        return rueckgabe;
    }

}

Mit freundlichen Grüßen,
thelegend27
 

Joose

Top Contributor
Den Code um ein Konto zu registrieren hast du 2x -> lagere diesen Teil in eine Methode aus, damit vermeidest du doppelten Code.

Du greifst sehr oft auf das Array konten zu. Und jedesmal parst du die eingabeNummer.
Parse eingabeNummer nur 1x und hole dir dann das passende Konto aus dem Array und speichere es in einer lokalen Variable zwischen.
Damit vereinfachst du den Code um einiges, außerdem verbessert sich damit auch die Performance (was aber in diesem Fall zu vernachlässigen ist und erst bei umfangreicheren/komplexeren Programmen wichtiger wird)
Java:
String eingabeNummer = scan.nextLine();
BankKonto konto = konten[Integer.parseInt(eingabeNummer)];
.....
if (eingabeNummer.equals(konto.gibKontoNummer()) && eingabePIN.equals(konto.gibKontoPIN())) {
   System.out.println("Login erfolgreich");
   System.out.println();
   System.out.println("Herzlich Wilkommen : " + konto.gibName());
   System.out.println("Guthaben einsehen = 0");
   System.out.println("Geld abheben = 1");
   
   .....
           System.out.println("Ihr Guthaben beträgt:" + konto.gibKontoStand());
           .....
           konto.hebeGeldAb(betrag);
           System.out.println("Ihr Guthaben beträgt: " + konto.gibKontoStand());
           ....
           konto.zahleGeldEin(betrag);
           System.out.println("Ihr Guthaben beträgt: " + konto.gibKontoStand());

Du verwendest drei verschachtelte Endlosschleifen. Gib den beiden do/while-Schleifen jeweils eine richtige Abbruchbedingung und nicht einfach while(true).
Zum Beispiel:
Java:
boolean running = true;
do {
....... 
} while(running);
Mit der jetztigen Variante kann man die äußerte Schleife nicht beenden.

Du verwendest nur einfache if Bedingungen, du könntest aber auch if/else verwenden.
Java:
do {
   checkIn = gibInt();
   if (checkIn == 0) {
       ...
   } else if (checkIn == 1) {
       ...
   } else if (checkIn == 2) {
       ...
   } else if (checkIn == 3) {
       running = false
   }
} while (running);
Bei deiner Variante prüft er jede if-Bedingungen (auch wenn diese überhaupt nicht wahr sein kann).
Bei if/else prüft er der Reihe nach die if-Bedingungen -> trifft eine zu wird der Block ausgeführt und danach nach dem if/else Konstrukt weiter gemacht.
Auch hier geht es zum Teil um Performance.
 

Neue Themen


Oben