diff --git a/notebooks/seminar04.ipynb b/notebooks/seminar04.ipynb index dd3452207f5b876206f1b2daa2d077d38827eea7..e1bd8dd1522eb94934bd836367cc765561ae871e 100644 --- a/notebooks/seminar04.ipynb +++ b/notebooks/seminar04.ipynb @@ -56,56 +56,15 @@ "print(factorial(5))" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Python für das `turtle`-Modul\n", - "\n", - "\n", - "Da das `turtle`-Modul in Jupyter-Notebooks eventuell nicht so gut funktioniert, kann es von Vorteil sein, `turtle` über die Kommandozeile aufzurufen. Dies ist prinzipiell auf allen Betriebssystemen möglich, aber auf Linux und MacOS deutlich einfacher als auf Windows. Sie können das Programm in Jupyter Notebooks schreiben und unter \"Datei -> Herunterladen als -> Python (.py)\" herunterladen und dann über die Kommandozeile öffnen.\n", - "\n", - "\n", - "\n", - "Falls Sie Linux nutzen, sollte Python bereits installiert sein. Um das gewünschte Programm zu öffnen tun Sie folgendes: \n", - "1. Speichern Sie das Programm, das sie aufrufen möchten als Python-Programm mit der Dateiendung `.py`.\n", - "2. Öffnen Sie die Kommandozeile.\n", - "3. Gehen Sie in das Verzeichnis, in dem das Programm gespeichert ist. Geben Sie dafür `cd /pfad/zum/verzeichnis` ein. \n", - "4. Geben Sie auf der Kommandozeile `python programm.py` ein\n", - "5. Alternativ können Sie auch direkt `python /pfad/zum/verzeichnis/programm.py` eingeben. \n", - "\n", - "Falls Sie MacOS verwenden, gehen Sie folgendermaßen vor:\n", - "1. Speichern Sie das Programm, dass Sie aufrufen möchten als Python-Programm mit der Dateiendung `.py`.\n", - "2. Öffnen Sie das Terminal\n", - "3. Gehen Sie in das Verzeichnis, in welchem das Programm gespeichert ist, indem sie `cd /pfad/zum/verzeichnis`eingeben\n", - "4. Geben Sie im Terminal `python programm.py` ein.\n", - "5. Alternativ können Sie auch direkt `python /pfad/zum/verzeichnis/programm.py` eingeben. \n", - "\n", - "\n", - "Falls Sie Windows verwenden, brauchen Sie beim ersten Aufruf etwas länger und müssen zusätzliche Schritte vornehmen, bei weiterer Verwendung springen Sie direkt zu Punkt 2 der Anleitung:\n", - "1. Fügen Sie Python zur PATH-Umgebung hinzu: \n", - " 1.1. Finden Sie heraus wo Anaconda und Python gespeichert sind. (Dafür geben sie im Anaconda Prompt `where anaconda`und `where python` ein.) \n", - " 1.2. Öffnen Sie den Explorer und öffnen Sie das Rechtsklick-Menü von `Dieser PC` \n", - " 1.3. Wählen Sie Eigenschaften \n", - " 1.4. Wählen Sie Erweiterte Systemeinstellungen \n", - " 1.5. Wählen Sie Umgebungsvariablen \n", - " 1.6. Klicken Sie `Path` im unteren Fenster an und dann auf `bearbeiten` \n", - " 1.7. Klicken Sie auf `neu`und fügen Sie den Pfad für `Anaconda` hinzu, aber lassen Sie `anaconda.exe` weg \n", - " 1.8. Wiederholen Sie dasselbe analog für den `Python`-Pfad, dabei lassen Sie `python.exe` weg. \n", - " 1.9. Klicken Sie zweimal okay und schließen Sie die Systemsteuerung \n", - " 1.10. Öffnen Sie die Kommandozeile (`cmd` in der Suchleiste eingeben und `enter` drücken) und geben sie `python` oder `python.exe` ein. Wenn Sie Erfolg hatten, öffnet sich Python und Sie können in der Kommandozeile programmieren. \n", - " 1.11. Verlassen Sie `python` indem sie `exit()` eingeben. \n", - "2. Speichern Sie das Programm, das sie aufrufen möchten als Python-Programm mit der Dateiendung `.py`.\n", - "3. Geben Sie in der Kommandozeile `python.exe` und den Pfad zu Ihrem Programm ein (also `C:\\Users\\IhrName\\Documents\\nested\\programm.py`)" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Das `turtle`-Modul\n", "\n", - "Führen Sie den folgenden Code aus, um zu testen, ob das `turtle`-Modul installiert ist:" + "Führen Sie den folgenden Code aus, um zu testen, ob das `turtle`-Modul installiert ist.\n", + "\n", + "Es sollte sich ein Fenster öffnen, in dem ein kleiner Pfeil zu sehen ist -- dieser repräsentiert die Schildkröte (\"turtle\"). Schließen Sie das Fenster. (Danach erscheint ggf. eine Fehlermeldung -- nicht erschrecken, diese ist im Allgemeinen harmlos.) " ] }, { @@ -124,20 +83,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Es sollte sich ein Fenster öffnen, in dem ein kleiner Pfeil zu sehen ist -- dieser repräsentiert die Schildkröte (\"turtle\"). Schließen Sie das Fenster. (Danach erscheint ggf. eine Fehlermeldung -- nicht erschrecken, diese ist im Allgemeinen harmlos.) \n", - "\n", - "\n", - "\n", - "<details>\n", - " <summary type=\"button\" class=\"btn btn-info\"> Hinweis</summary>\n", - " <div class=\"alert alert-info\" role=\"alert\">\n", + "**WICHTIGER HINWEIS:**\n", " \n", "In Jupyter gibt es manchmal Probleme mit dem `turtle`-Modul. **Wichtig ist, dass Sie stets das Turtle-Fenster schließen.** Manchmal hilft es, den Code nochmal auszuführen oder im Kernel-Menü den Punkt \"Restart & Clear Output\" aufzurufen. Wenn es gar nicht klappt, dann nutzen Sie für die Turtle-Programmierung bitte nicht Jupyter-Notebooks, sondern Python-Dateien und führen diese direkt mit Python aus. \n", "Manchmal vergisst Jupyter Notebooks auch, dass bereits eine Schildkröte existiert, in diesem Fall initialisieren Sie diese bitte einfach am Anfang des gewünschten Code-Blocks. \n", - " </div> \n", - "</details>\n", "\n", - "Probieren Sie nun Folgendes (am besten in einem eigenen Jupyter-Notebook, einer eigenen Python-Datei oder im folgenden Block, den Sie dann schrittweise ergänzen):" + "\n", + "Probieren Sie nun Folgendes (kopieren Sie den Code in den folgenden Block):" ] }, { @@ -253,7 +205,102 @@ "Hello!\n", "Hello!\n", "Hello!\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### `range()`\n", + "\n", + "Die Funktion `range()` erstellt eine Liste mit Werten. Der erste Wert startet bei 0 und zählt dann die Anzahl an Zahlen hoch, die wir der Funktion als Argument übergeben. Wir kommen also bei einer Zahl eins kleiner als unser vorgegebener Endwert raus.\n", + "\n", + "*Beispiel*:\n", + "\n", + "`range(2) - [0,1]`\n", + "\n", + "`range(5) -> [0,1,2,3,4]`\n", + "\n", + "\n", + "#### `for`-Schleife\n", + "\n", + "Die `for`-Schleife hat folgende Syntax:\n", + "\n", + "<font color = green>for</font> <font color = black>Variable</font> <font color = green>in</font> <font color = purple>Sequenz</font>:\n", + "```\t\n", + " Anweisung1\n", + "\tAnweisung2\n", "```\n", + "\n", + "Die Schleife durchläuft nun die Liste mit jedem Schleifendurchlauf und die Variable `Variable` nimmt in jedem Durchlauf den nächsten Wert in der Liste an. Der Schleifenkörper besteht aus einer beliebig großen Anzahl von Anweisungen, die **eingerückt** (vier Leerzeichen bzw. einmal die tabulator-Taste) sein müssen.\n", + "\n", + "FYI: Der Name der Variablen kann frei gewählt werden. Falls es nur eine Zahl darstellt, wird häufig `i` genutzt.\n", + "\n", + "*Beispiele:*\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(3):\n", + " print(i)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(4): # range() erstellt die Liste [0,1,2,3]\n", + " print(str(i) + \"-ter Schleifendurchlauf; i nimmt den Wert:\" , i ,\"an.\") # Anweisung ist eingerückt\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Manchmal nutzt man die Variable `i` gar nicht, sondern nutzt range() und die `for`-Schleife aus, um Code zu wiederholen. \n", + "\n", + "`for i in range(4):` durchläuft die Schleife viermal,\n", + "\n", + "`for i in range(10):` durchläuft die Schleife zehnmal.\n", + "\n", + "Die Zahl in `range()` gibt also an, wie häufig der Code wiederholt wird.\n", + "Hier macht es keinen Unterschied, was während des Schleifendurchlaufs passiert.\n", + "\n", + "*Beispiele:* " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for j in range(10):\n", + " print(\"Hello\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for k in range(4):\n", + " print(\"H\")\n", + " print(\"a\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", "Das ist die einfachste Art und Weise, eine `for`-Schleife zu verwenden. Wir werden uns das später ausführlicher anschauen. Für jetzt sollte das reichen, damit Sie Ihr Programm zum Zeichnen eines Quadrats vereinfachen können. Bitte fahren Sie erst fort, wenn Sie ihr Programm mit Hilfe der `for`-Schleife vereinfacht haben.\n", "\n", @@ -270,7 +317,7 @@ " </div> \n", "</details>\n", "\n", - "Probieren Sie nun Folgendes (am besten in einem eigenen Jupyter-Notebook, einer eigenen Python-Datei oder im folgenden Block, den Sie dann schrittweise ergänzen):\n", + "Probieren Sie nun Folgendes (im folgenden Block, den Sie dann schrittweise ergänzen):\n", "\n", "<a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/jasoneppink/4964471335\" title=\"Spoiler Alert\"><img src=\"https://farm5.staticflickr.com/4110/4964471335_1f86a923f3_n.jpg\" width=\"320\" height=\"213\" alt=\"Spoiler Alert\"></a><script async src=\"//embedr.flickr.com/assets/client-code.js\" charset=\"utf-8\"></script>\n", "\n", @@ -290,7 +337,7 @@ "bob=turtle.Turtle()\n", "\n", "for i in range(4):\n", - " bob.fd(100)\n", + " bob.fd(100) \n", " bob.lt(90)\n", "\n", "turtle.mainloop() \n", @@ -484,6 +531,7 @@ "bob=turtle.Turtle()\n", "\n", "def square(t, length):\n", + " '''zeichnet ein Quadrat der Länge length'''\n", " for i in range(4):\n", " t.fd(length)\n", " t.lt(90)\n", @@ -503,15 +551,7 @@ "- **Aufgabe 4:** Kopieren Sie die Definition der Funktion `square` und benennen Sie die Kopie in `polygon` um. Fügen Sie einen weiteren Parameter namens `n` hinzu und ändern Sie den Funktionsrumpf so, dass ein n-seitiges [reguläres Vieleck](https://de.wikipedia.org/wiki/Regelm%C3%A4%C3%9Figes_Polygon) (Polygon) gezeichnet wird. \n", "\n", "\n", - "\n", - "<details>\n", - " <summary type=\"button\" class=\"btn btn-info\"> Hinweis</summary>\n", - " <div class=\"alert alert-info\" role=\"alert\">\n", - " \n", - "Die Außenwinkel eines n-seitigen Vielecks betragen 360/n Grad.\n", - "\n", - " </div> \n", - "</details>\n", + "**Hinweis:** Die Außenwinkel eines n-seitigen Vielecks betragen `360/n` Grad.\n", "\n", "Versuchen Sie zunächst selber die Aufgabe zu lösen, anbei folgen ein paar Hinweise, die Sie verwenden können. \n", "\n", @@ -520,7 +560,7 @@ " <summary type=\"button\" class=\"btn btn-primary\">1. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", " \n", - "Für die Lösung müssen Sie eine Zeile Code hinzufügen und 2 Zeilen anpassen, überlegen Sie welche das sein könnten!\n", + "Ändern Sie den Funktionskopf, indem Sie den Parameter `n` hinzufügen.\n", " \n", " </div> \n", "</details>\n", @@ -530,7 +570,7 @@ " <summary type=\"button\" class=\"btn btn-primary\">2. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", " \n", - "Berechnen Sie den Seitenwinkel und speichern Sie ihn in einer Variable. Verändern Sie die Drehung so, dass Sie nicht immer 90° beträgt, sondern an den berechneten Winkel angepasst ist.\n", + "Anders als bei einem Quadrat ist der Winkel nicht mehr `90`Grad. Berechnen Sie den Außenwinkel und speichern Sie ihn in einer Variable. Verändern Sie die Drehung so, dass Sie nicht immer 90° beträgt, sondern an den berechneten Winkel angepasst ist.\n", " \n", " </div> \n", "</details>\n", @@ -540,7 +580,7 @@ " <summary type=\"button\" class=\"btn btn-primary\">3. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", " \n", - "Für ein Polygon mit weniger als vier Seiten, ist es nicht so schlimm, wenn die Schildkröte eine Seite doppelt läuft, was ist aber mit den Formen, die mehr als vier Seiten haben?\n", + "Nun müssen wir noch anpassen, dass die Schildkröte nicht jedes Mal vier Seiten zeichnet, sondern soviele Seiten zeichnet wie es Ecken gibt. Dazu müssen wir die Schleife an einer Stelle ändern.\n", " \n", " </div> \n", "</details>" @@ -557,7 +597,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Der nächste Schritt ist ebenfalls eine Verallgemeinerung. Anstatt eines Quadrates kann die Funktion `polygon` reguläre Vielecke mit beliebig vielen Seiten zeichnen. So könnte eine Lösung aussehen:\n", + "Dieser Schritt ist ebenfalls eine Verallgemeinerung. Anstatt eines Quadrates kann die Funktion `polygon` nun reguläre Vielecke mit beliebig vielen Seiten zeichnen. So könnte eine Lösung aussehen:\n", "\n", "<a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/jasoneppink/4964471335\" title=\"Spoiler Alert\"><img src=\"https://farm5.staticflickr.com/4110/4964471335_1f86a923f3_n.jpg\" width=\"320\" height=\"213\" alt=\"Spoiler Alert\"></a><script async src=\"//embedr.flickr.com/assets/client-code.js\" charset=\"utf-8\"></script>\n", "\n", @@ -575,6 +615,7 @@ "bob=turtle.Turtle()\n", "\n", "def polygon(t, n, length):\n", + " '''zeichnet ein Vieleck mit n Ecken und der Seitenlänge length'''\n", " angle = 360 / n\n", " for i in range(n):\n", " t.fd(length)\n", @@ -605,16 +646,10 @@ "\n", "bob=turtle.Turtle()\n", "\n", - "def polygon(t, n, length):\n", - " angle = 360 / n\n", - " for i in range(n):\n", - " t.fd(length)\n", - " t.lt(angle)\n", - "\n", "polygon(bob, n=7, length=70)\n", "\n", "turtle.mainloop() \n", - "turtle.bye()\n" + "turtle.bye()" ] }, { @@ -623,7 +658,10 @@ "source": [ "Diese werden **Schlüsselwortargumente** genannt, denn Sie enthalten die Parameter als \"Schlüsselwörter\" (diese sollten nicht mit Python-Schlüsselwörtern wie z.B. `while` oder `def` verwechselt werden).\n", "\n", - "Durch diese Syntax wird das Programm lesbarer. Sie erinnert uns auch daran, wie Argumente und Parameter funktionieren: Wenn wir eine Funktion aufrufen, werden unsere Argumente den Parametern zugewiesen." + "Durch diese Syntax wird das Programm lesbarer. Sie erinnert uns auch daran, wie Argumente und Parameter funktionieren: Wenn wir eine Funktion aufrufen, werden unsere Argumente den Parametern zugewiesen.\n", + "\n", + "\n", + "Der nächste Schritt ist, eine Funktion `circle` zu schreiben, die einen Radius `r` als Parameter erwartet." ] }, { @@ -639,7 +677,9 @@ " <summary type=\"button\" class=\"btn btn-info\"> Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", " \n", - "Finden Sie den Umfang des Kreises heraus und stellen Sie sicher, dass `length * n` gleich dem Umfang ist. Die Formel für die Umfangsberechnung ist: $2 * π * r$\n", + "Die Formel für die Umfangsberechnung ist: $2 * π * r$.\n", + " \n", + " Finden Sie den Umfang des Kreises heraus und stellen Sie sicher, dass $length * n$ gleich dem Umfang ist. \n", " \n", " </div> \n", "</details>\n", @@ -651,7 +691,7 @@ " <summary type=\"button\" class=\"btn btn-primary\">1. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", " \n", - "Schreiben Sie zunächst den Kopf der Funktion `circle'. Welche Parameter müssen der Funktion übergeben werden. \n", + "Schreiben Sie zunächst den Kopf der Funktion `circle`. Welche Parameter müssen der Funktion übergeben werden? \n", " \n", " </div> \n", "</details>\n", @@ -661,7 +701,7 @@ " <summary type=\"button\" class=\"btn btn-primary\">2. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", " \n", - "Anschließend können Sie sich mit dem Rumpf der Funktion `circle` beschäftigen. Hier wollen wir `polygon` aufrufen. Welche Informationen müssen Sie an `polygon` übergeben? Schauen Sie sich die Funktion an um rauszufinden, welche Parameter sie übergeben müssen. Überlegen Sie wie Sie aus den Parametern der Funktion `circle` die benötigten Werte berechnen können. \n", + "Anschließend können Sie sich mit dem Rumpf der Funktion `circle` beschäftigen. Hier wollen wir `polygon` aufrufen. Welche Informationen müssen Sie an `polygon` übergeben? Schauen Sie sich die Funktion an, um rauszufinden, welche Parameter Sie übergeben müssen. Überlegen Sie, wie Sie aus den Parametern der Funktion `circle` die benötigten Werte berechnen können. \n", " \n", " \n", " </div> \n", @@ -672,16 +712,27 @@ " <summary type=\"button\" class=\"btn btn-primary\">3. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", "\n", - "Berechnen Sie den Umfang des Kreises und legen Sie die Anzahl an Seiten fest, die Sie verwenden wollen. Wir schauen uns später an, wie Sie n in Abhängigkeit des Kreises berechnen können. Wenn Sie dafür eine Idee haben verwenden Sie diese gerne, ansonsten können Sie zunächst eine beliebige Anzahl an Seiten festlegen. (Wird diese Zahl zu groß, wird Python sehr langsam und stürzt eventuell ab, ist sie zu klein gewählt sieht der Kreis sehr eckig aus. Probieren Sie verschiedene Werte für n zwischen 0 und 80 und wählen Sie einen Wert, der Ihnen geeignet scheint.\n", - " \n", + "Berechnen Sie den **Umfang** des Kreises ($2 * π * r$). $π$ können Sie entweder mit $3.14$ angeben oder mit dem `math`-Modul importieren (`import math` und `math.pi` sind hier hilfreich).\n", + "\n", " </div> \n", "</details>\n", "\n", + "\n", "<details>\n", " <summary type=\"button\" class=\"btn btn-primary\">4. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", + " \n", + "Legen Sie die Anzahl an Seiten ( `n` ) fest, die Sie verwenden wollen. Wir schauen uns später an, wie Sie `n` in Abhängigkeit des Kreises berechnen können. Wenn Sie dafür eine Idee haben verwenden Sie diese gerne, ansonsten können Sie zunächst eine beliebige Anzahl an Seiten festlegen. (Wird diese Zahl zu groß, wird Python sehr langsam und stürzt eventuell ab, ist sie zu klein gewählt sieht der Kreis sehr eckig aus. Probieren Sie verschiedene Werte für `n` zwischen 0 und 80 und wählen Sie einen Wert, der Ihnen geeignet scheint, zb. `n=50`.\n", + " \n", + " </div> \n", + "</details>\n", "\n", - "Berechnen Sie die Länge jeder einzelnen Seite in Abhängigkeit vom Umfang und der Anzahl an Seiten indem Sie den Umfang durch die Anzahl an Seiten teilen\n", + "\n", + "<details>\n", + " <summary type=\"button\" class=\"btn btn-primary\">5. Hinweis</summary>\n", + " <div class=\"alert alert-info\" role=\"alert\">\n", + "\n", + "Berechnen Sie nun die Länge `length` jeder einzelnen Seite in Abhängigkeit vom Umfang und der Anzahl an Seiten `n`, indem Sie den Umfang durch die Anzahl an Seiten teilen.\n", " \n", " </div> \n", "</details>\n" @@ -698,7 +749,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Der nächste Schritt ist, eine Funktion `circle` zu schreiben, die einen Radius `r` als Parameter erwartet. Hier eine einfache Lösung, die die Funktion `polygon` nutzt, um ein reguläres 50-seitiges Vieleck zu zeichnen:\n", + "Hier ist eine einfache Lösung von `circle`, die die Funktion `polygon` nutzt, um ein reguläres 50-seitiges Vieleck zu zeichnen:\n", "\n", "<a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/jasoneppink/4964471335\" title=\"Spoiler Alert\"><img src=\"https://farm5.staticflickr.com/4110/4964471335_1f86a923f3_n.jpg\" width=\"320\" height=\"213\" alt=\"Spoiler Alert\"></a><script async src=\"//embedr.flickr.com/assets/client-code.js\" charset=\"utf-8\"></script>\n", "\n", @@ -715,6 +766,7 @@ "\n", "\n", "def polygon(t, n, length):\n", + " '''zeichnet ein Vieleck mit n Ecken und der Seitenlänge length'''\n", " angle = 360 / n\n", " for i in range(n):\n", " t.fd(length)\n", @@ -722,12 +774,29 @@ " \n", "\n", "def circle(t, r):\n", + " '''zeichnet einen Kreis mit Radius r'''\n", " circumference = 2 * math.pi * r\n", " n = 50\n", " length = circumference / n\n", " polygon(t, n, length)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import turtle\n", + "\n", + "bob=turtle.Turtle()\n", + "\n", + "circle(bob, r=20)\n", + "\n", + "turtle.mainloop() \n", + "turtle.bye()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -755,14 +824,16 @@ "\n", "\n", "def polygon(t, n, length):\n", + " '''zeichnet ein Vieleck mit n Ecken und der Seitenlänge length'''\n", " angle = 360 / n\n", " for i in range(n):\n", " t.fd(length)\n", " t.lt(angle)\n", " \n", "def circle(t, r):\n", + " '''zeichnet einen Kreis mit Radius r'''\n", " circumference = 2 * math.pi * r\n", - " n = int(circumference / 3) + 3\n", + " n = int(circumference / 3) + 3 #n in Abhängigkeit vom Umfang berechnet\n", " length = circumference / n\n", " polygon(t, n, length)" ] @@ -777,7 +848,7 @@ "\n", "### Refactoring\n", "\n", - "- **Aufgabe 6:** Schreiben Sie eine verallgemeinerte Funktion `circle`, die Sie `arc` nennen. Diese soll ein weiteres Argument `angle` erwarten, welches angibt, welcher Anteil des Kreises gezeichnet werden soll. Die Funktion `arc` soll also einen Kreisbogen zeichnen. Der Wert von `angle` ist dabei in Grad, so dass für `angle=360` ein vollständiger Kreis gezeichnet werden sollte.\n" + "- **Aufgabe 6:** Schreiben Sie eine verallgemeinerte Funktion `circle`, die Sie `arc` nennen. Diese erwartet einen zusätzlichen Parameter `angle`, welcher angibt, welcher Anteil des Kreises gezeichnet werden soll. Die Funktion `arc` soll also einen [Kreisbogen](https://de.wikipedia.org/wiki/Kreisbogen) zeichnen. Der Wert von `angle` ist dabei in Grad, so dass für `angle=360` ein vollständiger Kreis gezeichnet werden sollte.\n" ] }, { @@ -801,7 +872,7 @@ " <summary type=\"button\" class=\"btn btn-primary\">1. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", " \n", - "Schreiben Sie zunächst den Kopf der Funktion `arc'. Welche Parameter müssen der Funktion übergeben werden. Kopieren Sie den Rumpf von `polygon`damit Sie ihn sehen und verändern können. \n", + "Schreiben Sie zunächst den Kopf der Funktion `arc`. Welche Parameter müssen der Funktion übergeben werden? Kopieren Sie den Rumpf von `polygon` unter den Funktionskopf als Basis, die Sie nun verändern. \n", " \n", " </div> \n", "</details>\n", @@ -811,7 +882,7 @@ " <summary type=\"button\" class=\"btn btn-primary\">2. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", " \n", - "Die Formel um die Länge eines Kreisbogens zu berechnen ist: $ 2 * π * r * Winkel / 360 \n", + "Die Formel zur Berechnung der Länge eines Kreisbogens ist: $2 * π * r * angle / 360$. Speichern Sie dies in einer Variabble und geben Sie dieser einen passenden Namen.\n", " \n", " </div> \n", "</details>\n", @@ -821,7 +892,7 @@ " <summary type=\"button\" class=\"btn btn-primary\">3. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", "\n", - "Berechnen Sie n in Abhängigkeit des Umfangs, analog zu der Berechnung von n in `circle`. Berechnen Sie aus n und dem Umfang analog auch die Schrittlänge. \n", + "Berechnen Sie `n` in Abhängigkeit der Länge des Kreisbogens, analog zu der Berechnung von `n` in `circle`. Berechnen Sie analog zu `length` in `circle` die Schrittlänge mit Hilfe von `n` und der Länge des Kreisbogens.\n", " </div> \n", "</details>\n", "\n", @@ -829,7 +900,7 @@ " <summary type=\"button\" class=\"btn btn-primary\">4. Hinweis</summary>\n", " <div class=\"alert alert-info\" role=\"alert\">\n", "\n", - "Berechnen Sie den Winkel der Drehung in Abhängigkeit vom eingegebenen Winkel und der Anzahl an gemalten Abschnitten `n`. Nun sollten Sie alle notwendigen Zahlen haben, verwenden Sie diese für die Schleife, die in `polygon` geschrieben wurde.\n", + "Berechnen Sie den Winkel der Drehung in Abhängigkeit vom eingegebenen Winkel und der Anzahl an gezeichneten Abschnitten `n` analog zur Berechnung der Schrittlänge. Nun sollten Sie alle notwendigen Zahlen haben, verwenden Sie diese für die Schleife, die in `polygon` geschrieben wurde.\n", " \n", " </div> \n", "</details>\n", @@ -854,6 +925,7 @@ "import turtle \n", "\n", "def arc(t, r, angle):\n", + " '''zeichnet einen Kreisbogen in Abhängigkeit von Radius r und Winkel angle'''\n", " arc_length = 2 * math.pi * r * angle / 360\n", " n = int(arc_length / 3) + 1\n", " step_length = arc_length / n\n", @@ -872,6 +944,31 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "Der folgende Funktionsaufruf sollte jetzt einen Drittel eines Kreises zeichnen." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import turtle \n", + "\n", + "bob = turtle.Turtle()\n", + "\n", + "arc(bob, 80, 120)\n", + "\n", + "turtle.mainloop()\n", + "turtle.bye()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Die eigentliche Aufgabe ist geschafft. Nun fällt uns aber noch etwas auf:\n", + "\n", "Die zweite Hälfte dieser Funktion sieht aus wie `polygon`, aber wir können `polygon` nicht einfach wiederverwenden ohne die Schnittstelle zu verändern. Wir könnten `polygon` generalisieren, so dass es einen Winkel als ein weiteres Argument erwartet, aber dann wäre `polygon` kein angemessener Name mehr. Nennen wir diese verallgemeinerte Funktion also stattdessen `polyline`: " ] }, @@ -884,6 +981,8 @@ "import turtle\n", "\n", "def polyline(t, n, length, angle):\n", + " '''zeichnet einen Teil eines Vielecks in Abhängigkeit von der Anzahl der Ecken n, der Länge length \n", + " und der Drehung an jeder Ecke (angle)'''\n", " for i in range(n):\n", " t.fd(length)\n", " t.lt(angle)\n", @@ -893,6 +992,29 @@ "#turtle.bye()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Diese Funktion zeichnet nun kein Vieleck mehr, sondern nur noch einen Teil eines Vielecks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import turtle \n", + "\n", + "bob = turtle.Turtle()\n", + "\n", + "polyline(bob, 8, 30, 30)\n", + "\n", + "turtle.mainloop()\n", + "turtle.bye()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -909,11 +1031,14 @@ "import turtle\n", "\n", "def polyline(t, n, length, angle):\n", + " '''zeichnet einen Teil eines Vielecks in Abhängigkeit von der Anzahl der Ecken n, der Länge length \n", + " und der Drehung an jeder Ecke (angle)'''\n", " for i in range(n):\n", " t.fd(length)\n", " t.lt(angle)\n", " \n", "def arc(t, r, angle):\n", + " '''zeichnet einen Kreisbogen in Abhängigkeit von Radius r und Winkel angle'''\n", " arc_length = 2 * math.pi * r * angle / 360\n", " n = int(arc_length / 3) + 1\n", " step_length = arc_length / n\n", @@ -941,11 +1066,14 @@ "import turtle\n", "\n", "def polyline(t, n, length, angle):\n", + " '''zeichnet einen Teil eines Vielecks in Abhängigkeit von der Anzahl der Ecken n, der Länge length \n", + " und der Drehung an jeder Ecke (angle)'''\n", " for i in range(n):\n", " t.fd(length)\n", " t.lt(angle)\n", " \n", "def arc(t, r, angle):\n", + " '''zeichnet einen Kreisbogen in Abhängigkeit von Radius r und Winkel angle'''\n", " arc_length = 2 * math.pi * r * angle / 360\n", " n = int(arc_length / 3) + 1\n", " step_length = arc_length / n\n", @@ -953,6 +1081,7 @@ " polyline(t, n, step_length, step_angle)\n", " \n", "def circle(t, r):\n", + " '''zeichnet einen Kreis mit Radius r'''\n", " arc(t, r, 360)\n", " \n", " \n",