Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m323:learningunits:lu01:aufgaben:prozedurzufunktion [2026/08/18 10:20] – Kompetenz-Tags auf neue Kompetenzmatrix ZH gesetzt adminmodul:m323:learningunits:lu01:aufgaben:prozedurzufunktion [2026/08/18 11:20] (aktuell) – Kontrollfragen werden neu im README.md abgegeben admin
Zeile 7: Zeile 7:
 ===== Ausgangslage ===== ===== Ausgangslage =====
  
-Das folgende Skript funktioniert – solange man es genau in dieser Reihenfolge aufruft. Es zeigt gleich mehrere typische Schwächen prozeduralen Codes: globalen Zustand, Berechnung und Ausgabe im selben Atemzug, und Prozeduren, die ''None'' zurückgeben.+Das Skript in ''ausgangslage.py'' funktioniert – solange man es genau in dieser Reihenfolge aufruft. Es zeigt gleich mehrere typische Schwächen prozeduralen Codes: globalen Zustand, Berechnung und Ausgabe im selben Atemzug, und Prozeduren, die ''None'' zurückgeben.
  
-<code python> +~~NOCACHE~~ 
-lager [] +=== ausgangslage.py === 
-gesamtwert 0+{{gh>https://github.com/templates-python/m323-lu01-a09-lager-funktional/blob/main/ausgangslage.py}}
  
 +===== Code-Vorlage =====
  
-def artikel_hinzufuegen(name, menge, preis): +Die Namen und Signaturen in ''main.py'' sind fix – die Tests rufen genau diese auf.
-    global gesamtwert +
-    lager.append({"name": name, "menge": menge, "preis": preis}) +
-    gesamtwert += menge * preis+
  
- +=== main.py === 
-def zeige_gesamtwert(): +{{gh>https://github.com/templates-python/m323-lu01-a09-lager-funktional/blob/main/main.py}}
-    print(f"Gesamtwert: {gesamtwert:.2f} CHF"+
- +
- +
-def zeige_teuersten(): +
-    teuerster None +
-    for artikel in lager: +
-        if teuerster is None or artikel["preis"] > teuerster["preis"]: +
-            teuerster artikel +
-    print(f"Teuerster Artikel: {teuerster['name']}"+
- +
- +
-if __name__ == '__main__': +
-    artikel_hinzufuegen('Maus', 10, 24.90) +
-    artikel_hinzufuegen('Tastatur', 4, 79.50) +
-    artikel_hinzufuegen('Monitor', 2, 249.00) +
-    zeige_gesamtwert() +
-    zeige_teuersten() +
-</code>+
  
 ===== Anforderungen ===== ===== Anforderungen =====
  
-  - **Analyse:** Halten Sie schriftlich fest, welche der drei ''def''-Blöcke Prozeduren sind und woran Sie das erkennen. +  - **Analyse:** Halten Sie fest, welche der drei ''def''-Blöcke in ''ausgangslage.py'' Prozeduren sind und woran Sie das erkennen. 
-  - **Umbau:** Schreiben Sie das Skript so um, dass gilt:+  - **Umbau:** Implementieren Sie in ''main.py'' die vier vorgegebenen Funktionen so, dass gilt:
     * Keine globalen Variablen – alle benötigten Daten kommen als Parameter herein.     * Keine globalen Variablen – alle benötigten Daten kommen als Parameter herein.
-    * Kein ''print'' innerhalb der berechnenden Funktionen. Ausgegeben wird ausschliesslich im ''main''-Block.+    * Kein ''print'' innerhalb der berechnenden Funktionen. Ausgegeben wird ausschliesslich in ''main()''.
     * Jede Funktion gibt einen Wert zurück.     * Jede Funktion gibt einen Wert zurück.
     * ''artikel_hinzufuegen'' verändert die übergebene Liste **nicht**, sondern gibt eine **neue** Liste zurück.     * ''artikel_hinzufuegen'' verändert die übergebene Liste **nicht**, sondern gibt eine **neue** Liste zurück.
-  - **Nachweis:** Zeigen Sie mit ''print''-Aufrufendass ''gesamtwert(lager)'' zweimal hintereinander aufgerufen dasselbe Ergebnis liefert und dass die ursprüngliche Liste nach ''artikel_hinzufuegen'' unverändert ist. + 
-  - **Randfall:** Überlegen Sie, was ''teuerster_artikel'' bei einem leeren Lager zurückgeben soll, und setzen Sie es um.+^ Funktion ^ Rückgabe ^ 
 +| ''artikel_hinzufuegen(lager, name, menge, preis)'' | eine **neue** Liste mit dem zusätzlichen Artikel | 
 +''gesamtwert(lager)'' | Summe aus Menge mal Preisbei leerem Lager ''0''
 +| ''teuerster_artikel(lager)'' | der Artikel mit dem höchsten Preis, bei leerem Lager ''None'' | 
 +''formatiere_gesamtwert(lager)'' | Text im Format ''Gesamtwert: 1065.00 CHF'' |
  
 ==== Beispieloutput ==== ==== Beispieloutput ====
Zeile 59: Zeile 43:
  
 ===== Kontrollfragen ===== ===== Kontrollfragen =====
 +
 +Diese drei Fragen beantworten Sie **direkt im ''README.md''** Ihres Repositories, unterhalb der jeweiligen Frage. Zwei bis vier Sätze pro Frage genügen.
  
   - Warum kann man den Ausdruck ''gesamtwert(lager)'' im Kopf jederzeit durch seine Zahl ersetzen, den Aufruf ''artikel_hinzufuegen('Maus', 10, 24.90)'' aus der Ausgangslage aber nicht? Wie heisst diese Eigenschaft?   - Warum kann man den Ausdruck ''gesamtwert(lager)'' im Kopf jederzeit durch seine Zahl ersetzen, den Aufruf ''artikel_hinzufuegen('Maus', 10, 24.90)'' aus der Ausgangslage aber nicht? Wie heisst diese Eigenschaft?
Zeile 69: Zeile 55:
 Schleifen sind in dieser Aufgabe ausdrücklich erlaubt – innerhalb einer Funktion ist eine ''for''-Schleife völlig in Ordnung. Es geht hier nicht um den schleifenfreien Stil, sondern um die Grenze zwischen **Funktion** und **Prozedur**: Liefert der Block einen Wert, oder //tut// er etwas? Schleifen sind in dieser Aufgabe ausdrücklich erlaubt – innerhalb einer Funktion ist eine ''for''-Schleife völlig in Ordnung. Es geht hier nicht um den schleifenfreien Stil, sondern um die Grenze zwischen **Funktion** und **Prozedur**: Liefert der Block einen Wert, oder //tut// er etwas?
 </WRAP> </WRAP>
 +
 +<WRAP center round important 80%>
 +**Achtung beim Linting**
 +
 +''global'' kostet in dieser Aufgabe Punkte (''W0603 global-statement'' ist bewusst aktiviert) – genau darum geht es ja.
 +</WRAP>
 +
 +===== Vorgehen =====
 +
 +  - Akzeptiere das Classroom-Assignment
 +  - Klone dein persönliches Repository in die Entwicklungsumgebung
 +  - Lies ''ausgangslage.py''
 +  - Implementiere die vier Funktionen in ''main.py''
 +  - Beantworte die drei Kontrollfragen 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 |
 +| Kontrollfragen (von Hand bewertet) | 4 |
 +| **Total** | **20** |
  
 ===== Abgabe ===== ===== Abgabe =====
  
-Geben Sie die Python-Datei und die beantworteten Kontrollfragen in Moodle ab.+Alles zusammen als Push in das persönliche GitHub-Repository: der Code in ''main.py'' und die Antworten auf die Kontrollfragen im ''README.md''. Es gibt keine separate Moodle-Abgabe.
  
 ---- ----
-{{tag>M323-LU01 M323-A1B M323-A1I}}+<details> 
 +<summary>//=> GitHub Repo für externe Besucher//</summary> 
 +GitHub Repository https://github.com/templates-python/m323-lu01-a09-lager-funktional 
 + 
 +//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/prozedurzufunktion.1787041223.txt.gz
  • Zuletzt geändert: 2026/08/18 10:20
  • von admin