Skip to content
Snippets Groups Projects
hausaufgabe1.ipynb 16.3 KiB
Newer Older
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
    "<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Aufgabe-1\" data-toc-modified-id=\"Aufgabe-1-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>Aufgabe 1</a></span></li><li><span><a href=\"#Aufgabe-2\" data-toc-modified-id=\"Aufgabe-2-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>Aufgabe 2</a></span></li><li><span><a href=\"#Aufgabe-3\" data-toc-modified-id=\"Aufgabe-3-3\"><span class=\"toc-item-num\">3&nbsp;&nbsp;</span>Aufgabe 3</a></span></li></ul></div>"
   ]
  },
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
    "# 1. Hausaufgabe\n",
    "\n",
schwabmi's avatar
schwabmi committed
    "### Lesen Sie sich die nachfolgenden Hinweise gut durch und folgen Sie den Anweisungen, um Missverständnisse zu vermeiden.\n",
schwabmi's avatar
schwabmi committed
    "Geben Sie diese Hausaufgabe gemeinsam mit Ihrem/r Partner/in ab. Füllen Sie dazu dieses Notebook aus und speichern Sie es ab (Disketten-Icon oben links). Laden Sie dann die Datei (hausaufgabe1.ipynb) in Moodle hoch. Verwenden Sie Kommentare im Python-Quellcode (#), um ihr Programm zu kommentieren.\n",
schwabmi's avatar
schwabmi committed
    "\n",
schwabmi's avatar
schwabmi committed
    "**Tipps und Anmerkungen**:\n",
    "- Es reicht, wenn ein Gruppenmitglied die Hausaufgabe einreicht. Passen Sie auf, dass Sie in moodle auf Abgabe drücken, damit es nicht nur ein Entwurf ist.\n",
    "- Nutzen Sie das Wissen aus den bisher bearbeiteten Notebooks (1-3). \n",
    "- Nutzen Sie http://pythontutor.com, um ihren Code nachvollziehen zu können und Fehler zu finden!\n",
    "- Bitte ändern Sie den Dateinamen ihrer Hausaufgabe zu: **hausaufgabe1_nachnamePartner1_nachnamePartner2.ipynb**\n",
    "    - z.B. `hausaufgabe1_schwab_jaeschke.ipynb`\n",
    "    - Das können Sie einfach machen, indem Sie **jetzt** oben links auf `hausaufgabe1` klicken und den neuen Namen eingeben.\n",
    "- Bei (Verständnis-)Fragen können Sie mich **frühzeitig** und nicht am Abend des Abgabetages per E-Mail oder während der Sitzungen erreichen.\n",
Michel Schwab's avatar
Michel Schwab committed
    "\n",
schwabmi's avatar
schwabmi committed
    "Wir wünschen viel Erfolg beim Lösen der Aufgaben!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
    "## Aufgabe 1\n",
    "\n",
    "Was gibt jede der folgenden Anweisungen aus? Erklären Sie jeweils die Ausgabe. \n",
schwabmi's avatar
schwabmi committed
    "- Welche Funktionen werden genutzt und was machen diese Funktionen? (die `print` -Funktion muss nicht erklärt werden). Achten Sie darauf, in welcher Reihenfolge die Anweisungen ausgeführt werden.\n",
    "- Was ist die Ausgabe? Geben Sie Wert und Datentyp an.\n",
    "- Nutzen Sie Kommentare wie im Beispiel beschrieben.\n",
    "- Nutzen Sie **mehrere Zeilen pro Anweisung, damit Ihre Antwort in die Breite des Codeblocks passt** und man nicht hin- und herscrollen muss. (Sie finden heraus, was ich meine, wenn es passiert ;) )\n",
    "\n",
    "Beispiel\n",
    "```\n",
    "print(\"a\"+\"b\") \n",
    "# zwei Zeichenketten werden durch den Operator \"+\" verkettet\n",
    "# Ausgabe: \"ab\", Datentyp: Zeichenkette/string\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(2 + 3)\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# \n",
    "print(2.2 + 3.3)\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('2' + '3')\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# \n",
    "print('2.2' + '3.3')\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(str(2) + str(3))\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# \n",
    "print(str(2.2) + str(3.3))\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(int('2') + int('3'))\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# \n",
    "print(int('2' + '3'))\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(float('2') + float('3'))\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# \n",
    "print(float('2' + '3'))\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(int(2.6 + 2.6))\n",
schwabmi's avatar
schwabmi committed
    "# \n",
    "# \n",
    "print(int(2.6) + int(2.6))\n",
    "# \n",
    "# "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Aufgabe 2\n",
schwabmi's avatar
schwabmi committed
    "\n",
    "**Tipp**: Wichtig bei den folgenden Aufgaben ist der Umgang mit Zeichenketten und der `print`-Funktion. Das haben Sie in den seminar-Notebooks schon gelernt. Gehen Sie diese zu Beginn der Hausaufgabe noch einmal durch und achten Sie, mit welchen **Operatoren** man Zeichenketten zusammenfügen und verketten kann.\n",
schwabmi's avatar
schwabmi committed
    "\n",
schwabmi's avatar
schwabmi committed
    "### Aufgabe 2a\n",
    "\n",
    "Ihre Aufgabe ist es, eine Funktion `boxprint` zu implementieren, die eine als Argument übergegebene Zeichenkette innerhalb einer Box ausgibt. Die horizontalen Linien der Box sollen durch `-` erzeugt werden, die vertikalen Linien durch `|` und die Ecken durch `+`. Zwischen der Zeichenkette und dem linken und rechten Rand der Box soll jeweils genau ein Leerzeichen stehen. \n",
    "\n",
    "Beispiel: Bei Übergabe des Arguments `Hello World!` soll die Funktion folgende Ausgabe erzeugen:"
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "+--------------+\n",
    "| Hello World! |\n",
    "+--------------+\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Überlegen Sie zunächst, wie Sie das Problem lösen könnten und beschreiben Sie hier kurz ihre Überlegungen bzw. ihr Vorgehen:\n",
    "\n",
    "- \n",
    "- \n",
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def boxprint(zeichenkette):\n",
schwabmi's avatar
schwabmi committed
    "    '''Die Funktion nimmt eine Zeichenkette entgegen und gibt \n",
    "    die Zeichenkette innerhalb einer Textbox aus.\n",
schwabmi's avatar
schwabmi committed
    "    '''    \n",
    "    pass # Diese Zeile können Sie bei der Implementierung löschen\n"
schwabmi's avatar
schwabmi committed
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
schwabmi's avatar
schwabmi committed
    "# Funktionsaufrufe\n",
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
    "boxprint(\"Hello World!\")\n",
schwabmi's avatar
schwabmi committed
    "boxprint(\"Das Reh springt hoch, das Reh springt weit. Warum auch nicht, es hat ja Zeit.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Schreiben Sie hier zwei Funktionsaufrufe der Funktion mit eigenen Argumenten\n",
    "\n"
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
schwabmi's avatar
schwabmi committed
    "### Aufgabe 2b\n",
    "\n",
    "Mit dem Linux-Programm [cowsay](https://en.wikipedia.org/wiki/Cowsay) kann man verschiedene Tiere \"Sprüche klopfen\" lassen:\n",
    "\n",
    "```\n",
    " ________\n",
    "< Muuuh! >\n",
    " --------\n",
    "        \\   ^__^\n",
    "         \\  (oo)\\_______\n",
    "            (__)\\       )\\/\\\n",
    "                ||----w |\n",
    "                ||     ||\n",
    "```\n",
    "\n",
    "Schreiben Sie eine Funktion `stegosay`, die einen als Argument übergebenen Text folgendermaßen ausgibt:\n",
    "\n",
    "```\n",
    " ___________________________\n",
    "( Wo bleibt mein Frühstück? )\n",
    " ---------------------------\n",
    "o                             .       .\n",
    " o                           / `.   .' ' \n",
    "  o                  .---.  <    > <    >  .---.\n",
    "   o                 |    \\  \\ - ~ ~ - /  /    |\n",
    "         _____          ..-~             ~-..-~\n",
    "        |     |   \\~~~\\.'                    `./~~~/\n",
    "       ---------   \\__/                        \\__/\n",
    "      .'  O    \\     /               /       \\  ' \n",
    "     (_____,    `._.'               |         }  \\/~~~/\n",
    "      `----.          /       }     |        /    \\__/\n",
    "            `-.      |       /      |       /      `. ,~~|\n",
    "                ~-.__|      /_ - ~ ^|      /- _      `..-'   \n",
    "                     |     /        |     /     ~-.     `-. _  _  _\n",
    "                     |_____|        |_____|         ~ - . _ _ _ _ _>\n",
    "```\n",
    "\n",
schwabmi's avatar
schwabmi committed
    "Nutzen Sie dazu Ihre bei der Programmierung von `boxprint` gesammelte Erfahrung. Auch hier soll das Argument eine variable Länge aufweisen können, die \"Sprechbox\" soll sich anpassen.\n",
schwabmi's avatar
schwabmi committed
    "**Achung**: Die Denkblase ist verschieden zu der Sprachblase auf Aufgabe 2a.\n",
    "\n",
schwabmi's avatar
schwabmi committed
    "**Tipp**: Man kann den Stegosaurus im Editiermodus kopieren, Sie müssen nicht jedes Zeichen selbst abtippen.\n",
schwabmi's avatar
schwabmi committed
    "Durch\n",
schwabmi's avatar
schwabmi committed
    "```\n",
    "''' \n",
    "Dinoabbildung Zeile 1\n",
    "Dinoabbildung Zeil 2\n",
    "...\n",
    "Dinoabbildung Zeile ...\n",
    "''' \n",
    "```\n",
    "\n",
    "können Sie den Dino vollständig im Editormodus dieses Blocks herauskopieren und in Ihre Funktion einfügen.\n",
    "Freiwillige Erweiterung für Fortgeschrittene: Erweitern Sie die Funktion um ein Argument, mit dem eine maximale Breite (Anzahl Zeichen) übergeben werden kann, so dass die ausgegebene Box nicht breiter ist. Implementieren Sie dann die Behandlung von Zeichenketten, die länger als die vorgegebene Breite sind. Sie haben zwei Möglichkeiten: a) die Zeichenkette abschneiden, b) die Zeichenkette umbrechen. Entscheiden Sie sich für eine der beiden Varianten. Hinweis: auf die ersten `k` Zeichen einer  Zeichenkette `s` können Sie mittels `s[0:k]` zugreifen. Analog können Sie auf das 2. bis 4. Zeichen mittels `s[1:4]` zugreifen, usw."
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
schwabmi's avatar
schwabmi committed
   "source": [
schwabmi's avatar
schwabmi committed
    "def stegosay(z):\n",
schwabmi's avatar
schwabmi committed
    "    '''Diese Funktion nimmt eine Zeichenkette entgegen und gibt \n",
    "    die Zeichenkette innerhalb einer Denkblase eines Dinos wieder aus. \n",
    "    In dieser Funktion soll der Dinosaurier inklusive der Denkblase ausgegeben werden.\n",
schwabmi's avatar
schwabmi committed
    "    pass # Diese Zeile können Sie bei der Implementierung löschen\n"
schwabmi's avatar
schwabmi committed
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Testen Sie hier ihre Funktion; fügen Sie auch eigene Tests hinzu\n",
    "stegosay(\"Wo bleibt mein Frühstück?\")\n",
schwabmi's avatar
schwabmi committed
    "stegosay(\"Auf einem Baum, da saß ein Specht. Der Baum war hoch, dem Specht war schlecht.\")"
schwabmi's avatar
schwabmi committed
   ]
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Aufgabe 3\n",
schwabmi's avatar
schwabmi committed
    "### Aufgabe 3a\n",
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
    "\n",
schwabmi's avatar
schwabmi committed
    "Schreiben Sie eine Funktion `sinprint`, die die Sinusfunktion (`math.sin`) im Bereich zwischen 0 und 2π  um 90° gedreht ausgibt, also ungefähr so:\n",
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
    "\n",
    "```\n",
    "          *\n",
    "           *\n",
    "             *\n",
    "               *\n",
    "                 *\n",
    "                  *\n",
    "                   *\n",
    "                   *\n",
    "                   *\n",
    "                   *\n",
    "                   *\n",
    "                  *\n",
    "                *\n",
    "               *\n",
    "             *\n",
    "           *\n",
    "         *\n",
    "       *\n",
    "     *\n",
    "   *\n",
    "  *\n",
    " *\n",
    "*\n",
    "*\n",
    "*\n",
    "*\n",
    " *\n",
    "  *\n",
    "   *\n",
    "     *\n",
    "       *\n",
    "         *\n",
    "```\n",
    "Hinweise:\n",
schwabmi's avatar
schwabmi committed
    "- Lösen Sie diese Aufgabe mit Hilfe einer Schleife. Sie kennen die Syntax und Semantik der `while`-Schleife schon aus der Vorlesung. Sie funktioniert in Python genau so, wie sie für den Pseudocode definiert wurde. \n",
schwabmi's avatar
schwabmi committed
    "- Sie müssen selbst entscheiden, wieviele Werte Sie im verlangten Intervall berechnen. Die Kurve oben wurde z.B. mit einem Rasterabstand von 0.2 berechnet (d.h., für die Werte 0, 0.2, 0.4, 0.6, ..., 6.2). Dies können Sie übernehmen.\n",
schwabmi's avatar
schwabmi committed
    "- Damit Sie die Funktion `math.sin` nutzen können, müssen Sie anfangs das `math`-Modul importieren.\n",
schwabmi's avatar
schwabmi committed
    "- Folgende Probleme müssen gelöst werden:\n",
    "  - Umwandeln von Gleitkommazahlen in Ganzzahlen \n",
    "  - Umwandeln von negativen in positive Zahlen\n",
    "- Nutzen Sie die `print`-Funktion, um die **Sternchen** (*) an verschiedenen Stellen zu zeichnen.\n",
    "- Falls Sie das Problem nicht lösen können, fragen Sie im Seminar nach. Dort können Sie wertvolle Tipps erhalten.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Beispiel einer einfachen while-Schleife\n",
    "i = 0\n",
    "while i < 5:\n",
    "    print(i)\n",
    "    i = i + 1"
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
schwabmi's avatar
schwabmi committed
    "\n",
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
    "def sinprint():\n",
schwabmi's avatar
schwabmi committed
    "    '''Diese Funktion zeichnet eine Sinus-Kurve ohne eine plot-Bibliothek.'''    \n",
schwabmi's avatar
schwabmi committed
    "    pass # Diese Zeile können Sie bei der Implementierung löschen\n",
schwabmi's avatar
schwabmi committed
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
schwabmi's avatar
schwabmi committed
    "# Funktionsaufruf\n",
    "sinprint()"
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
schwabmi's avatar
schwabmi committed
    "### Aufgabe 3b\n",
    "\n",
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
    "Ändern Sie die Funktion `sinprint`, so dass eine beliebige Funktion gezeichnet werden kann. Diese Funktion sollte als Argument übergeben werden können. Also beispielsweise so:\n",
    "\n",
    "```python\n",
    "funcprint(math.sin)\n",
    "```\n",
    "\n",
    "Ändern Sie gleich auch den Namen der Funktion zu `funcprint`, da sie ja jetzt nicht nur die Sinusfunktion ausgeben kann. (In der 2. Aufgabe des 3. Jupyter-Notebooks haben wir die Funktion `do_twice` kennengelernt - dort sehen Sie, wie Sie Funktionen als Argumente übergeben und verwenden können.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
schwabmi's avatar
schwabmi committed
    "def funcprint(func):\n",
    "    '''Diese Funktion nimmt den Parameter `func` entgegen, der ein Funktionsobjekt repräsentiert und zeichnet \n",
    "    die Funktionskurve\n",
schwabmi's avatar
schwabmi committed
    "    pass # Diese Zeile können Sie bei der Implementierung löschen\n",
schwabmi's avatar
schwabmi committed
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
schwabmi's avatar
schwabmi committed
    "# Funktionsaufruf\n",
schwabmi's avatar
schwabmi committed
    "funcprint(math.sin)\n",
    "funcprint(math.cos)"
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
schwabmi's avatar
schwabmi committed
    "### Aufgabe 3c\n",
    "\n",
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
    "Wenn alles geklappt hat, enthält Ihre Funktion jetzt einige Werte, die als Literale angegeben sind, z.B.\n",
    "- den Anfangs- und Endwert des Intervalls, in dem die Funktion gezeichnet werden soll\n",
    "- die Schrittweite\n",
    "- die Verschiebung des Nullpunkts\n",
schwabmi's avatar
schwabmi committed
    "- Skalierung in Richtung der x-Achse (Stauchung, Streckung)\n",
    "- Skalierung in Richtung der y-Achse (Stauchung, Streckung)\n",
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
    "\n",
schwabmi's avatar
schwabmi committed
    "Erweitern Sie die Funktion `funcprint`, so dass alle diese Werte als Argumente übergeben werden können.\n",
    "Fangen Sie mit einem Parameter an und versuchen Sie nach und nach alle Parameter einzusetzen. Falls die nicht funktioniert, rufen Sie Ihre Funktion mit den Parametern auf, die funktionieren. "
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
    "import math\n",
    "\n",
schwabmi's avatar
schwabmi committed
    "def funcprint_advanced(func, start, end, step, shift, scale_y):\n",
schwabmi's avatar
schwabmi committed
    "    '''Diese Funktion nimmt den Parameter `func` entgegen, der ein Funktionsobjekt repräsentiert und zeichnet \n",
    "    die Funktionskurve. Zudem nimmt die Funktion mehrere Parameter entgegen, die die Kurve verändern können.\n",
schwabmi's avatar
schwabmi committed
    "    '''\n",
    "    pass # Diese Zeile können Sie bei der Implementierung löschen\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
schwabmi's avatar
schwabmi committed
    "# Funktionsrauf\n",
schwabmi's avatar
schwabmi committed
    "funcprint_advanced(math.cos, 2, 10, 0.1, 30, 5)"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![Smiley](https://upload.wikimedia.org/wikipedia/commons/0/0f/Face-glasses.svg)"
   ]
Prof. Dr. Robert Jäschke's avatar
Prof. Dr. Robert Jäschke committed
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}