{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ede7b761",
   "metadata": {},
   "source": [
    "<div style=\"float: right;\"><img src=\"https://datascience.hs-bochum.de/images/hs-bo_logo.svg\" style=\"height:40px;\"></div>\n",
    "<div style=\"clear: both;\"></div>\n",
    "<div style='text-align: center; margin-top: 40px; margin-bottom:40px;'>\n",
    "<h1>Lernwerkstatt Wirtschaftsinformatik</h1>\n",
    "<h2>Übung 3</h2>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "665792bc",
   "metadata": {},
   "source": [
    "In diesem Notebook vertiefen Sie **eigene Funktionen**: mit `def` definieren, mit\n",
    "**Parametern** füttern, mit `return` ein Ergebnis zurückgeben --- und Funktionen miteinander\n",
    "kombinieren. Alles wieder an Aufgaben aus dem Alltag von Brick-Flow.\n",
    "\n",
    "Wie gewohnt: Arbeiten Sie die Zellen **von oben nach unten** durch und führen Sie eine Zelle mit\n",
    "**`Shift`+`Enter`** aus. Los geht es mit einer kurzen Wiederholung."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "418de358",
   "metadata": {},
   "source": [
    "## Wiederholung — Notebook bedienen\n",
    "\n",
    "Zur Erinnerung: Code-Zellen (grau) führen Sie mit **`Shift`+`Enter`** aus; das Ergebnis erscheint\n",
    "direkt darunter. Wichtig bei Funktionen: Eine Zelle mit `def` muss **ausgeführt** werden, bevor\n",
    "Sie die Funktion in einer späteren Zelle benutzen können. Führen Sie zum Warmwerden die Zelle aus:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ddba08e5",
   "metadata": {},
   "outputs": [],
   "source": [
    "bestellwert = 42\n",
    "if bestellwert >= 50:\n",
    "    print(\"Versand frei\")\n",
    "else:\n",
    "    print(\"Versand 4.95 Euro\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23b8f086",
   "metadata": {},
   "source": [
    "Hat geklappt? Dann ändern Sie `bestellwert` auf `50` und führen die Zelle noch einmal aus."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0bb732c5",
   "metadata": {},
   "source": [
    "## Teil 1 — Eigene Funktionen mit `def` und `return`\n",
    "\n",
    "Eine Funktion fasst eine Rechnung unter einem **Namen** zusammen. Sie bekommt Werte\n",
    "(**Parameter**) und gibt mit `return` ein **Ergebnis** zurück. Führen Sie die Zelle aus:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b4d0ba8b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def brutto(netto):\n",
    "    return netto + netto * 0.19\n",
    "\n",
    "preis = brutto(80)\n",
    "print(preis)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f65cdd9",
   "metadata": {},
   "source": [
    "**Zum Ausprobieren:** Was liefert `brutto(200)`? Berechnen Sie mit *zwei* Aufrufen den\n",
    "Bruttobetrag einer Rechnung über 80 € und 20 € netto."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ee53a1c2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Ihr Code:\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1267d6cf",
   "metadata": {},
   "source": [
    "## Aufgabe 1 — Rechnungsbetrag als Funktion\n",
    "\n",
    "Brick-Flow berechnet Rechnungen immer gleich: **Anzahl mal Einzelpreis**. Ergänzen Sie den\n",
    "Rumpf der Funktion (eine Zeile mit `return`) und prüfen Sie die beiden Aufrufe.\n",
    "Erwartet werden `960` und `240`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6e94ab30",
   "metadata": {},
   "outputs": [],
   "source": [
    "def rechnungsbetrag(anzahl, einzelpreis):\n",
    "    # Ergaenzen Sie: Ergebnis berechnen und zurueckgeben\n",
    "\n",
    "\n",
    "print(rechnungsbetrag(12, 80))\n",
    "print(rechnungsbetrag(3, 80))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e61b64a1",
   "metadata": {},
   "source": [
    "## Aufgabe 2 — Mengenrabatt: Funktion mit Entscheidung\n",
    "\n",
    "**Ab 10 Paletten** gibt es 5 % Rabatt (wie in Übung 2). Die Funktion `endbetrag` benutzt die\n",
    "Funktion `rechnungsbetrag` aus Aufgabe 1 — eine Funktion darf also eine andere aufrufen.\n",
    "Ergänzen Sie den `if`/`else`-Block mit je einem `return`. Was geben die beiden Aufrufe aus?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1c0aca66",
   "metadata": {},
   "outputs": [],
   "source": [
    "def endbetrag(anzahl, einzelpreis):\n",
    "    summe = rechnungsbetrag(anzahl, einzelpreis)\n",
    "    # ab 10 Paletten -> summe * 0.95 zurueckgeben,\n",
    "    # sonst -> summe zurueckgeben\n",
    "    # if ... :\n",
    "    #     return ...\n",
    "    # else:\n",
    "    #     return ...\n",
    "\n",
    "print(endbetrag(12, 80))\n",
    "print(endbetrag(8, 80))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "180c775d",
   "metadata": {},
   "source": [
    "## Aufgabe 3 — Versandkosten mit Standardwert\n",
    "\n",
    "Normalerweise ist der Versand **ab 50 €** frei, sonst kostet er **4,95 €**. Premiumkunden\n",
    "bekommen eine niedrigere Grenze. Ein Parameter mit **Standardwert** (`grenze=50`) muss beim\n",
    "Aufruf nur angegeben werden, wenn er abweicht.\n",
    "\n",
    "Ergänzen Sie die Funktion. Überlegen Sie *vor* dem Ausführen, welche Werte herauskommen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b44aefae",
   "metadata": {},
   "outputs": [],
   "source": [
    "def versandkosten(bestellwert, grenze=50):\n",
    "    # Ergaenzen Sie: 0.0 ab der Grenze, sonst 4.95\n",
    "    # if ... :\n",
    "    #     return ...\n",
    "    # else:\n",
    "    #     return ...\n",
    "\n",
    "print(versandkosten(42))         # Normalkunde\n",
    "print(versandkosten(42, 40))     # Premiumkunde, Grenze 40"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b4fb6771",
   "metadata": {},
   "source": [
    "## Aufgabe 4 — Vorsicht: `print` ist nicht `return`\n",
    "\n",
    "Ein Kollege hat eine Rabattfunktion geschrieben (10 % Rabatt). Danach soll eine\n",
    "Versandpauschale von **50 €** aufgeschlagen werden. Führen Sie die Zelle aus — sie schlägt\n",
    "**mit Absicht** fehl. Achten Sie darauf, was *vor* der Fehlermeldung erscheint, und lesen Sie\n",
    "die **letzte Zeile** der Fehlermeldung."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bfb931ac",
   "metadata": {},
   "outputs": [],
   "source": [
    "def preis_mit_rabatt(preis):\n",
    "    print(preis * 0.9)\n",
    "\n",
    "endpreis = preis_mit_rabatt(2000) + 50\n",
    "print(endpreis)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2516dfdd",
   "metadata": {},
   "source": [
    "Oben steht ein `TypeError` mit dem Wort `NoneType`. Übersetzt: Die Funktion hat den Preis\n",
    "nur **angezeigt** (`print`), aber nichts **zurückgegeben**. Ohne `return` liefert eine Funktion\n",
    "`None` — „nichts“ — und zu nichts kann man keine 50 addieren.\n",
    "\n",
    "**Ihre Aufgabe:** Ändern Sie unten *ein Wort*, sodass `1850.0` herauskommt."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a2b22a76",
   "metadata": {},
   "outputs": [],
   "source": [
    "def preis_mit_rabatt(preis):\n",
    "    print(preis * 0.9)      # <- hier ein Wort aendern\n",
    "\n",
    "endpreis = preis_mit_rabatt(2000) + 50\n",
    "print(endpreis)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a507902",
   "metadata": {},
   "source": [
    "## Aufgabe 5 — Deckungsbeitrag *(selbst schreiben)*\n",
    "\n",
    "Schreiben Sie eine Funktion `deckungsbeitrag(preis, variable_kosten, menge)`, die\n",
    "(Preis − variable Kosten) × Menge zurückgibt. Testen Sie mit **80 €** Preis, **52 €** variablen\n",
    "Kosten und **250** Paletten. (Kein Gerüst mehr — schreiben Sie selbst.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "92abf42a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 5:\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76e67a37",
   "metadata": {},
   "source": [
    "## Aufgabe 6 — Kundenstatus *(selbst schreiben)*\n",
    "\n",
    "Schreiben Sie eine Funktion `kundenstatus(umsatz)`: unter **1000 €** → `\"Bronze\"`, unter\n",
    "**5000 €** → `\"Silber\"`, sonst `\"Gold\"`. Testen Sie mit **800**, **3200** und **7500**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "66669203",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 6:\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c32e41e",
   "metadata": {},
   "source": [
    "## Aufgabe 7 — Break-even-Menge *(selbst schreiben)*\n",
    "\n",
    "Ab welcher Menge deckt Brick-Flow die Fixkosten? Die Break-even-Menge ist\n",
    "\n",
    "$$\\text{Menge} = \\frac{\\text{Fixkosten}}{\\text{Preis} - \\text{variable Kosten je Stück}}$$\n",
    "\n",
    "Schreiben Sie `break_even(fixkosten, preis, variable_kosten)` und testen Sie mit **14000 €**\n",
    "Fixkosten, **80 €** Preis und **52 €** variablen Kosten je Palette.\n",
    "\n",
    "**Zusatz:** Was ändert sich bei **21000 €** Fixkosten? Ergänzen Sie dafür nur einen Aufruf."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "505bbe68",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 7:\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d78863fc",
   "metadata": {},
   "source": [
    "## Aufgabe 8 — Für Wirtschaftsingenieur:innen: Pflaster für einen Lagerhof\n",
    "\n",
    "Ein Hof ist **15 m** lang und **8 m** breit. Pro m² braucht man **36** Pflastersteine, dazu\n",
    "**5 %** Verschnitt. Ein Stein kostet **0,50 €**; **ab 2000 €** Materialwert gibt es **5 % Rabatt**.\n",
    "\n",
    "**a)** `flaeche(laenge, breite)` — Fläche in m²<br>\n",
    "**b)** `steinbedarf(flaeche, steine_pro_m2=36)` — Anzahl Steine inkl. Verschnitt<br>\n",
    "**c)** `materialkosten(steine, preis_je_stein=0.5)` — Kosten mit oder ohne Rabatt\n",
    "\n",
    "Schreiben Sie die drei Funktionen und verketten Sie die Aufrufe."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "16baf5fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 8:\n",
    "# a) Flaeche = Laenge * Breite\n",
    "# b) Steine = Flaeche * Steine pro m2, plus 5 % Verschnitt\n",
    "# c) Kosten = Steine * Preis je Stein, ab 2000 Euro mit 5 % Rabatt\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29df7535",
   "metadata": {},
   "source": [
    "## Geschafft! 🎉\n",
    "\n",
    "Sie haben eigene **Funktionen** mit Parametern, `return` und Standardwerten geschrieben,\n",
    "Funktionen **kombiniert** und den Unterschied zwischen `print` (Anzeige für Menschen) und\n",
    "`return` (Ergebnis zum Weiterrechnen) erlebt. Damit schreiben Sie einen Rechenweg **einmal**\n",
    "und nutzen ihn beliebig oft."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
