Benutzer-Werkzeuge

Webseiten-Werkzeuge


listen:trennungstrukturdaten:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
listen:trennungstrukturdaten:start [2024/09/19 07:45] – [Gesamtprogramm] Martin Pabstlisten:trennungstrukturdaten:start [2024/09/27 08:03] (aktuell) – [Klassendiagramm] Martin Pabst
Zeile 3: Zeile 3:
 Im [[listen:verkettet:start|vorhergehenden Kapitel ]] haben Sie eine Warteschlangen-Implementierung kennengelernt, bei der der Code zur Verwaltung der Listenstruktur mit dem Code zur Verwaltung der Daten vermischt war. Wir werden jetzt Struktur und Daten sauber trennen, so dass der Code zur Verwaltung der Listenstruktur besser wiederverwendbar wird. \\ \\  Im [[listen:verkettet:start|vorhergehenden Kapitel ]] haben Sie eine Warteschlangen-Implementierung kennengelernt, bei der der Code zur Verwaltung der Listenstruktur mit dem Code zur Verwaltung der Daten vermischt war. Wir werden jetzt Struktur und Daten sauber trennen, so dass der Code zur Verwaltung der Listenstruktur besser wiederverwendbar wird. \\ \\ 
  
-Die Lösungsidee besteht darin, jedes Datenobjekt in ein Objekt einer neuen Klasse ''Knoten'' zu "verpacken", das neben dem (Verweis auf dasDatenobjekt auch einen Verweis auf denjenigen Knoten enthält, der den Verweis auf den Nachfolger des aktuellen Inhaltsobjekts beinhaltet. **"Einfach verkettet"** ist diese Liste übrigens insofern, als die Knoten keinen Verweis auf ihre Vorgänger-Knoten beinhalten (das wäre dann eine "doppelt verkettete Liste"). \\ \\+Die Lösungsidee besteht darin, jedes Datenobjekt in ein Objekt einer **neuen Klasse ''Knoten''** zu "verpacken", das neben dem Verweis auf das Datenobjekt auch einen Verweis auf denjenigen Knoten enthält, der den Verweis auf den Nachfolger des aktuellen Inhaltsobjekts beinhaltet. **"Einfach verkettet"** ist diese Liste übrigens insofern, als die Knoten keinen Verweis auf ihre Vorgänger-Knoten beinhalten (das wäre dann eine "doppelt verkettete Liste"). \\ \\
 </WRAP> </WRAP>
  
Zeile 9: Zeile 9:
 {{ :listen:trennungstrukturdaten:objektdiagramm_einfach_verkettete_liste_trennung_struktur_-_daten_.svg?500 |}} {{ :listen:trennungstrukturdaten:objektdiagramm_einfach_verkettete_liste_trennung_struktur_-_daten_.svg?500 |}}
 ==== Klassendiagramm ==== ==== Klassendiagramm ====
-{{ :listen:trennungstrukturdaten:klassendiagramm_einfach_verkettete_liste_trennung_struktur_-_daten_.svg |}}+{{ :listen:trennungstrukturdaten:klassendiagramm_einfach_verkettete_liste_trennung_struktur_-_daten_.svg |}}  
 + 
 +<WRAP center round tip 60%> 
 +Beim Zeichnen der Klassen- und Objektdiagramme orientieren wir uns an der [[https://www.omg.org/spec/UML/2.5.1/About-UML|UML-Specification]]. Sie definiert folgende Symbole für die **Beziehungen zwischen Klassen**: 
 +  * {{:listen:trennungstrukturdaten:aggregation.png?150|}} **Aggregation** (//aggregation//): Ein Objekt der Klasse A **enthält** Objekt(e) der Klasse B. \\ \\ 
 +  * {{:listen:trennungstrukturdaten:composite.png?150|}} **Komposition** (//composition//): Ein Objekt der Klasse A **besteht aus** Objekt(en) der Klasse B. \\ \\ 
 +  * {{:listen:trennungstrukturdaten:association.png?150|}} **Assoziation** (//association//): Objekte der Klasse A stehen auf irgendeine Art in Beziehung zu Objekten der Klasse B. Ein Verb/Nomen über der Linie zusammen mit einem Pfeil oder > bezeichnet die Beziehung näher. \\ \\ 
 +  * {{:listen:trennungstrukturdaten:inheritance.png?150|}} **Vererbung** (//inheritance//): A ist Unterklasse von B. \\ \\ 
 + 
 +[[https://www.visual-paradigm.com/guide/uml-unified-modeling-language/uml-aggregation-vs-composition/|Hier eine schöne, anschauliche Erklärung zur Unterscheidung der Beziehungsarten]]. 
 + 
 +Bei Aggregation, Komposition und Assoziation ist es oft hilfreich, die **Kardinalität** der Beziehung durch Zahlenangaben wie ''0, 1'' oder ''*'' ("0 bis unendlich") anzugeben. \\ \\  
 + 
 +**Vorgehen in Prüfungen (auch Abitur):** \\  
 +Der Lehrplan unterscheidet die Fälle Aggregation, Komposition und Assoziation bisher nicht in der Symbolik, auch in den Musterlösungen zum Abitur wird in allen drei Fällen nur die Symbolik der Assoziation (Linie mit Verb/Nomen dran und Pfeil für die Leserichtung) verwendet. Entsprechend dürfen auch Sie in schriftlichen Prüfungen verfahren. \\  
 +**Das Symbol für Vererbung (Dreieckpfeil) wird aber sehr wohl verwendet.** 
 +</WRAP>
  
 ===== Umsetzung in Java ===== ===== Umsetzung in Java =====
-=== Die Klasse Inhalt ===+=== Die Klasse Kunde ===
 Die Klasse ''Kunde'' muss für die Speicherung in der Warteschlange überhaupt nicht mehr angepasst werden: Die Klasse ''Kunde'' muss für die Speicherung in der Warteschlange überhaupt nicht mehr angepasst werden:
 <code learnj> <code learnj>
Zeile 27: Zeile 43:
 <code learnj> <code learnj>
 public class Warteschlange { public class Warteschlange {
-    private Knoten erster+   Knoten anfang
-    +   Knoten ende;
 } }
  
 public class Knoten { public class Knoten {
-    private Knoten nachfolger; +   Knoten nachfolger; 
-    private Inhalt inhalt+   Kunde daten
-         + 
-    public Knoten(Inhalt inhalt){ +   Knoten(Kunde kunde) { 
-       this.inhalt inhalt+      this.daten kunde
-    }+   }
 } }
 </code> </code>
Zeile 133: Zeile 149:
  
 <script type="text/plain" title="Hauptprogramm.java"> <script type="text/plain" title="Hauptprogramm.java">
-Supermarktkasse s = new Supermarktkasse();+Warteschlange s = new Warteschlange();
 s.hintenAnstellen(new Kunde("Max")); s.hintenAnstellen(new Kunde("Max"));
 s.hintenAnstellen(new Kunde("Tina")); s.hintenAnstellen(new Kunde("Tina"));
Zeile 139: Zeile 155:
 s.hintenAnstellen(new Kunde("Tim")); s.hintenAnstellen(new Kunde("Tim"));
  
-println(s.getAnzahlIterativ());+println(s.hatKunde("Silke")); 
 +println(s.hatKunde("Tom"));
  
-println(s.erstenEntnehmen().name); 
-println(s.erstenEntnehmen().name); 
-println(s.erstenEntnehmen().name); 
  
- +class Warteschlange {
-class Supermarktkasse {+
    Knoten anfang;    Knoten anfang;
    Knoten ende;    Knoten ende;
Zeile 187: Zeile 200:
    int getAnzahlRekursiv() {    int getAnzahlRekursiv() {
       if(anfang == null) return 0;       if(anfang == null) return 0;
-      return anfang.getAnzahlRekursiv();+      return anfang.getAnzahl();
    }    }
 +
 +   Kunde gibDenNtenKunden(int n) {
 +      if(n == 0) return anfang.getDaten();
 +      return anfang.gibDenNtenKunden(n);
 +   }
 +
 +   boolean hatKunde(String name) {
 +      if(anfang == null) return false;
 +      return anfang.hatKunde(name);
 +   }
 +
 } }
  
Zeile 199: Zeile 223:
    }    }
  
-   int getAnzahlRekursiv() {+   boolean hatKunde(String name) { 
 +      if(daten.name == name) return true; 
 +      if(nachfolger == null) return false; 
 +      return nachfolger.hatKunde(name); 
 +   } 
 + 
 +   int getAnzahl() {
       if(nachfolger == null) return 1;       if(nachfolger == null) return 1;
-      return nachfolger.getAnzahlRekursiv() + 1;+      return nachfolger.getAnzahl() + 1;
    }    }
  
Zeile 214: Zeile 244:
    Kunde getDaten() {    Kunde getDaten() {
       return daten;       return daten;
 +   }
 +
 +   Kunde gibDenNtenKunden(int n) {
 +      if(n == 1) return daten;
 +      if(nachfolger != null) {
 +         return nachfolger.gibDenNtenKunden(n - 1);
 +      }
 +
 +      // Fehler: n ist zu groß!
 +      return null;
    }    }
 } }
Zeile 223: Zeile 263:
       this.name = name;       this.name = name;
    }    }
-} +}</script>
-</script>+
  
 </div> </div>
listen/trennungstrukturdaten/start.1726731932.txt.gz · Zuletzt geändert: 2024/09/19 07:45 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki