Inhalt eines Array ausgeben lassen


#1
Guten Abend zusammen. Ich habe ein, hoffentlich kleines, leicht zu lösendes Problem. :)

Folgende Ausgangssituation:
Ich muss eine Terminverwaltung programmieren. Dazu habe ich einige Vorgaben bekommen. Unter anderem, die Main so klein wie möglich zu halten. Also habe ich viele neue Klassen und Methoden geschrieben und rufe diese nur noch aus der Main ab. Das funktioniert auch alles wunderbar, abgesehen von einem Punkt.

Wir sollten einen Programmpunkt "Speichern" implementierten. Da wir dies aber in der FH noch nicht behandelt hatten, sollen wir im Programmpunkt "Speichern" lediglich eine Konsolenausgabe implementieren. Leider funktioniert dieser Punkt nicht und ich bin mir nicht sicher wieso. Ich vermute er kann auf das "Terminarray" nicht zugreifen. Weiß aber auch nicht, wie ich es anders schreiben soll, das er es macht.
Wenn ich alles in die Main packe und das nacheinander Wegschreibe funktioniert es komischerweise.

Hier die Quellcode's. Es wäre schön wenn mir jmd von euch helfen könnte, damit ich endlich weiter komme.

Vg
Marco

Java:
import java.util.Scanner;
import java.util.Arrays;

public class Main {   
  public static void main (String[]args) {
        PasswortAbfrage p = new PasswortAbfrage();
        p.abfrage();
   
    while (true){
          Hauptmenue h = new Hauptmenue();
          int a = h.auswahl();
       
          switch (a) {
              case 0:      System.exit(0);
                  break;
              case 1:      TermineErzeugen te = new TermineErzeugen(); 
                               te.termineAnlegen();
                  break;
              case 2:      Speicherung s = new Speicherung();
                               s.speichern();
                  break;
              case 3:      EingetrageneTermine et = new EingetrageneTermine();   
                               et.eingetrageneTermine();
                  break;
        }   
    }
  }
}
Java:
import java.util.Scanner;

public class TermineErzeugen {
    Kalender kalender = new Kalender();
   
    public void termineAnlegen() {   
          System.out.println("Geben sie den Tag ein: ");
          Scanner sc_Tag = new Scanner(System.in);
          int tag = sc_Tag.nextInt();

          System.out.println("Geben sie den Monat ein: ");
          Scanner sc_Monat = new Scanner(System.in);
          int monat = sc_Monat.nextInt();
         
          System.out.println("Geben sie das Jahr ein: ");
          Scanner sc_Jahr = new Scanner(System.in);
          int jahr = sc_Jahr.nextInt();
       
          Datum datum = new Datum(tag,monat,jahr);
       
          System.out.println("Geben sie die volle Stunde ein: ");
          Scanner sc_Stunde = new Scanner(System.in);
          int stunde = sc_Stunde.nextInt();
     
          System.out.println("Geben sie die Minuten ein: ");
          Scanner sc_Minute = new Scanner(System.in);
          int minute = sc_Minute.nextInt();
       
          Zeit zeit = new Zeit(stunde,minute);
       
          System.out.println("Geben sie den Ort ein: ");
          Scanner sc_Ort = new Scanner(System.in);
          String ort = sc_Ort.nextLine();
               
          System.out.println("\n**********************");
          System.out.println("Wird dieser Termin ein:\n1 Privattermin\n2 Buerotermin");
          System.out.println("**********************\n");
          Scanner sc_abfrage = new Scanner(System.in);
          int abfrage = sc_abfrage.nextInt();
       
          if (abfrage == 1) {
            privat(datum,zeit,ort);
        } else if (abfrage ==2) {
            buero(datum,zeit,ort);
        } else {
            System.out.println("Fehleingabe");
        }
    }
   
    public void privat(Datum datum,Zeit zeit,String ort) {                   
          System.out.println("Grund für den Termin: ");
          Scanner sc_Beschreibung = new Scanner(System.in);
          String beschreibung = sc_Beschreibung.nextLine();
     
        PrivatTermin pt = new PrivatTermin(datum,zeit,ort,beschreibung);
        kalender.addTermin(pt);

    }   
    public void buero(Datum datum,Zeit zeit,String ort) {

          System.out.println("Geben Sie den Teilnehmer an: ");
          Scanner sc_Teilnehmer = new Scanner(System.in);
          String teilnehmer = sc_Teilnehmer.nextLine();
          BueroTermin bt = new BueroTermin(datum,zeit,ort,teilnehmer);
   
        kalender.addTermin(bt);
    }
}
Java:
public class Speicherung {
    public void speichern() {
        Termin[] termine = kalender.getTermine();//Ruft Termine ab
        int index = 1; //Für eine bessere Übersicht wird hier ein Index angelegt
           
        for(int i = 0; i < termine.length; i++){
            if(termine[i] != null){//Falls ein leeres Feld entstehen sollte wird es bei der Angabe nicht angezeigt.
                System.out.printf("%d: %s", index++, termine[i]); 
                System.out.println();
            }
        }
    }
}
Java:
public class Kalender {
    private int Arraygroeße = 1; 
    private int index = 0;
    private Termin[] termine = new Termin[Arraygroeße]; //Instanziiert einen neuen Termin

    public void addTermin(Termin a) {
        if(index < Arraygroeße) {
            termine[index++] = a;
        } else {
            //Automatische Array-Vergrößerung. 
            Arraygroeße += 1;
            Termin[] termineCache = new Termin[Arraygroeße]; //Legt neue Instanz an

            for(int i = 0; i < termine.length; i++) { //von termine in termineCache
                termineCache[i] = termine[i];
            }
           
            termine = termineCache; // von termineCache in termine
            termine[index++] = a; 
        }
    }

    public Termin[] getTermine() {
        return termine;
    } 
}
Java:
public class Termin{
  protected Datum datum;
  protected Zeit zeit;
  protected String ort;
 
      public Termin(Datum datum, Zeit zeit, String ort) {
      setDatum(datum);
      setZeit(zeit);
      setOrt(ort);
    }
   
    public void setZeit(Zeit zeit) {
      this.zeit = zeit;
    }
   
    public void setDatum(Datum datum) {
      this.datum = datum;
    }
   
    public void setOrt(String ort) {
      this.ort = ort;
    }
       
    public Zeit getZeit(){
      return zeit;
    }
   
    public Datum getDatum(){
      return datum;
    }
   
    public String getOrt(){
      return ort;
    }
}
Java:
public class PrivatTermin extends Termin {
  private String beschreibung;
 
  public PrivatTermin(Datum datum, Zeit zeit, String ort,String beschreibung) {
    super(datum,zeit,ort);
      setBeschreibung(beschreibung);
  }
 
  public String getBeschreibung(){
    return beschreibung;
  }     
  public void setBeschreibung(String beschreibung) {   
      this.beschreibung = beschreibung; 
  }

  public String toString() {
    return String.format("Datum: %s, Uhrzeit: %s, Ort: %s, Grund: %s", datum, zeit, ort, beschreibung);
  }
}
Java:
public class BueroTermin extends Termin {
  private Teilnehmer [] teilnehmer = new Teilnehmer[10];
  private int teilnehmerNummer = 1;
 
  public BueroTermin(Datum datum, Zeit zeit, String ort,String teilnehmer) {
    super(datum,zeit,ort);
      this.teilnehmer[0] = new Teilnehmer(teilnehmer);
  }
       
      public String getTeilnehmer() {
        String a = teilnehmer[0].toString();
        for(int i = 1; i < teilnehmer.length; ++i) {
            if(teilnehmer[i] != null) {
                a = a.concat(", " + teilnehmer[i].toString());
            }
        }
        return a;
    }

 
  public void addTeilnehmer(Teilnehmer t) {
      this.teilnehmer[teilnehmerNummer++] = t;
  }
 
  public String toString() {
      return String.format("Datum: %s, Uhrzeit: %s, Ort: %s, Teilnehmer: %s", datum, zeit, ort, getTeilnehmer());

  }
 
}
Java:
public class Teilnehmer{
    private String teilnehmer;

    public Teilnehmer(String teilnehmer){
        this.teilnehmer = teilnehmer;
    }
   
    public String toString(){
        return this.teilnehmer;
    }
}
Java:
public class Datum {
    protected int tag, monat,jahr;
   
    public Datum(int tag, int monat, int jahr){
      setTag(tag);
      setMonat(monat);
      setJahr(jahr);
    }
   
    public void setTag(int tag) {
        this.tag = tag;
    }
   
    public void setMonat(int monat) {
        this.monat = monat;
    }
   
    public void setJahr(int jahr) {
        this.jahr = jahr;
    }
   
    public int getTag() {
        return tag;
    }
   
    public int getMonat() {
        return monat;
    }
   
    public int getJahr() {
        return jahr;
    }
    public String toString() {       
        return String.format("%02d.%02d.%4d", tag, monat, jahr);
    }
}
Java:
public class Zeit {
    private int stunden,minuten;
   
    public Zeit(int stunden, int minuten) {
      setStunden(stunden);
      setMinuten(minuten);
    }
   
    public int getStunden() {
      return stunden;
    }
    public void setStunden(int stunden) {
      this.stunden = stunden;
    }
   
    public int getMinuten() {
      return minuten;
    }
    public void setMinuten(int minuten) {
    this.minuten = minuten;
    }
    public String toString() {       
        return stunden+":"+minuten;   
    }
}
 

HonniCilest

Erfahrenes Mitglied
#2
Es ist völlig sinnfrei für TermineErzeugen, Speicherung und EingetrageneTermine jeweils eine eigene Klasse zu erzeugen. All diese Methoden gehören in die Klasse Kalender und nicht andersherum. Die Klasse Kalender wird dann zu Beginn deines Programmes initialisiert.

Also etwa so:
Java:
public class Main {
 public static void main (String[] args) {
PasswortAbfrage p = new PasswortAbfrage();
        p.abfrage();


Kalender kalender = new Kalender();
// kalender.ladeTermine(); <-- wenn ihr ggf. später speichert wirst du diese sicher auch auslesen müssen
 
    while (true){
          Hauptmenue h = new Hauptmenue();
          int a = h.auswahl();
    
          switch (a) {
              case 0:      System.exit(0);
                  break;
              case 1:      kalender.erzeugeTermin();
                  break;
              case 2:      kalender.speichern();
                  break;
              case 3:      kalender.zeigeTermine();
                  break;
        }
    }
  }
}
 
#3
Es ist völlig sinnfrei für TermineErzeugen, Speicherung und EingetrageneTermine jeweils eine eigene Klasse zu erzeugen. All diese Methoden gehören in die Klasse Kalender und nicht andersherum. Die Klasse Kalender wird dann zu Beginn deines Programmes initialisiert.
[/code]
Ah okay. Und weil ich in der while-Schleife bleibe, initiiere ich auch nicht immer einen neuen Kalender. Verstehe ich das richtig? Danke aber schon einmal für deinen Tipp. Werde das mal so versuchen umzusetzen.

Vg
Marco