OOP Inhalt eines Array ausgeben lassen

karlmasutra

Mitglied
Guten Abend zusammen. Ich habe mich zu folgenden Thema das ein oder andere mal gemeldet. Nun habe ich mein Programm restrukturiert und habe ein hoffentlich winziges Problem. 🙂

Bekannte 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 zwei Punkten.

Problem
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 wirklich. Das Programm kompiliert und ich kann es auch ausführen. Aber wenn ich mir die Termine des Arrays anzeigen lassen will(Konsolenausgabe in Klasse Sicherung), passiert nix. Das selbe bei der Klasse "TerminVerschieben". Ich kann diesen Teil des Programms starten und mit den Abfragen beginnen, aber er hat keine Termine zum verschieben.
Wenn ich alles in die Main schreibe, geht es komischerweise. Ich bin mit meinen Latein langsam am Ende.

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:
[/FONT]
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:        Sicherung s = new Sicherung();
                        s.speichern();
                break;
            case 3:        EingetrageneTermine et = new EingetrageneTermine();   
                          et.eingetrageneTermine();
                  break;
              case 4:        TerminVerschieben tv = new TerminVerschieben();
                          tv.verschiebeTermin();
                  break;
        }   
    }
  }
}
[FONT=Arial]
Java:
[/FONT]
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);
   
        //Auflisten der Termine
        Termin[] termine = kalender.getTermine();
            int index = 1;
            for(int i = 0; i < termine.length; i++) {
                if(termine[i] != null) {
                    System.out.printf("%d: %s", index++, termine[i]);
                }
            }
        //Teilnehmer hinzufügen
        boolean naechstenTeilnehmer = true;
            do {   
                System.out.println("****************************");
                System.out.println("1 Neuer Teilnehmer\n2 2 zurueck zum Hauptmenue");
                System.out.println("****************************");
                Scanner sc_auswahl = new Scanner(System.in);
                int auswahl = sc_auswahl.nextInt();
               
                if (auswahl == 1) {
                    System.out.println("****************************");
                    System.out.println("Geben Sie den Namen des Teilnehmers ein."); 
                    System.out.println("****************************");
                    Scanner sc_name = new Scanner(System.in);
                    String name = sc_name.nextLine();
                    bt.addTeilnehmer(new Teilnehmer(name));
                } else if (auswahl == 2) {
                    naechstenTeilnehmer = false;
                } else {
                    System.out.println("Fehleingabe");   
                }
            } while(naechstenTeilnehmer);
           
            kalender.addTermin(bt);
    }
}
[FONT=Arial]
Java:
[/FONT]
public class Sicherung {
    Kalender kalender = new Kalender();

    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();
            }
        }
    }
}
[FONT=Arial]
Java:
[/FONT]
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;
    } 
}
[FONT=Arial]
Java:
[/FONT]
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;
    }
} 
[FONT=Arial]
Java:
[/FONT]
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);
  }
}
[FONT=Arial]
Java:
[/FONT]
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 strTeilnehmer = teilnehmer[0].toString();
        for(int i = 1; i < teilnehmer.length; ++i) {
            if(teilnehmer[i] != null) {
                strTeilnehmer = strTeilnehmer.concat(", " + teilnehmer[i].toString());
            }
        }
        return strTeilnehmer;
    }


  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());

  }

}
[FONT=Arial]
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 void verschiebeTage(int tage) {
        setTag(tag + tage);
    }
   
    public void verschiebeMonate(int monate) {
        setMonat(monat + monate);
    }
   
    public void verschiebeJahre(int jahre) {
        setJahr(jahr + jahre);
    }
   
    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 void verschiebeStunde(int std) {
        setStunden(stunden + std);
    }

    public void verschiebeMinute(int min) {
        setMinuten(minuten + min);
    }
   
    public String toString() {       
        return stunden+":"+minuten;   
    }
}
[/code[/FONT]
 
Wie schaffe ich es dann von Sicherung auf das Objekt kalender in TermineErzeugen zuzugreifen?

Ich habe Kalender kalender = new Kalender in mehreren Klassen stehen, da ich sonst immer eine Fehlermeldung hatte, das er kalender nicht finden kann.
 
Du hast (in einem anderen Thread) von MVC gesprochen. Das ist hier aber nicht nötig.
Du solltest an einer zentralen Stelle (meinetwegen in der main) einen Kalender anlegen und dir die Klassen TermineErzeugen und Sicherung sparen (und sie möglicherweise durch Methoden ersetzen, denen diese eine Instanz von "Kalender" übergeben wird).
 
Du hast (in einem anderen Thread) von MVC gesprochen. Das ist hier aber nicht nötig.
Du solltest an einer zentralen Stelle (meinetwegen in der main) einen Kalender anlegen und dir die Klassen TermineErzeugen und Sicherung sparen
Bekannte 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 zwei Punkten.
Wie gesagt, das würde funktionieren, aber wir sollen die main klein halten. Deswegen ja der Ansatz das ich alles auslager. Ich weiß halt nur nicht, wie ich von anderen Klassen auf die eine Instanz zugreifen kann.
 
Nicht sehr elegant aber ohne größere Änderungen in deinem Code möglich wäre folgendes:
Java:
  public static void main (String[]args) {
     Kaelder kalender = new Kalender();
        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(kalender);
                  break;
            case 2:        Sicherung s = new Sicherung();
                        s.speichern(kalender);
                break;
            case 3:        EingetrageneTermine et = new EingetrageneTermine();  
                          et.eingetrageneTermine(kalender);
                  break;
              case 4:        TerminVerschieben tv = new TerminVerschieben();
                          tv.verschiebeTermin(kalender);
                  break;
        }  
    }
  }
 
Nicht sehr elegant aber ohne größere Änderungen in deinem Code möglich wäre folgendes:
Java:
  public static void main (String[]args) {
     Kaelder kalender = new Kalender();
        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(kalender);
                  break;
            case 2:        Sicherung s = new Sicherung();
                        s.speichern(kalender);
                break;
            case 3:        EingetrageneTermine et = new EingetrageneTermine();
                          et.eingetrageneTermine(kalender);
                  break;
              case 4:        TerminVerschieben tv = new TerminVerschieben();
                          tv.verschiebeTermin(kalender);
                  break;
        }
    }
  }

Diese Idee hatte ich auch schon, aber dann bekomme ich folgende Fehlermeldung:
Java:
Main.java:18: error: method termineAnlegen in class TermineErzeugen cannot be applied to given types;

  te.termineAnlegen(kalender);

    ^

  required: no arguments

  found: Kalender

  reason: actual and formal argument lists differ in length

Main.java:21: error: method speichern in class Sicherung cannot be applied to given types;

s.speichern(kalender);

^

  required: no arguments

  found: Kalender

  reason: actual and formal argument lists differ in length

Main.java:24: error: method eingetrageneTermine in class EingetrageneTermine cannot be applied to given types;

  et.eingetrageneTermine(kalender);

    ^

  required: no arguments

  found: Kalender

  reason: actual and formal argument lists differ in length

Main.java:27: error: method verschiebeTermin in class TerminVerschieben cannot be applied to given types;

  tv.verschiebeTermin(kalender);

    ^

  required: no arguments

  found: Kalender

  reason: actual and formal argument lists differ in length

Main.java:30: error: method termineLoeschen in class TermineLoeschen cannot be applied to given types;

  tl.termineLoeschen(kalender);

    ^

  required: no arguments

  found: Kalender

  reason: actual and formal argument lists differ in length
 

Neue Themen


Zurück
Oben