Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m323:learningunits:lu01:aufgaben:spaghetticode [2026/08/18 10:10] – Neue Aufgabe LU01.A11 - Spaghetticode entwirren adminmodul:m323:learningunits:lu01:aufgaben:spaghetticode [2026/08/18 11:20] (aktuell) – Schriftlicher Teil wird neu im README.md abgegeben admin
Zeile 7: Zeile 7:
 ===== Ausgangslage ===== ===== Ausgangslage =====
  
-Die folgende Funktion berechnet den Umsatz aus einer Liste von Bestellungen. Sie ist korrekt, aber niemand liest sie gern: eine ''while''-Schleife mit Abbruchflagge, ein von Hand hochgezählter Index, ''continue''-Sprünge und drei Verschachtelungsebenen.+Die Funktion ''umsatz_alt'' in ''referenz.py'' berechnet den Umsatz aus einer Liste von Bestellungen. Sie ist korrekt, aber niemand liest sie gern: eine ''while''-Schleife mit Abbruchflagge, ein von Hand hochgezählter Index, ''continue''-Sprünge und drei Verschachtelungsebenen.
  
-<code python> +Diese Datei ist der MassstabIhre Fassung muss für jede Eingabe exakt dasselbe liefern. **Verändern dürfen Sie sie nicht.**
-def umsatz(bestellungen): +
-    i = 0 +
-    fertig = False +
-    total = 0 +
-    while not fertig: +
-        if i >= len(bestellungen): +
-            fertig = True +
-        else: +
-            b = bestellungen[i] +
-            if b["status"] == "storniert": +
-                i = i + 1 +
-                continue +
-            else: +
-                if b["menge"] <= 0: +
-                    i = i + 1 +
-                    continue +
-                else: +
-                    total = total + b["menge"b["preis"+
-                    i = i + 1 +
-    return total +
-</code>+
  
-==== Testdaten ====+~~NOCACHE~~ 
 +=== referenz.py === 
 +{{gh>https://github.com/templates-python/m323-lu01-a11-umsatz-refactoring/blob/main/referenz.py}}
  
-<code python> +===== Code-Vorlage ===== 
-bestellungen [ + 
-    {"artikel": "Maus",     "status": "offen",     "menge": 3,  "preis": 24.90}, +Die Namen und Signaturen in ''main.py'' sind fix – die Tests rufen genau diese auf
-    {"artikel": "Tastatur", "status": "storniert", "menge": 2,  "preis": 79.50}, + 
-    {"artikel": "Monitor",  "status": "offen",     "menge": 0,  "preis": 249.00}, +=== main.py === 
-    {"artikel": "Kabel",    "status": "geliefert", "menge": 10, "preis": 9.90}, +{{gh>https://github.com/templates-python/m323-lu01-a11-umsatz-refactoring/blob/main/main.py}}
-    {"artikel""Dock",     "status": "offen",     "menge": 1,  "preis": 189.00}, +
-+
-</code>+
  
 ===== Anforderungen ===== ===== Anforderungen =====
  
-  - **Analysieren:** Markieren Sie im Ausgangscode, wo Sequenz, Selektion und Iteration vorkommenWelche Stellen entsprechen keiner der drei Grundstrukturen, sondern imitieren einen Sprung? +Implementieren Sie in ''main.py'' die beiden vorgegebenen Funktionen. Vorgaben: 
-  - **Umbauen:** Schreiben Sie die Funktion neu. Vorgaben: + 
-    * Die Schleife läuft direkt über die Elemente (''for bestellung in bestellungen''), ohne Index und ohne Abbruchflagge. +  * Die Schleife läuft direkt über die Elemente (''for bestellung in bestellungen''), ohne Index und ohne Abbruchflagge. 
-    * Kein ''continue'', kein ''break''+  * Kein ''continue'', kein ''break'', kein ''while''
-    * Höchstens **eine** Verschachtelungsebene innerhalb der Schleife. +  * Höchstens **eine** Verschachtelungsebene innerhalb der Schleife. 
-    * Die Bedingung, ob eine Bestellung überhaupt zählt, steckt in einer eigenen, sprechend benannten Funktion, die ''True'' oder ''False'' zurückgibt+  * Die Bedingung, ob eine Bestellung überhaupt zählt, steckt in ''ist_verrechenbar'' und gibt ''True'' oder ''False'' zurück
-  - **Beweisen:** Rufen Sie alte und neue Fassung mit denselben Testdaten auf und zeigen Sie mit einem ''assert'', dass beide dasselbe Ergebnis liefern. Prüfen Sie zusätzlich die leere Liste. + 
-  - **Begründen:** Halten Sie in zwei bis drei Sätzen festwelche Fehlerquellen im Ausgangscode durch den Umbau verschwunden sind.+^ Funktion ^ Rückgabe ^ 
 +''ist_verrechenbar(bestellung)'' | ''True'', wenn die Bestellung nicht storniert ist **und** die Menge grösser als 0 ist | 
 +| ''umsatz(bestellungen)'' | Summe aus Menge mal Preis über alle verrechenbaren Bestellungenbei leerer Liste ''0'' |
  
 ==== Beispieloutput ==== ==== Beispieloutput ====
  
 <code> <code>
-Umsatz alt: 362.70 
 Umsatz neu: 362.70 Umsatz neu: 362.70
-Beide Fassungen liefern dasselbe Ergebnis. 
 </code> </code>
  
-===== Zusatzfragen =====+===== Schriftlicher Teil =====
  
-  - Der Ausgangscode zählt ''i'' an drei verschiedenen Stellen hoch. Was passiert, wenn man eine dieser Stellen vergisst? Probieren Sie es aus. +Diese fünf Punkte beantworten Sie **direkt im ''README.md''** Ihres Repositories, unterhalb der jeweiligen Frage. Zwei bis vier Sätze pro Punkt genügen. 
-  - Das Theorem von Böhm und Jacopini besagt, dass jeder Algorithmus mit den drei Grundstrukturen auskommt. Wie stützt Ihr Umbau diese Aussage? + 
-  - **Für Schnelle:** Formulieren Sie die Anforderung an ''umsatz'' deklarativ – als Satz über das Ergebnis, ohne Schleife und Zwischensumme.+  **Grundstrukturen:** Wo kommen in ''umsatz_alt'' Sequenz, Selektion und Iteration vor? Welche Stellen entsprechen keiner der drei Grundstrukturen, sondern imitieren einen Sprung? 
 +  - **Was der Umbau beseitigt:** Welche Fehlerquellen im Ausgangscode sind durch Ihren Umbau verschwunden? 
 +  - **Vergessenes Hochzählen:** Der Ausgangscode zählt ''i'' an drei verschiedenen Stellen hoch. Was passiert, wenn man eine davon vergisst? Probieren Sie es in einer Kopie aus. 
 +  - **Böhm und Jacopini:** Das Theorem besagt, dass jeder Algorithmus mit den drei Grundstrukturen auskommt. Wie stützt Ihr Umbau diese Aussage? 
 +  - **Deklarativ formuliert (für Schnelle):** Formulieren Sie die Anforderung an ''umsatz'' als Satz über das Ergebnis, ohne Schleife und Zwischensumme.
  
 <WRAP center round important 80%> <WRAP center round important 80%>
 **Wichtig** **Wichtig**
  
-Das Verhalten der Funktion darf sich nicht ändern – auch nicht in Randfällen. Prüfen Sie mindestens: leere Liste, alle Bestellungen storniert, Menge 0, Menge negativ.+Das Verhalten der Funktion darf sich nicht ändern – auch nicht in Randfällen. Geprüft werden: leere Liste, alle Bestellungen storniert, Menge 0, Menge negativ. Zwei weitere Tests lesen ''main.py'' als Syntaxbaum ein und prüfen, dass eine ''for''-Schleife vorhanden ist und weder ''while'' noch ''continue'' oder ''break'' vorkommen.
 </WRAP> </WRAP>
 +
 +===== Vorgehen =====
 +
 +  - Akzeptiere das Classroom-Assignment
 +  - Klone dein persönliches Repository in die Entwicklungsumgebung
 +  - Analysiere ''referenz.py''
 +  - Implementiere ''ist_verrechenbar'' und ''umsatz'' in ''main.py''
 +  - Beantworte die fünf Punkte im ''README.md''
 +  - Lokal prüfen mit ''pytest'' und ''python _run_pylint.py''
 +  - Pushen – Code und Antworten liegen damit im selben Commit
 +
 +===== Bewertung =====
 +
 +^ Teil ^ Punkte ^
 +| Unittests | 11 |
 +| Linting | 5 |
 +| Schriftlicher Teil (von Hand bewertet) | 6 |
 +| **Total** | **22** |
  
 ===== Abgabe ===== ===== Abgabe =====
  
-Geben Sie die Python-Datei mit beiden Fassungen und den Tests sowie Ihre schriftliche Begründung in Moodle ab.+Alles zusammen als Push in das persönliche GitHub-Repository: der Code in ''main.py'' und die Antworten im ''README.md''. Es gibt keine separate Moodle-Abgabe.
  
 ---- ----
 +<details>
 +<summary>//=> GitHub Repo für externe Besucher//</summary>
 +GitHub Repository https://github.com/templates-python/m323-lu01-a11-umsatz-refactoring
 +
 +//Lernende am BZZ müssen den Link zum Classroom-Assignment verwenden//
 +
 +</details>
 [[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi [[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi
  
  • modul/m323/learningunits/lu01/aufgaben/spaghetticode.1787040603.txt.gz
  • Zuletzt geändert: 2026/08/18 10:10
  • von admin