====== LU01.A11 - Spaghetticode entwirren ======
Bringen Sie eine unübersichtliche Funktion auf die drei Grundstrukturen der strukturierten Programmierung zurück – Sequenz, Selektion und Iteration – ohne ihr Verhalten zu verändern.
===== Ausgangslage =====
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.
Diese Datei ist der Massstab: Ihre Fassung muss für jede Eingabe exakt dasselbe liefern. **Verändern dürfen Sie sie nicht.**
~~NOCACHE~~
=== referenz.py ===
{{gh>https://github.com/templates-python/m323-lu01-a11-umsatz-refactoring/blob/main/referenz.py}}
===== Code-Vorlage =====
Die Namen und Signaturen in ''main.py'' sind fix – die Tests rufen genau diese auf.
=== main.py ===
{{gh>https://github.com/templates-python/m323-lu01-a11-umsatz-refactoring/blob/main/main.py}}
===== Anforderungen =====
Implementieren Sie in ''main.py'' die beiden vorgegebenen Funktionen. Vorgaben:
* Die Schleife läuft direkt über die Elemente (''for bestellung in bestellungen''), ohne Index und ohne Abbruchflagge.
* Kein ''continue'', kein ''break'', kein ''while''.
* Höchstens **eine** Verschachtelungsebene innerhalb der Schleife.
* Die Bedingung, ob eine Bestellung überhaupt zählt, steckt in ''ist_verrechenbar'' und gibt ''True'' oder ''False'' zurück.
^ 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 Bestellungen, bei leerer Liste ''0'' |
==== Beispieloutput ====
Umsatz neu: 362.70
===== Schriftlicher Teil =====
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.
- **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.
**Wichtig**
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.
===== 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 =====
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.
----
//=> GitHub Repo für externe Besucher//
GitHub Repository https://github.com/templates-python/m323-lu01-a11-umsatz-refactoring
//Lernende am BZZ müssen den Link zum Classroom-Assignment verwenden//
[[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