Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m320_2024:learningunits:lu09:aufgaben:schulverwaltung [2024/09/10 15:16] – angelegt msutermodul:m320_2024:learningunits:lu09:aufgaben:schulverwaltung [2024/09/26 10:04] (aktuell) msuter
Zeile 1: Zeile 1:
 ====== LU09.A01 - Schulverwaltung ====== ====== LU09.A01 - Schulverwaltung ======
 +<nodisp>TODO: ''show_report'' in ''Student'' entfernen. Die Methode macht das gleiche wie das ''property''</nodisp>
 +<WRAP center round todo 60%>
  
-=== Ziel === 
 Sie können in einer komplexen Anwendung selbständig  Sie können in einer komplexen Anwendung selbständig 
    * die Klassen erstellen    * die Klassen erstellen
Zeile 7: Zeile 8:
    * den nötigen Ablauf selbst festlegen    * den nötigen Ablauf selbst festlegen
    * die gefordeten Ausgaben erzeugen    * die gefordeten Ausgaben erzeugen
 +
 +</WRAP>
  
 === Vorgehen === === Vorgehen ===
-   * Studieren Sie jeweils das UML-Diagramm sowie die Anweisungen im Code der zu bearbeitenden Klasse.+   * Studieren Sie jeweils das UML-Diagramm sowie die Erklärungen zu den einzelnen Methoden.
    * Halten Sie sich an die Reihenfolge bei der Erstellung der Klassen.    * Halten Sie sich an die Reihenfolge bei der Erstellung der Klassen.
    * Testen Sie die jeweilige Klasse, bis alle Test erfolgreich ablaufen.    * Testen Sie die jeweilige Klasse, bis alle Test erfolgreich ablaufen.
Zeile 16: Zeile 19:
 Es ist eine einfache Schulverwaltung gemäss folgendem Klassendiagramm zu implementieren.\\ Es ist eine einfache Schulverwaltung gemäss folgendem Klassendiagramm zu implementieren.\\
  
-^ Version für IMS  ^  Version für API  ^ +{{:modul:m320_2024:learningunits:lu09:aufgaben:klasseschule.png?600|}}
-{{:modul:m320:learningunits:lu05:aufgaben:lu03-aufg8-schulverwaltung-1.png?600|}}  | {{:modul:m320:learningunits:lu05:aufgaben:lu05-aufg3-schulverwaltung-1b.png?600|}}  |+
  
 Dabei nutzen Sie Ihr Wissen zu ein- und zweiseitiger Beziehung sowie den 4 gezeigten Fällen der Referenzzuweisung. Ebenso verwenden Sie Mehrfachbeziehungen. Dabei nutzen Sie Ihr Wissen zu ein- und zweiseitiger Beziehung sowie den 4 gezeigten Fällen der Referenzzuweisung. Ebenso verwenden Sie Mehrfachbeziehungen.
  
-=== Ablauf=== +{{https://ritholtz.com/wp-content/uploads/2020/03/dontpanic.jpg?300|}}
-   - Akzeptieren Sie das Assignment in GitHub Classroom und klonen Sie das Repository. \\ \\ +
-   - Erstellen Sie die Klasse ''Grade'' als ''@dataclass''. \\ // Hinweise\\ · Achten Sie auf die Zusicherung für den Wert von ''value''. Diese nehmen Sie im Konstruktor vor, d.h. dass Sie keine setter-Methode schreiben (ist gemäss Klassendiagramm nicht vorgesehen). \\ · Initialisieren Sie die Werte ''value'' und ''date'' gemäss Klassendiagramm. // \\ \\ +
-   - Testen Sie die Klasse ''Grade''. (test_grade.py) \\  \\ +
-   - Implementieren Sie die Klasse ''Subject''\\ //Hinweise: \\ · Beachten Sie, dass gemäss Klassendiagramm max. 4 Noten möglich sind. Das müssen Sie beim Zufügen von Noten (''Grade''-Objekte) umsetzen. \\ · Die untere Grenze von 2 Noten müssen Sie (noch) nicht beachten. \\ · Die Schreibweise ''grades[] : Grade'' im Klassendiagramm deutet auf die Nutzung eines Array hin. \\ · Bei den beiden get-Methoden //(IMS)// bzwtake-Methoden //(API)// muss sichergestellt sein, dass ein ungültiger Index zu keinem Laufzeitfehler führt. Für die Note (''get_value(idx)'' bzw. ''take_value(idx)'') soll im Fehlerfall der Wert 0 zurückgegeben werden. Beim Datum (''get_date(idx)'' bzw. ''take_date(idx)'') wird ''None'' geliefert. \\ · Die Methode ''get_average'' liefert bei fehlendem Noteneintrag (size = 0) den Wert 0 zurück. Dieser Test ist zwingend nötig, da sonst eine Division durch 0 zu einem Laufzeitfehler führt.// \\ \\ +
-   - Testen Sie die Klasse ''Subject''. (test_subject.py) \\ \\ +
-   - Implementieren Sie die Klasse ''ClassReport''. \\ // Hinweise: \\ · Lassen Sie die Methoden ''set_student'' und ''get_student'' vorerst weg. Um diese Methode zu testen, benötigen Sie zuerst ein Student-Objekt. Die entsprechende Klasse ''Student'' existiert aber noch nicht.\\ · Beachten Sie, dass gemäss Klassendiagramm max. 3 Fächer möglich sind. Das müssen Sie beim Zufügen umsetzen \\ · Stellen Sie immer sicher, dass geprüft wird, ob Subject-Objekte verfügbar sind. Ansonsten geben Sie den Wert ''None'' zurück. \\ · Die Methode ''to_string()'' liefert ein Zeugnis mit allen Fächern und dem entsprechenden Notenschnitt. Eine mögliche Ausgabe kann wie folgt aussehen: \\ {{:modul:m320:learningunits:lu05:aufgaben:lu03_5_-aufg3_biblio-10.png?150|}} \\ · Die Methode ''print_details()'' liefert alle Fächern mit den einzelnen Noten. Eine mögliche Ausgabe kann wie folgt aussehen: \\ {{:modul:m320:learningunits:lu05:aufgaben:lu03_5_-aufg3_biblio-11.png?225|}} // \\ \\ +
-   - Testen Sie die Klasse ''ClassReport''. (test_classreport.py) \\ \\ +
-   - Erstellen Sie eine ''main''-Methode in ''classreport.py'' und geben Sie die ''to_string''-Methode sowie ''print_details'' auf dem Bildschirm aus. \\ Die Ausgabe soll den oben gezeigten Screens entsprechen. \\ Überlegen Sie sich, welche Objekte Sie benötigen und in welcher Reihenfolge diese zu erzeugen sind, damit die Ausagbe auf den Bildschirm erfolgreich ist. \\ \\ +
-   - Implementieren Sie die Klasse ''Student''. Jetzt ist der Moment gekommen, um in der Klasse ''ClassReport'' die ''set_student'' und ''get_student''-Methode zu ergänzen. (mit der Annotation ''@property'' bzw. ''@student.setter'') \\ // Hinweise: \\ · Im Konstruktor wird die (eigene) Referenz dem ''ClassReport''-Objekt mitgeteilt. \\ · Die set-/get-Methoden implementieren Sie auch hier mit den oben erwähnten Annotationen. // \\ \\ +
-   - Testen Sie die Klasse ''Student''. (test_student.py) \\ \\ +
-   - Erstellen Sie eine ''main''-Methode in ''student.py'' und führen Sie die ''to_string''-Methode des ''ClassReport''-Objektes aus. Dazu müssen natürlich auch 3 Subject-Objekte und dazu ein paar Grade-Objekte erzeugt werden. Ebenso ein Student-Objekt, das den print dann auslöst. \\ \\ +
-   - Implementieren Sie die Klasse ''SchoolClass''. \\ // Hinweise: \\ · Stellen Sie sicher, dass maximal 20 Student-Objekte zugefügt werden können. // \\ \\ +
-   - Testen Sie die Klasse ''SchoolClass''. (test_school_class.py) \\ \\ +
-   - Erstellen Sie nun die ''main''-Methode inder Datei ''main.py''.\\ // Hinweise : \\ · Erzeugen Sie die Objekte in der Reihenfolge, wie sie auch für die Zuweisung in den Konstruktoren nötig sind. Wenn Sie unsicher sind, skizzieren Sie sich den Ablauf des Programms als Sequenzdiagramm auf. \\ · Erzeugen Sie 3 Student-Objekte. Jedes Student-Objekt verweist auf einen Report mit den Fächern (Subject) und den Noten (Grade).//+
  
-=== Ausgabe=== +===== Vorgehen ===== 
-Das Programm liefert  +Die Beschreibung der Klassen und Methoden erfolgt von links nach rechts und von oben nach unten. 
-   * eine Liste der Studenten +Erstellen Sie selbständig einen Plan, in welcher Reihenfolge Sie die Klassen erstellt wollen. 
-   pro Student das Zeugnis (Report) mit dem Notenschnitt +Ein paar Tipps: 
-   für einen Studenten alle Einzelnoten. Sie können hier frei wählenfür wen die Noten ausgegeben werden. +  * Es lohnt sich zunächst das Gerüst einer Klasse mit allen Methoden zu bauen. 
-Die Ausgabe soll in etwa wie folgt aussehen:\\ +  * Klassen die keine Referenzen zu anderen Klassen enthalten, sollten zuerst umgesetzt werden.  
-{{:modul:m320:learningunits:lu05:aufgaben:lu03-aufg8-schulverwaltung-2.png?200|}}+  * Versuche danach Klassen umzusetzen, bei denen die referenzierte Klasse bereits erstellt ist. 
 +  * Der Konstruktor einer Klasse sollte in der Regel zuerst erstellt werden. 
 +  * Danach folgen Methoden ohne Logik, z.B. ''property'' und ''setter''
 +  * Bei Methoden die eine Verarbeitungslogik enthalten, wird zunächst einfach ein hart codierter Returnwert zurück gegeben. 
 +  
 +==== Hinweise ==== 
 +  * Testen Sie jede Klasse/Methode mit den jeweiligen Unit Tests. Führen Sie die Tests einzeln aus, da vor allem zu Beginn sehr viele Tests scheitern werden. 
 +  * Die Methoden ''show_...'' liefern immer einen String als Returnwert. Der ''print''-Befehl wird nur im ''main()'' genutzt. 
 + 
 +==== SchoolClass ==== 
 +=== Konstruktor === 
 +  * Die Schreibweise ''students[] : Student'' im Klassendiagramm zeigt an, dass es sich um eine Liste (Array) handelt. \\ Initialisieren Sie das Attribut als leere Liste. 
 + 
 +=== add_student === 
 +  * Fügt einen Studenten in die Liste ein. 
 +  * Beachten Sie, dass gemäss Klassendiagramm max. 20 Studenten möglich sind. Das müssen Sie beim Zufügen von Studenten umsetzen.  
 +  Beim Versuch mehr als 20 Studenten einzufügen, soll die Methode einen ''OverflowError'' werfen. 
 + 
 +=== count_students === 
 +  * Gibt die Anzahl Studenten zurück. 
 + 
 +=== take_student(index) === 
 +  * Liefert den Studenten beim angegebenen Index. 
 +  * Bei einem ungültigen Index soll ein ''IndexError'' ausgelöst werden. 
 + 
 +=== show_student_list === 
 +  * Diese Methode liefert eine Liste aller Studenten. Die Ausgabe könnte wie folgt aussehen: 
 + 
 +<code> 
 +Max 
 +Pia 
 +Cem 
 +</code> 
 + 
 +=== show_student_report(name) === 
 +  Diese Methode liefert das Zeugnis für einen Studenten mit allen Fächern und dem Notenschnitt. Die Ausgabe könnte wie folgt aussehen: 
 + 
 +<code> 
 +Zeugnis für: Cem 
 +   Mathe     :  4.25 
 +   Deutsch   :  5.50 
 +   Turnen    :  5.50 
 +</code> 
 + 
 +<WRAP center round tip 60%> 
 +Die Methode erzeugt selber keine Liste, sie ruft lediglich eine Methode in einem anderen Objekt auf. 
 +</WRAP> 
 + 
 +==== Student ==== 
 +=== Konstruktor === 
 +  * Beachten Sie die Parameter und Defaultwerte. 
 +=== show_report === 
 +Gibt die Referenz auf das ''report''-Objekt aus dem Attribut zurück. 
 + 
 +==== StudentReport ==== 
 + 
 +=== Konstruktor === 
 +  * Die Schreibweise ''subjects[] : Subject'' im Klassendiagramm zeigt an, dass es sich um eine Liste (Arrayhandelt. \\ Initialisieren Sie das Attribut als leere Liste. 
 + 
 +=== add_subject === 
 +  * Beachten Sie, dass gemäss Klassendiagramm max. 3 Fächer möglich sind. 
 +  * Beim Versuch mehr als 3 Fächer (''Subject'') einzufügen, soll die Methode einen ''OverflowError'' werfen. 
 + 
 +=== take_subject === 
 +  * Liefert das Fach (''Subject'') beim angegebenen Index. 
 +  * Bei einem ungültigen Index soll ein ''IndexError'' ausgelöst werden. 
 + 
 +=== show_overview === 
 +  * Diese Methode liefert ein Zeugnis mit allen Fächern und dem entsprechenden Notenschnitt. Eine mögliche Ausgabe kann wie folgt aussehen: 
 + 
 +<code> 
 +Zeugnis für: Cem 
 +   Mathe     :  4.25 
 +   Deutsch   :  5.50 
 +   Turnen    :  5.50 
 +</code> 
 + 
 +=== show_details === 
 +  Diese Methode liefert alle Fächern mit den einzelnen NotenEine mögliche Ausgabe kann wie folgt aussehen: 
 +  
 +<code> 
 +Fach: Mathe      mit 2 Noten 
 + - 1: 5.00 am 01.01.2011 
 + - 2: 3.50 am 02.02.2022 
 + Schnitt: 4.25 
 +Fach: Deutsch    mit 3 Noten 
 + - 1: 5.50 am 03.03.2033 
 + - 2: 6.00 am 04.04.2044 
 + - 3: 5.00 am 05.05.2055 
 + Schnitt: 5.50 
 +</code> 
 + 
 + 
 +==== Subject ==== 
 +=== Konstruktor === 
 +Die Schreibweise ''grades[] : Grade'' im Klassendiagramm zeigt an, dass es sich um eine Liste (Array) handelt. 
 +Initialisieren Sie das Attribut als leere Liste. 
 + 
 +=== add_grade === 
 +  * Beachten Sie, dass gemäss Klassendiagramm max. 4 Noten möglich sind. Das müssen Sie beim Zufügen von Noten (''Grade''-Objekte) umsetzen.  
 +  * Beim Versuch mehr als 4 Noten einzufügen, soll die Methode einen ''OverflowError'' werfen. 
 +  * Die untere Grenze von 2 Noten müssen Sie (noch) nicht beachten. 
 + 
 +=== take_grade === 
 +  * Liefert die Note (''Grade'') beim angegebenen Index. 
 +  * Bei einem ungültigen Index soll ein ''IndexError'' ausgelöst werden. 
 + 
 +=== count_grades === 
 +  * Gibt die Anzahl Noten (''Grade'') zurück. 
 + 
 +=== average === 
 +  * Die Methode berechnet den Notendurchschnitt aus allen ''Grade''-Objekten in der Liste. 
 +  * Falls keine ''Grade''-Objekte in der Liste vorhanden sind, wird der Wert ''0.00'' zurück gegeben. 
 + 
 +=== Unit tests === 
 +  * Testen Sie die Klasse ''Subject'' mit den Testfällen in ''test_subject.py'' 
 + 
 + 
 +==== Grade ==== 
 +Die Klasse ''Grade'' wird als ''@dataclass'' realisiert. 
 + 
 +=== Konstruktor === 
 +  * Initialisieren Sie die Werte ''value'' und ''date'' gemäss Klassendiagramm. 
 +  * Achten Sie auf die Zusicherung für den Wert von ''value''. Diese nehmen Sie im ''__post_init__'' vor. \\ Falls der Wert ungültig ist (keine Zahl, zu gross, zu klein) lösen Sie einen ''ValueError'' aus. 
 + 
 +=== date.setter === 
 +<WRAP center round tip 60%> 
 +Diese Methode ist bereits vorgegeben. 
 +</WRAP> 
 + 
 +  * Diese Methode schreibt das Attribut ''self._date''
 +  * Je nach Art des Inputs wird dieser unterschiedlich verarbeitet: 
 +    * ''DateTime'' => direkt speichern 
 +    * ''String'' => Umwandeln in ''DateTime'' 
 +    * Alles andere => Der aktuelle Zeitstempel wird gespeichert. 
 + 
 + 
 +==== main ==== 
 +In der ''main''-Methode erzeugen Sie die verschiedenen Objekte und zeigen die Zeugnisse an. 
 + 
 +=== Ausgabe === 
 + 
 +<code> 
 +Moritz 
 +Pia 
 +Cem 
 + 
 +---- 
 +Zeugnis fürMoritz 
 +   Mathe      4.25 
 +   Deutsch    5.00 
 +   Turnen     5.00 
 +---- 
 +Zeugnis fürPia 
 +   Mathe     :  5.50 
 +   Deutsch   :  5.33 
 +   Turnen    :  5.25 
 +---
 +Zeugnis für: Cem 
 +   Mathe     :  4.25 
 +   Deutsch   :  5.50 
 +   Turnen    :  5.50 
 +---- 
 +Student Theo nicht gefunden 
 +Fach: Mathe      mit Noten 
 + - 1: 5.00 am 01.01.2011 
 + - 2: 3.50 am 02.02.2022 
 + Schnitt: 4.25 
 +Fach: Deutsch    mit 3 Noten 
 + - 1: 5.50 am 03.03.2033 
 + - 2: 6.00 am 04.04.2044 
 + - 3: 5.00 am 05.05.2055 
 + Schnitt: 5.50 
 +Fach: Turnen     mit 4 Noten 
 + - 1: 4.50 am 06.06.2066 
 + - 2: 6.00 am 07.07.1977 
 + - 3: 6.00 am 08.08.1988 
 + - 4: 5.50 am 09.09.1999 
 + Schnitt: 5.50 
 +</code>
  
-===Dauer===+=== Dauer ===
 4 - 6 Stunden 4 - 6 Stunden
  
Zeile 54: Zeile 221:
 <details> <details>
 <summary>//=> GitHub Repo für externe Besucher//</summary> <summary>//=> GitHub Repo für externe Besucher//</summary>
-GitHub Repository https://github.com/templates-python/m319-lu10-a02-reader-module+GitHub Repository https://github.com/templates-python/m320-lu09-a01-school
  
 //Lernende am BZZ müssen den Link zum GitHub Classroom Assignment verwenden// //Lernende am BZZ müssen den Link zum GitHub Classroom Assignment verwenden//
  • modul/m320_2024/learningunits/lu09/aufgaben/schulverwaltung.1725974193.txt.gz
  • Zuletzt geändert: 2024/09/10 15:16
  • von msuter