Konto (großes Projekt für anfänger in Java ^^)

Status
Nicht offen für weitere Antworten.

Spin

Top Contributor
Hallo liebe Leute, ich habe mal wieder ein kleines Problem.
Meine Aufgabe ist es ein Kontoablauf nachzubauen, wie jeder es kennt, wenn man zu bank geht.

Dazu wird man anfangs begrüßt und gebeten ein Konto einzurichten. Wenn ein Konto besteht dann sollen diese Angaben ausgegeben werden usw.


Mein derzeitiger Code:

Code:
public void run() throws IOException
{
    // benoetigte Variablen
    Kontoklasse kk = new Kontoklasse();
    boolean fertig =false;
    // Ausgabe
    System.out.println("Herzlich Willkommen bei Ihrer Bank");
    //Schleifenbeginn
    while(!fertig)
    {//Menue
     System.out.println("");
     System.out.println("Sie haben nun folgende Auswahlmöglichkeiten: "+
     "\n"+ "1. Konto neu anlegen" + "\n" + "2.Konto einloggen (PIN erforderlich)" + "\n"+ "3.Beenden");
     int auswahl = Integer.parseInt(eingabe.readLine());

    //Fallunterscheidung
    switch (auswahl)
    {//Konto anlegen
        case 1:
        System.out.println("Bitte geben Sie ihren Namen an:");
            kk.name= eingabe.readLine();
       
        System.out.println("Bitte geben Sie ihren Vornamen an:");
        kk.vorname= eingabe.readLine();
        
        System.out.println("Bitte geben Sie ihre Bankleitzahl an:");
        kk.blz= Integer.parseInt(eingabe.readLine());
       
        System.out.println("Bitte geben Sie ihre Kontunummer an:");
        kk.kontonummer= Integer.parseInt(eingabe.readLine());
       
        System.out.println("Die von Ihnen eigegebenen Daten lauten:"+
                            "\n"+ "Name:" + kk.name+
                            "\n"+"Vorname:" + kk.vorname+
                            "\n"+"Bankleitzahl:" + kk.blz+
                            "\n"+"Kontonummer:" + kk.kontonummer);
        
        System.out.println("Nun fehlt Ihnen noch ein entsprechender PIN, den Sie" +"\n"+
                            "automatisch zugewiesen bekommen");

        
        Random pin = new Random();
        int i = pin.nextInt(4);
        System.out.println("Ihr PIN lautet:" + i);
        break;


         case 2: System.out.println("Bitte geben Sie ihren Pin ein");
                int nummer = Integer.parseInt(eingabe.readLine());
                
                if(nummer == i)
                {System.out.println("Sie haben sich erfolgreich eingeloggt");
                }
                else
                 {System.out.println("Fehler beim Einloggen");}








        case 3: // Programm beenden
              fertig=true;
              break;
    }

Das ist alles nicht wahnsinnig interessant und schwer, jedoch stehe ich vor dem Problem des PINS:

Ich möchte einen Pin bekommen, der 4 stellig ist. Die zahl in den Klammer ( hier 4) bedeutet anscheind nur, das er Zahlen von 0-4 wiedergibt.
Kann mir da wer helfen.?



Ich möchte den durch zufall erstellten Pin, also die Zahl speichern lassen und dem Konto zuweisen. Beim nächsten durchlauf muss man sich dann mit der zufallszahl, die erst überprüft wird auf "Richtige Eingabe", einloggen.

Geht das überhaupt?
Kann man eine Zufallszahl überprüfen lassen?

Mein Ziel ist eine Endlosschleife, bis case 3....denn bevor das Programm nicht beendet wurde, sind ja alle daten drin .
Kann mir da wer helfn, danke!


gruessele spin


Edit: Habe die IF Bedingung dazugefügt. Wäre es vielleicht sinnvoll diese als methoden auszulagern ?
 
hi,
also erstmal vorweg wäre es vielleicht nicht einfacher wenn du eine Datenbank dahinter legst?
So kannst du zu jeder person eine bestimmte Kontonummer Kartennummer Pin Soll und Haben etc schön spezifizieren.

Beim erstellen eines Kontos fügst du dann diese Daten 1 mal in die Datenbank und danach arbeitest du nur noch mit Abfragen. So sparrst du dir glaube ich sehr viel denkarbeit und musst nicht immer schleifen durchrennen lassen usw.


Anstatt random() a = new random();...
würde ich es mal mit Math.random(); versuchen, das gibt dir einen Zufallswert zwischen 0 und 1 aus diesen kannst du dann beliebig multipliezieren usw und später natürlich auch überprüfen.

Bei Pins bin ich mir aber dennoch nicht sicher ich glaube die werden mit einer MD5 Codierung oder sonstigem Algorithmus gespeichert und nicht nur einfach als zahl
 
Danke relic für deine antwort, jedoch habe ich noch nicht mit Datenbänken gearbeitet, und weiß nicht wie ich in java klar machen soll, das die eingegeben daten gespeichert werden in der oder der Datenbank.


Die Daten von der Datenbank denn zu überprüfen und wiederzugeben ist denke ich auch einfacher.
Habe ich denn die mgl mit Netbeans eine Datenbank zu erzeugen, oder müsste ich mich da vorerst mit sql auseinander setzen?
 
Von einer DB würde dir als Anfänger auch erstmal abraten.

Der zweite Tipp denn ich habe lautet:
Schreibe nicht dein ganzes Programm in eine einzige Methode. 😉
 
Jepp, weiß ich doch mein bester 😉


Ich lager das ganze noch in Methoden aus, und werde this benutzen als Zeiger. Obwohl ich das total unsinnig finde bei kleinen Projekten.

Aber meine Aufgabe besteht nun mal darin get und set zu benutzen 😉

Doch möchte ich das gerne mit der Daten bank machen, habe mir dazu eine angelegt.

Ich benutze phpmyadmin und habe darüber eine Tabelle erstellt.
SELECT `Name`, `Vorname`, `Kontonummer`, `Bankleitzahl`, `Pin` FROM `Kontotabelle`


Mit 5 Spalten. Nun möchte ich gerne auf diese Datenbank zugreifen, in dieser Schreiben und sie überprüfen.


Code:
 Connection verb = null;
    Statement stmt = null;
    ResultSet rs = null;

    String  url = "jdbc:db2://localhost/Kontotabelle";
    String user = "Kontotabelle";
    String passw = "Secred";

    String name;
    int kontonummer;

    try{
        //Datenbanktreiber laden und verbinden
        Class.forName("COM.ibm.db2.jdbc.net.DB2Driver");
        verb = DriverManager.getConnection(url, user, passw);

        // Absetzen eines SQL Statements
         stmt= verb.createStatement();
         rs = stmt.executeQuery("SELECT Name, Vorname, Kontonummer, Bankleitzahl,Pin FROM Kontotabelle");

         // Auswerten der Ergebnisse

         System.out.println("Kontonummer name    ");
         System.out.println("-----------------------");

         while(rs.next())
         {
             kontonummer= rs.getInt(1);
             name = rs.getString(2);
             System.out.println(kontonummer + "          " + name);
         }
             // Statement abschließen
             stmt.close();
             verb.close();
         }
        catch (Exception ex)
        {
            System.out.println("Exception: " + ex.getMessage());




    }







    }

}


Könnte mir da bitte einer einen Tipp geben, wie ich auf diese Datenbank zugreife, und ob sich der Treiber in der java API befindet.? Muss ich den bei Netbeans vielleicht erst dazu installieren?
Mir geht es darum mit meinen ersten Code in eine Datenbank zu schreiben, zu der ich vorher eine Verbindung herstellen muss.


Danke für eure Hilfe.
 
Bevor du nicht verstanden hast, was verschiedene Methoden und this bedeuten, solltest du nicht weitermachen. Diese Grundlagen sind essentiell. Nur so als nett gemeinter Tipp.

Den MySQL-Treiber findest du, wenn du in die Suchmaschine deiner Wahl "MySQL Java Connector" eingibst. Das heruntergeladene JAR muß anschließend in den Classpath, über die Forumssuche solltest du dazu einige Beiträge finden.
 
Hallo Tobias, ich habe mein Programm nun noch mal umgeschrieben und die Datenbank rausgelassen, da ich leider noch keinen Schimmer davon habe,



Code:
public class Kontoklasse {

BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
private double kontostand, neuerKontostand,zahl,zahl1;
private int pin = 1234, kontonummer=5300300,blz = 20070024;
private String name, vorname;

	public Kontoklasse()
	{

        }
	public double getkontostand()
        {
		return kontostand;
	}

	public void setkontostand(double kontostand)
        {
		this.kontostand = kontostand;
	}
        
        public double getneuerkontostand() {
		return neuerKontostand;
	}

	public void setneuerKontostand(double neuerKontostand) {
		this.neuerKontostand = neuerKontostand;
	}
        public double getZahl() {
		return zahl;
	}

	public void setZahl1(double zahl) {
		this.zahl = zahl;
	}

	public double getZahl1() {
		return zahl1;
	}

	public void setZahl(double zahl1) {
		this.zahl1 = zahl1;
	}

       public int getpin()
       {
           return pin;
       }
       public void setpin(int pin)
       {
           this.pin=pin;
       }
       public int getkontonummer()
       {
           return kontonummer;
       }
       public void setkontonummer(int kontonummer)
       {
           this.kontonummer=kontonummer;
       }
       public int getblz()
       {
           return blz;
       }
       public void setblz(int blz)
       {
           this.blz=blz;
       }
   
 public static double addieren(double x, double y)
 {
     double summe = x+y;
     
     return summe;
 }

public static double subtrahieren(double x, double y)
{
    double differenz = x-y;
    
    return differenz;
}
 
 
public void run() throws IOException
{



    // benoetigte Variablen
    Kontoklasse kk = new Kontoklasse();
    boolean fertig =false;
    // Ausgabe
    System.out.println("Herzlich Willkommen bei Ihrer Bank");
    //Schleifenbeginn
    while(!fertig)
    {//Menue
     System.out.println("");
     System.out.println("Sie haben nun folgende Auswahlmöglichkeiten: "+
     "\n"+ "1. Konto neu anlegen" + "\n" + "2.Konto einloggen (PIN erforderlich)" + "\n"+ "3.Beenden");
     int auswahl = Integer.parseInt(eingabe.readLine());

    //Fallunterscheidung
    switch (auswahl)
    {//Konto anlegen
        case 1:
     
            
            System.out.println("Bitte geben Sie ihren Namen an:");
            kk.name= eingabe.readLine();
       
        System.out.println("Bitte geben Sie ihren Vornamen an:");
        kk.vorname= eingabe.readLine();
        
      
      
       
        System.out.println("Die von Ihnen eigegebenen Daten lauten:"+
                            "\n"+ "Name:" + kk.name+
                            "\n"+"Vorname:" + kk.vorname);
                            
        
        System.out.println("Zusätzlich bekommen Sie noch folgende Daten +" +
                            "\n" +"Kontonummer"+ kk.kontonummer + 
                            "\n" +"Bankleitzahl"+ kk.blz +
                            "\n" +"Pin"+ kk.pin  );

        
       
        break;


        case 2: System.out.println("Bitte geben Sie ihren Pin ein");
                int nummer = Integer.parseInt(eingabe.readLine());
                
                if(nummer == pin)
                {System.out.println("Sie haben sich erfolgreich eingeloggt");
                
                System.out.println("Ihr Kontostand beträgt derzeit: " + kontostand);
                System.out.println("Was möchten Sie nun tun: " + "\t"+ "1.Einzahlung"+ "\t"+ "2.Auszahlung");
                int auswahl1 = Integer.parseInt(eingabe.readLine());
                     switch(auswahl1)
                     {
                    case 1: System.out.println("Geben Sie an wie viel Geld Sie auf Ihren Konto einzahlen möchten");
                            double zahl = Double.parseDouble(eingabe.readLine());
                     
                             neuerKontostand = addieren(zahl,kontostand);
                           
                             System.out.println("Ihr neuer Kontostand lautet:" + neuerKontostand);
                             System.out.println("Danke für Ihren Besuch");
                    break;
                    case 3:System.out.println("Geben Sie an wie viel Geld Sie von Ihren Konto abholen möchten");
                            double zahl1 = Double.parseDouble(eingabe.readLine());
                            neuerKontostand = subtrahieren(kontostand,zahl1);
                            System.out.println("Ihr neuer Kontostand lautet:" + neuerKontostand);
                             System.out.println("Danke für Ihren Besuch");
               break;

                    default: System.out.println("Falsche eingabe");
                    break;
                }
                
                
                }
                else
                 {System.out.println("Fehler beim Einloggen");}
    








        case 3: // Programm beenden
              fertig=true;
               System.out.println("Danke für Ihren Besuch");
              break;
    }







    }
}
    
    


    public static void main (String[]args)throws IOException
    {

        Kontoklasse o = new Kontoklasse(); // Objekte mit ihren Instanzvariablen liegen auf dem Heap
        o.run();


    }
}



Ich habe schon verstanden warum man einige Methoden deklariert, doch leider happerts noch an der globalen Erkenntnis. Damit meine ich: Warum, ist doch eigentlich unsinnig.


mhh..

Mit get und set sagt man doch eigentlich, das man ein Objekt versucht festzuhalten um nur einen kontollierten Zugriff auf die Daten zu erlauben.
Bei der Ausführung eines Programms liegen doch
die Methoden auf der Method Area und die
Objekte mit ihren Instanz variablen auf dem
Heap.
woher wissen also die Methoden, wo sie das Datenfeld herbekommen?

Normallerweise bräuchte jede Methode, die auf
Instanz variablen arbeitet, auch eine Referenz auf
die im Heap befindlichen Daten. .....und das passiert durch this.


Wenn also jetzt hundert verschiedene Daten in einer Methode angelegt werden muss die Methode in der Lage sein, auf hundert verschiedene Ojekte zuzugreifen.

Ich denke ich habe es verstanden, wenn nicht, korrigiert mich bitte!
Doch warum mache ich das für ein Objekt in einer Methode ?


Danke , gruß spin
 
Ein Objekt ist die Einheit von Daten und Verhalten. Die Daten werden durch Instanzvariablen, das Verhalten durch Methoden abgebildet. Die Methoden eines Objekts arbeiten in aller Regel (Ausnahmen sind selten!) mit den Daten des selben Objekts.

Hier ist auch ein wesentliches Problem deines Programms zu suchen: Deine Methoden addieren() und subtrahieren() verändern das Objekt Konto nämlich nicht! Wenn ich ein Konto anlege und Geld einzahle, muß sich mein Kontostand verändern. Überprüfen läßt sich diese Veränderung, indem ich mich nach dem Einzahlen aus- und wieder einlogge. Beim zweiten Einloggen muß da Kontostand = alterKontostand + Einzahlung stehen, ansonsten bescheißt mich die Bank!

Dieses korrekte Verhalten erreichst du nur mit zwei Instanzmethoden in der Klasse Konto, die den Kontostand auch wirklich verändern (und gleichzeitig Überprüfungen durchführen - etwa soll ein negativer Betrag eingezahlt werden, soll mehr Geld abgehoben werden als verfügbar etc.).

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben