Home > Informatik > Stufe EF > 9. zweidimensionale Arrays

10.1 Zielsetzung und erster Entwurf

Folgen: 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10

Zielsetzung und erste Schritte

Zielsetzung der Folge 10 ist es, eine kleine Anwendung zu schreiben, die eine Bank simuliert. Eine Bank mit ihren Kunden, Konten und Kontobewegungen. Ein erster grober Entwurf des Bank-Systems könnte so aussehen:

Ansatz 1, noch recht bescheiden...
Ein erster Entwurf des Bank-Systems, der aber noch besch... ist.

Hier hat ein recht unbegabter Programmierer gedacht: "Wenn ich eine bestimmte Zahl N von Kunden habe, brauche ich für jeden Kunden ein eigenes Attribut, zum Beispiel kunde1, kunde2, kunde3 und so weiter. Ähnlich ist es mit der Zahl der Konten...".

Ich denke, hier muss niemand darauf aufmerksam gemacht werden, wie bescheuert dieser erste Ansatz ist.

Ansatz 2, schon besser...

Ein wesentlich erfahrenerer Programmierer hat jetzt folgende Idee: "In der Folge 7 habe ich gelernt, was Arrays sind, und erfahren, dass man auch Objekte einer Klasse in einen Array stecken kann. Das sollte ich doch jetzt hier mal einsetzen...".

Verfeinerung des ersten Entwurfs mit zwei Arrays, schon besser...

Ansatz 3, jetzt wird es langsam komplizierter...

Eine wichtige Sache haben aber beide Programmierer bisher übersehen. Ein einzelner Kunde kann mehrere Konten haben, während umgekehrt vielleicht auch mehrere Kunden auf das gleiche Konto zugreifen können, falls es zum Beispiel das Konto einer Firma oder einer Behörde ist.

Wie kann man so etwas in Java realisieren?

Fangen wir mit der etwas einfacheren Möglichkeit an: Jeder Kunde hat genau ein Konto, und jedes Konto kann nur von genau einem Kunden benutzt werden. Dann könnte man folgende Datentypen deklarieren. Zunächst einmal die Klasse Bank:

public class Bank
{
    Kunde[] kunde;
    Konto[] konto;
    
    private final int MAX = 100;
    
    public Bank()
    {
       kunde = new Kunde[MAX];
       konto = new Konto[MAX];
    }
}

Wie bereits im Entwurf angedeutet, besitzt die Klasse Bank zwei Arrays, einen für die Kunden, den anderen für die Konten. Die Anzahl der Kunden und Konten ist hier zunächst auf 100 begrenzt, dafür sorgt die Konstante MAX.

Dann die Klasse Kunde:

public class Kunde
{
    private String name, vorname;
    
    public Kunde(String name, String vorname)
    {
        this.name    = name;
        this.vorname = vorname;
    }
}

Jeder Kunde muss einen Namen und Vornamen haben. Später können dann noch weitere Daten wie zum Beispiel Kundennummer, Adresse etc. dazukommen, aber das soll uns jetzt erst mal nicht belasten.

Kommen wir nun zur Klasse Konto:

public class Konto
{
    private int nummer;
    private double stand;
    
    public Konto(int nr)
    {
        nummer = nr;
        stand  = 0;
    }
}

Jedes Konto hat eine Nummer, aber noch keinen Eigentümer - das kommt später. Außerdem ist vor allem der aktuelle Kontostand interessant.

Viel machen kann man mit unserem kleinen System noch nicht, aber das kommt im nächsten Schritt.

Jeder Kunde bekommt ein Konto

Jetzt wollen wir dafür sorgen, dass jeder Kunde ein Konto bekommt. Vorher allerdings müssen wir die Klasse Bank erweitern, so dass überhaupt konkrete neue Kunden angelegt werden können. Nehmen wir zunächst einmal diese kleine Teilaufgabe in Angriff:

public class Bank
{
    Kunde[] kunde;
    Konto[] konto;
    
    private final int MAX = 100;
    private int anzahlKunden;
    
    public Bank()
    {
       kunde = new Kunde[MAX];
       konto = new Konto[MAX];
       anzahlKunden = 0;
    }
    
    public void neuerKunde(String name, String vorname)
    {
       Kunde neu;
       
       if (anzahlKunden < MAX)
       {
          neu = new Kunde(name,vorname);
          kunde[anzahlKunden++] = neu;
       }
    }
}

Die Methode neuerKunde kann man auch etwas kürzer schreiben, wenn man auf die lokale Hilfsvariable neu verzichtet:

    public void neuerKunde(String name, String vorname)
    {
       if (anzahlKunden < MAX)
          kunde[anzahlKunden++] = new Kunde(name,vorname);
    }

Diese Version von Bank kann man mit dem Objektinspektor testen, allerdings ist das ziemlich umständlich, wenn man drei oder mehrere Kunden anlegen will, weil man für jeden neuen Kunden zwei Strings eintippen muss. Einfacher geht das mit einer neuen Testklasse:

public class TesteBank
{
    Bank vb;
    
    public TesteBank()
    {
       vb = new Bank();
       vb.neuerKunde("Helmich","Ulrich");
       vb.neuerKunde("Meier","Heinz");
       vb.neuerKunde("Beutlin","Frodo");
    }
}

Übungen

Kommen wir nun zu den ersten Übungen.

Übung 10.1-1

Ergänzen Sie das Projekt um eine Ausgabe-Methode für die Bank, so dass alle vorhandenen Kunden angezeigt werden können.

 

Übung 10.1-2

Ergänzen Sie das Projekt um die Fähigkeit, neue Konten anzulegen und diese auch anzuzeigen. Die Konten müssen noch nicht mit Kunden verbunden sein, und ein Kunde muss noch kein Konto haben. Ergänzen Sie das Projekt so, dass die unten stehende Testklasse funktioniert.

Hinweis: Die Kunden sollten jetzt ebenfalls Nummern haben, das vereinfacht die Sache erheblich. Der erste Kunde hätte dann die Nummer 0, was auch dem Index in dem Kunden-Array entspricht.

Testklasse für die Übung 10.1-2:

public class TesteBank
{
    Bank vb;
    
    public TesteBank()
    {
       vb = new Bank();
       vb.neuerKunde("Helmich","Ulrich");
       vb.neuerKunde("Meier","Heinz");
       vb.neuerKunde("Beutlin","Frodo");
       vb.anzeigenKunden();
       
       vb.neuesKonto();
       vb.neuesKonto();
       vb.neuesKonto();
       vb.neuesKonto();
       vb.anzeigenKonten();
    }
}
Übung 10.1-3

Ergänzen Sie das Projekt um die wichtige Eigenschaft, dass man einem Kunden ein Konto zuweisen kann. Wenn dann die Kunden ausgegeben werden, soll auch angezeigt werden, welches Konto dieser Kunde hat. Falls der Kunde noch kein Konto hat, soll eine entsprechende Meldung angezeigt werden (siehe dazu die Testausgabe).

Testklasse für die Übung 10.1-3:

public class TesteBank
{
    Bank vb;
    
    public TesteBank()
    {
       vb = new Bank();
       vb.neuerKunde("Helmich","Ulrich");
       vb.neuerKunde("Meier","Heinz");
       vb.neuerKunde("Beutlin","Frodo");
       vb.anzeigenKunden();
       
       vb.neuesKonto();
       vb.neuesKonto();
       vb.neuesKonto();
       vb.neuesKonto();
       vb.anzeigenKonten();
       
       vb.kontoFuerKunde(0,0);
       vb.kontoFuerKunde(1,2);
       vb.anzeigenKunden();
    }
}

Ihr Programm müsste dann folgende Konsolenausgabe erzeugen (Testausgabe):

Kundenkarte Nr. 0
Name: Helmich	Vorname: Ulrich
------------------------------------------------
Kundenkarte Nr. 1
Name: Meier	Vorname: Heinz
------------------------------------------------
Kundenkarte Nr. 2
Name: Beutlin	Vorname: Frodo
------------------------------------------------
Konto Nummer 0
Stand: 0.0
------------------------------------------------
Konto Nummer 1
Stand: 0.0
------------------------------------------------
Konto Nummer 2
Stand: 0.0
------------------------------------------------
Konto Nummer 3
Stand: 0.0
------------------------------------------------
Kundenkarte Nr. 0
Name: Helmich	Vorname: Ulrich
Der Kunde hat folgendes Konto: 
Konto Nummer 0
Stand: 0.0
------------------------------------------------
------------------------------------------------
Kundenkarte Nr. 1
Name: Meier	Vorname: Heinz
Der Kunde hat folgendes Konto: 
Konto Nummer 2
Stand: 0.0
------------------------------------------------
------------------------------------------------
Kundenkarte Nr. 2
Name: Beutlin	Vorname: Frodo
Der Kunde hat noch kein Konto!
------------------------------------------------
Übung 10.1-4

Bisher kann jeder Kunde nur ein Konto haben. Ergänzen Sie das Projekt so, dass jeder Kunde maximal 10 Konten besitzen darf. Bei der Ausgabe der Kunden sollen dann auch alle Konten des Kunden angezeigt werden.

Hier wieder eine Testklasse für die Übung 10.1-4:

public class TesteBank
{
    Bank vb;
    
    public TesteBank()
    {
       vb = new Bank();
       vb.neuerKunde("Helmich","Ulrich");
       vb.neuerKunde("Meier","Heinz");
       vb.neuerKunde("Beutlin","Frodo");
       vb.neuerKunde("Schuster","Karl");       
       
       for (int k = 0; k<20; k++)
          vb.neuesKonto();
       
       vb.kontoFuerKunde(0,0);
       vb.kontoFuerKunde(0,1);
       vb.kontoFuerKunde(0,2);
       vb.kontoFuerKunde(0,3);
       
       vb.kontoFuerKunde(1,4);
       vb.kontoFuerKunde(1,5);
       vb.kontoFuerKunde(1,6);
       vb.kontoFuerKunde(1,7);
       vb.kontoFuerKunde(1,8);
       
       vb.kontoFuerKunde(3,15);
       
       vb.anzeigenKunden();
    }
}

Und hier eine Beispiel-Ausgabe; Ihre Ausgabe sollte dann so ähnlich aussehen. Wenn ein Kunde nur ein Konto besitzt, sollte das entsprechend angezeigt werden:

Kundenkarte Nr. 0
Name: Helmich	Vorname: Ulrich
Der Kunde hat folgende Konten: 
Konto Nummer 0
Stand: 0.0
------------------------------------------------
Konto Nummer 1
Stand: 0.0
------------------------------------------------
Konto Nummer 2
Stand: 0.0
------------------------------------------------
Konto Nummer 3
Stand: 0.0
------------------------------------------------
------------------------------------------------
Kundenkarte Nr. 1
Name: Meier	Vorname: Heinz
Der Kunde hat folgende Konten: 
Konto Nummer 4
Stand: 0.0
------------------------------------------------
Konto Nummer 5
Stand: 0.0
------------------------------------------------
Konto Nummer 6
Stand: 0.0
------------------------------------------------
Konto Nummer 7
Stand: 0.0
------------------------------------------------
Konto Nummer 8
Stand: 0.0
------------------------------------------------
------------------------------------------------
Kundenkarte Nr. 2
Name: Beutlin	Vorname: Frodo
Der Kunde hat noch kein Konto!
------------------------------------------------
Kundenkarte Nr. 3
Name: Schuster	Vorname: Karl
Der Kunde hat folgendes Konto: 
Konto Nummer 15
Stand: 0.0
------------------------------------------------
------------------------------------------------