Übungen Tag 2
This commit is contained in:
+366
-19
@@ -83,12 +83,7 @@
|
||||
"id": "236fa9f5181f518d"
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2026-07-21T09:54:35.008029800Z",
|
||||
"start_time": "2026-07-21T09:54:34.987799400Z"
|
||||
}
|
||||
},
|
||||
"metadata": {},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"class Robot:\n",
|
||||
@@ -110,7 +105,7 @@
|
||||
],
|
||||
"id": "64c12bd54e52cf60",
|
||||
"outputs": [],
|
||||
"execution_count": 8
|
||||
"execution_count": null
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
@@ -123,12 +118,7 @@
|
||||
"id": "3f89c8f76710d139"
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2026-07-21T09:54:36.623452900Z",
|
||||
"start_time": "2026-07-21T09:54:36.590947200Z"
|
||||
}
|
||||
},
|
||||
"metadata": {},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"robot = Robot(5, \"Ich reiche Butter.\")\n",
|
||||
@@ -136,20 +126,377 @@
|
||||
" robot.execute_task()"
|
||||
],
|
||||
"id": "c2217f3770898f37",
|
||||
"outputs": [],
|
||||
"execution_count": null
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"# Aufgabe 3\n",
|
||||
"## Aufgabenstellung\n",
|
||||
"Zwei Klassen:\n",
|
||||
"- \"Buch\" mit dem Attribut \"titel\" (public get)\n",
|
||||
"- \"Autor\" mit dem Attribut \"name\" (public get)\n",
|
||||
"\n",
|
||||
"jeweils einen Konstruktor, der die Eigenschaften initialisiert.\n",
|
||||
"\n",
|
||||
"Implementieren Sie die Assoziation der beiden Klassen und stellen Sie eine bidirektionale Navigierbarkeit her. Dazu\n",
|
||||
"müssen Sie den Klassen weitere Member hinzufügen. (Gehen Sie davon aus, dass ein Buch mehrere Autoren haben und ein\n",
|
||||
"Autor mehrere Bücher verfassen kann)"
|
||||
],
|
||||
"id": "4c09b6fb40b8d1f9"
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"class Author:\n",
|
||||
" def __init__(self, name, *args):\n",
|
||||
" self.__name = name\n",
|
||||
" self.__books = []\n",
|
||||
" super().__init__(*args)\n",
|
||||
"\n",
|
||||
" @property\n",
|
||||
" def name(self):\n",
|
||||
" return self.__name\n",
|
||||
"\n",
|
||||
" @property\n",
|
||||
" def books(self):\n",
|
||||
" return self.__books\n",
|
||||
"\n",
|
||||
" @books.setter\n",
|
||||
" def books(self, books) -> None:\n",
|
||||
" self.__books = books\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" def __str__(self):\n",
|
||||
" return \"Name: \" + self.__name"
|
||||
],
|
||||
"id": "9dee92e77e3508c9",
|
||||
"outputs": [],
|
||||
"execution_count": null
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"class Book:\n",
|
||||
" def __init__(self, title: str, authors: list):\n",
|
||||
" self.__title = title\n",
|
||||
" self.__authors = authors\n",
|
||||
"\n",
|
||||
" a: Author # Typ-Hinweis\n",
|
||||
" for a in authors:\n",
|
||||
" a.books.append(self) # Füge allen übergebenen Authors das Book hinzu.\n",
|
||||
"\n",
|
||||
" @property\n",
|
||||
" def title(self):\n",
|
||||
" return self.__title\n",
|
||||
"\n",
|
||||
" @property\n",
|
||||
" def authors(self):\n",
|
||||
" return self.__authors\n",
|
||||
"\n",
|
||||
" @authors.setter\n",
|
||||
" def authors(self, authors):\n",
|
||||
" self.__authors = authors\n",
|
||||
"\n",
|
||||
" def __str__(self):\n",
|
||||
" string = \"Title: \" + self.__title + \"\\n\" + \"Authors: \\n\"\n",
|
||||
" for a in self.__authors:\n",
|
||||
" string += str(a) + \"\\n\"\n",
|
||||
" return string"
|
||||
],
|
||||
"id": "4b7aee3b3776c94f",
|
||||
"outputs": [],
|
||||
"execution_count": null
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "markdown",
|
||||
"source": "Testen Sie das Programm im Main.",
|
||||
"id": "1100bf56fd8decd0"
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"a1 = Author(\"Carl Sagan\")\n",
|
||||
"a2 = Author(\"Jerome Agel\")\n",
|
||||
"a3 = Author(\"Jonathan Norton Leonard\")\n",
|
||||
"\n",
|
||||
"b1 = Book(\"Nachbarn im Kosmos\", [a1, a2])\n",
|
||||
"b2 = Book(\"Die Planeten\", [a1, a3])\n",
|
||||
"\n",
|
||||
"# Ausgabe aller Books der jeweiligen Authors\n",
|
||||
"for b in a1.books:\n",
|
||||
" print(b)\n",
|
||||
"\n",
|
||||
"for b in a2.books:\n",
|
||||
" print(b)\n",
|
||||
"\n",
|
||||
"for b in a3.books:\n",
|
||||
" print(b)"
|
||||
],
|
||||
"id": "a9a21cf8add5b47a",
|
||||
"outputs": [],
|
||||
"execution_count": null
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"# Aufgabe 4\n",
|
||||
"## Aufgabenstellung\n",
|
||||
"Erstellen Sie bitte die Klassen Spellcaster, Sorcerer, Wizard, WildMagicSorcerer und IllusionWizard:\n",
|
||||
"- Sorcerer und Wizard sind Spellcaster.\n",
|
||||
"- WildMagicSorcerer ist ein Sorcerer und IllusionWizard ist ein Wizard.\n",
|
||||
"\n",
|
||||
"- Alle Spellcaster verfügen über die Methode \"castSpell()\"\n",
|
||||
"- In Spellcaster gibt die Methode \"Ich kann zaubern.\" aus.\n",
|
||||
"\n",
|
||||
"Sorcerer und Wizard überschreiben diese Methode.\n",
|
||||
"- Sorcerer gibt \"Ich kann zaubern.\" und \"Meine Zauberkraft ist mir angeboren.\" aus.\n",
|
||||
"- Wizard gibt \"Ich kann zaubern.\" und \"Für meine Zauberkraft musste ich hart arbeiten.\" aus.\n",
|
||||
"WildMagicSorcerer und IllusionWizard überschreiben und versiegeln(finalize) die Methode.\n",
|
||||
"- WildMagicSorcerer gibt \"Ich kann zaubern.\", \"Meine Zauberkraft ist mir angeboren.\" und \"Meine Zauber sind unberechenbar.\" aus.\n",
|
||||
"- IllusionWizard gibt \"Ich kann zaubern.\", \"Für meine Zauberkraft musste ich hart arbeiten.\" und \"Ich habe mich auf\n",
|
||||
"Illusionszauber spezialisiert.\" aus.\n",
|
||||
"\n",
|
||||
"Vermeiden Sie beim Überschreiben der Methode doppelten Code!"
|
||||
],
|
||||
"id": "2108e544f058d539"
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"class Spellcaster(object):\n",
|
||||
" def cast_spell(self):\n",
|
||||
" print(\"Ich kann zaubern.\")\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"class Sorcerer(Spellcaster):\n",
|
||||
" def cast_spell(self):\n",
|
||||
" super().cast_spell()\n",
|
||||
" print(\"Meine Zauberkraft ist mir angeboren.\")\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"class Wizard(Spellcaster):\n",
|
||||
" def cast_spell(self):\n",
|
||||
" super().cast_spell()\n",
|
||||
" print(\"Für meine Zauberkraft musste ich hart arbeiten.\")\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"class WildMagicSorcerer(Sorcerer):\n",
|
||||
" def cast_spell(self):\n",
|
||||
" super().cast_spell()\n",
|
||||
" print(\"Meine Zauber sind unberechenbar.\")\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"class IllusionWizard(Wizard):\n",
|
||||
" def cast_spell(self):\n",
|
||||
" super().cast_spell()\n",
|
||||
" print(\"Ich habe mich auf Illusionszauber spezialisiert.\")"
|
||||
],
|
||||
"id": "9f4ca8d209e3898c",
|
||||
"outputs": [],
|
||||
"execution_count": null
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "markdown",
|
||||
"source": "In der Main erzeugen Sie einen wildMagicSorcerer und einen illusionWizard und rufen für beide die castSpell()-Methode auf.",
|
||||
"id": "88c78295e6ff733b"
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"sorcerer = WildMagicSorcerer()\n",
|
||||
"wizard = IllusionWizard()\n",
|
||||
"sorcerer.cast_spell()\n",
|
||||
"wizard.cast_spell()"
|
||||
],
|
||||
"id": "28ce197ac73ed492",
|
||||
"outputs": [],
|
||||
"execution_count": null
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"# Aufgabe 5\n",
|
||||
"## Aufgabenstellung\n",
|
||||
"Sie sollen eine Anwendung für einen Shop schreiben. Im Shop gibt es viele Artikel, die mit Id, Bezeichnung, Einkaufspreis, Gewinnsatz und Verkaufspreis gespeichert werden. Der Verkaufspreis wird dabei immer aus Einkaufspreis + Gewinn errechnet.\n",
|
||||
"\n",
|
||||
"Artikel, die gekauft werden, werden mit Mengenangabe in einen Warenkorb gelegt. Es sollen Artikel in den Warenkorb gelegt und wieder entfernt werden können. Ebenfalls soll es möglich sein, die Anzahl eines Artikels ändern zu können. Über den Warenkorb wird der Gesamtpreis aller sich dort befindenden Artikel ermittelt.\n",
|
||||
"\n",
|
||||
"Artikel im Warenkorb werden dort als Warenkorb-Items eingetragen. Ein Warenkorb-Item besteht aus dem Artikel selbst und der Anzahl. Ebenfalls soll der Gesamtpreis für diesen Artikel abgefragt werden können.\n",
|
||||
"\n",
|
||||
"Es ist nicht erforderlich, ein Eingabe-Menü zu basteln. Es reicht, die einzelnen Fälle über Code in der Main zu testen.\n",
|
||||
"\n",
|
||||
"Wichtig für diese Übung: Beachten Sie die Prinzipien der OOP. Insbesondere die Klassenbildung und Datenkapselung / Geheimnisprinzip.\n",
|
||||
"\n",
|
||||
"Ebenso sollen Sie die strikte Trennung von Funktionalität / Datenhaltung und Darstellung beachten. Heißt: Dort, wo die Daten gespeichert sind und Funktionalitäten liegen, wird KEINE Konsolenausgabe getätigt. Konsolenausgaben nur in dafür vorgesehenen eigenen Klassen oder zum Beispiel in der Main."
|
||||
],
|
||||
"id": "dabe541b90e049b1"
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Bearbeitung\n",
|
||||
"Sie sollen eine Anwendung für einen Shop schreiben. Im Shop gibt es viele Artikel, die mit Id, Bezeichnung, Einkaufspreis, Gewinnsatz und Verkaufspreis gespeichert werden. Der Verkaufspreis wird dabei immer aus Einkaufspreis + Gewinn errechnet."
|
||||
],
|
||||
"id": "152f0dfd54408937"
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2026-07-22T06:07:02.682183793Z",
|
||||
"start_time": "2026-07-22T06:07:02.631660938Z"
|
||||
}
|
||||
},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"class Artikel:\n",
|
||||
" def __init__(self, id, bezeichnung: str, einkaufspreis: float, gewinnsatz: float): # Angabe von konkreten Datentypen\n",
|
||||
" self.id = id\n",
|
||||
" self.bezeichnung = bezeichnung\n",
|
||||
" self.einkaufspreis = einkaufspreis\n",
|
||||
" self.gewinnsatz = gewinnsatz\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" @property\n",
|
||||
" def verkaufspreis(self) -> float: # Angabe von Rückgabetyp\n",
|
||||
" return self.einkaufspreis * (1 + self.gewinnsatz / 100)"
|
||||
],
|
||||
"id": "f876b667a5783072",
|
||||
"outputs": [],
|
||||
"execution_count": 11
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "markdown",
|
||||
"source": "Artikel im Warenkorb werden dort als Warenkorb-Items eingetragen. Ein Warenkorb-Item besteht aus dem Artikel selbst und der Anzahl. Ebenfalls soll der Gesamtpreis für diesen Artikel abgefragt werden können.",
|
||||
"id": "9b3dba2c6071ca86"
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2026-07-22T06:07:05.233159899Z",
|
||||
"start_time": "2026-07-22T06:07:05.193137265Z"
|
||||
}
|
||||
},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"class WarenkorbItem:\n",
|
||||
" def __init__(self, artikel: Artikel, anzahl: int):\n",
|
||||
" self.artikel = artikel\n",
|
||||
" self.anzahl = anzahl\n",
|
||||
"\n",
|
||||
" @property\n",
|
||||
" def gesamtpreis(self) -> float:\n",
|
||||
" return self.artikel.verkaufspreis * self.anzahl"
|
||||
],
|
||||
"id": "1590b144e6e119a2",
|
||||
"outputs": [],
|
||||
"execution_count": 12
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "markdown",
|
||||
"source": "Artikel, die gekauft werden, werden mit Mengenangabe in einen Warenkorb gelegt. Es sollen Artikel in den Warenkorb gelegt und wieder entfernt werden können. Ebenfalls soll es möglich sein, die Anzahl eines Artikels ändern zu können. Über den Warenkorb wird der Gesamtpreis aller sich dort befindenden Artikel ermittelt.",
|
||||
"id": "26737f39f9902970"
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2026-07-22T06:07:07.653116857Z",
|
||||
"start_time": "2026-07-22T06:07:07.603058901Z"
|
||||
}
|
||||
},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"class Warenkorb:\n",
|
||||
" def __init__(self):\n",
|
||||
" self.liste = []\n",
|
||||
"\n",
|
||||
" def add_artikel(self, artikel, anzahl: int):\n",
|
||||
" item = self.find_item(artikel)\n",
|
||||
" if item is None:\n",
|
||||
" self.liste.append(WarenkorbItem(artikel, anzahl))\n",
|
||||
" else:\n",
|
||||
" item.anzahl = item.anzahl + anzahl\n",
|
||||
"\n",
|
||||
" def remove_artikel(self, artikel: Artikel, anzahl: int) -> bool:\n",
|
||||
" item = self.find_item(artikel)\n",
|
||||
" if item is None:\n",
|
||||
" return False\n",
|
||||
" if item.anzahl - anzahl > 0:\n",
|
||||
" item.anzahl = item.anzahl - anzahl\n",
|
||||
" else:\n",
|
||||
" self.liste.remove(item)\n",
|
||||
" return True\n",
|
||||
"\n",
|
||||
" def find_item(self, artikel: Artikel) -> WarenkorbItem | None:\n",
|
||||
" for item in self.liste:\n",
|
||||
" if item.artikel == artikel:\n",
|
||||
" return item\n",
|
||||
" return None\n",
|
||||
"\n",
|
||||
" @property\n",
|
||||
" def gesamtpreis(self) -> float:\n",
|
||||
" summe = 0\n",
|
||||
" item: WarenkorbItem\n",
|
||||
" for item in self.liste:\n",
|
||||
" summe = summe + item.gesamtpreis\n",
|
||||
"\n",
|
||||
" return summe"
|
||||
],
|
||||
"id": "edcaca28fe6a6cb0",
|
||||
"outputs": [],
|
||||
"execution_count": 13
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2026-07-22T06:07:10.299292598Z",
|
||||
"start_time": "2026-07-22T06:07:10.195456640Z"
|
||||
}
|
||||
},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"apfel = Artikel(1, \"Apfel\", 1.00, 10)\n",
|
||||
"birne = Artikel(2, \"Birne\", 1.10, 10)\n",
|
||||
"warenkorb = Warenkorb()\n",
|
||||
"warenkorb.add_artikel(apfel, 10)\n",
|
||||
"print(warenkorb.gesamtpreis)\n",
|
||||
"print(warenkorb.remove_artikel(apfel, 5))\n",
|
||||
"warenkorb.add_artikel(apfel, 10)\n",
|
||||
"print(warenkorb.gesamtpreis)\n",
|
||||
"print(warenkorb.remove_artikel(birne, 5))\n",
|
||||
"print(warenkorb.remove_artikel(apfel, 15))\n",
|
||||
"print(warenkorb.gesamtpreis)"
|
||||
],
|
||||
"id": "769c973f4a9ec4a5",
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Ich reiche Butter.\n",
|
||||
"Ich reiche Butter.\n",
|
||||
"Ich reiche Butter.\n",
|
||||
"Ich reiche Butter.\n",
|
||||
"Ich muss aufgeladen werden\n"
|
||||
"11.0\n",
|
||||
"True\n",
|
||||
"16.5\n",
|
||||
"False\n",
|
||||
"True\n",
|
||||
"0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"execution_count": 9
|
||||
"execution_count": 14
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
||||
Reference in New Issue
Block a user