====== 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