You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

uebungen.ipynb 45KB

1
  1. {"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Übungsaufgaben\n", "Dieses Jupyter-Notebook enthält verschiedene Aufgaben, um den Umgang mit Python sortiert nach Themenschwerpunkten zu üben. Insbesondere die Gruppe der gemischten Themenschwerpunkte eignet sich als Klausurvorbereitung.\n", "\n", "**Hinweis:** Bei den Aufgabenbeschreibungen sind häufig Beispielabläufe der geforderten Lösungen enthalten. Dabei markiert `>>` eine Eingabe. Der Text danach stellt den Text dar, der bei der Eingabe angezeigt werden soll. Die Beispieleingabe folgt in rekursiver Schreibweise. Soll also `Geben Sie bitte einen Text ein` als Text für die Eingabeaufforderung angezeigt werden und der Benutzer würde `bla` eingeben, sähe das dazugehörige Beispiel also so aus: `>> Geben Sie bitte einen Text ein:` *`bla`*"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Built-In-Funktionen, Variablen und Datentypen "]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das für eine Variable `zahl` prüft, ob deren Wert ganzzahlig ist und, falls ja, durch 3 teilbar.\n", "\n", "**Beispiele**\n", "\n", "Für `zahl = 22` soll `true` ausgegeben werden.\n", "\n", "Für `zahl = 23` soll `false` ausgegeben werden.\n", "\n", "Für `zahl = 22.2` soll `false` ausgegeben werden."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["zahl = 22\n", "\n", "# Fügen Sie hier Ihren Code ein.\n", "\n", "print('bla')"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das eine Zahl einliest, diese als 4-Bit-Binärzahl interpretiert (sie besteht also aus maximal 4 Ziffer und nur aus 0ern und 1ern) und deren Dezimalwert ermittelt.\n", "\n", "**Beispiel**\n", "\n", "`>> Geben Sie eine 4-Bit-Binärzahl ein:` *`1010`*\n", "\n", "`Die Dezimalzahl zu 1010 lautet 10.`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das eine ganze Zahl vom Benutzer einliest und die Binärdarstellung der niederwertigsten 4 Bits ausgibt.\n", "\n", "**Beispiel**\n", "\n", "`>> Geben Sie eine positive, ganze Zahl ein:` *`5`*\n", "\n", "`Die Binärdarstellung zu 123 lautet 0101.`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Kontrollfluss"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Python-Programm, das drei Zahlen von der Tastatur einliest und anschließend die\n", "größte von ihnen ausgibt."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Python-Programm, das zwei Zahlen von der Tastatur einliest. Anschließend soll\n", "nachgefragt werden, ob die beiden Zahlen addiert, subtrahiert, multipliziert oder dividiert werden sollen. \n", "Führen Sie die gewünschte Operation aus und geben Sie das Ergebnis aus. "]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das eine beliebig lange Zahl einliest, diese als Binärzahl interpretiert (sie besteht also nur aus 0ern und 1ern) und deren Dezimalwert ermittelt. Geben Sie zwei Lösungen an und verwenden Sie bei jeder Lösung eine andere Schleifenart.\n", "\n", "**Beispiel**\n", "\n", "`>> Geben Sie eine Binärzahl ein:` *`101010101010`*\n", "\n", "`Die Dezimalzahl zu 101010101010 lautet 2730.`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das eine beliebig lange, ganze Zahl vom Benutzer einliest und die Binärdarstellung ausgibt.\n", "\n", "**Beispiel**\n", "\n", "`>> Geben Sie eine ganze, positive Zahl ein:` *`2730`*\n", "\n", "`Die Binärdarstellung zu 2730 lautet 101010101010.`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Listen"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das zu einer Liste den Durchschnitt aller Zahlenwerte ermittelt.\n", "\n", "**Beispiel**\n", "\n", "Für <code>liste = [3, 'ein Wort', 2.8, 2, 'noch ein Wort', 6, 3.2, 4, '2']</code> soll <code>3.5</code> ausgegeben werden."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["liste = [3, 'ein Wort', 2.8, 2, 'noch ein Wort', 6, 3.2, 4, '2']\n", "\n", "# Fügen Sie hier Ihren Code ein"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das eine beliebige Liste in umgekehrter Reihenfolge ausgibt, wobei immer nur jeder zweite Wert von hinten angezeigt werden soll.\n", "\n", "**Beispiel**\n", "\n", "Für <code>liste = [1, 'ein Wort', 2.5, 2, 'noch ein Wort', 6, 3.333, 4, '2']</code> soll folgendes ausgegeben werden:\n", "\n", "<code>2<br/>3.333<br/>noch ein Wort<br/>2.5<br/>1<br/></code>\n"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["liste = [1, 'ein Wort', 2.5, 2, 'noch ein Wort', 6, 3.333, 4, '2']\n", "\n", "# Fügen Sie hier Ihren Code ein"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das für eine beliebige Liste nur die ganzzahligen, geraden Werte aufsummiert.\n", "\n", "**Beispiel**\n", "\n", "Für <code>liste = [1, 'ein Wort', 2.5, 2, 'noch ein Wort', 6, 3.333, 4, '2']</code> soll <code>12</code> ausgegeben werden."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["liste = [1, 'ein Wort', 2.5, 2, 'noch ein Wort', 6, 3.333, 4, '2']\n", "\n", "# Fügen Sie hier Ihren Code ein"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "\n", "Gegeben sind zwei Listen gleicher Länge mit Artikeln und zugehörigen Preisen, z.B.:\n", "\n", "<code>artikel = [ \"Klopapier\", \"Maske\", \"Desinfektionsmittel\" ]</code>\n", "\n", "<code>preis = [ 3.5, 2.25, 7.4 ]</code>\n", "\n", "Schreiben Sie ein Python-Programm, das eine Ergebnisliste berechnet, in der Artikel und Preis zu Tupeln \n", "zusammengefasst sind:\n", "\n", "<code>ergebnis = [('Klopapier', 3.5), ('Maske', 2.25), ('Desinfektionsmittel', 7.4)] </code>"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Zeichenketten"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Python-Programm, das einen Text von der Tastatur einliest und anschließend\n", "die Anfangsbuchstaben aller Wörter im Text ausgibt. Dabei soll jeder Buchstabe nur einmal vorkommen."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Kopieren Sie die beliebige Zeichenkette <code>zeichenkette</code> so, dass alle Wörter, die mit einem Vokal beginnen, nicht in der Kopie enthalten sind. Satzzeichen können ignoriert werden und müssen nicht kopiert werden."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["zeichenkette = 'Dieser Text enthält mehrere Wörter, einige davon beginnen mit Vokalen. Ein Wort, das mit einem Vokal beginnt ist Ameise. Dieses Wort soll also entfernt werden.'\n", "\n", "kopie = # Fügen Sie ab hier Ihren Code ein.\n", "\n", "print(kopie)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Kopieren Sie die beliebige Zeichenkette <code>zeichenkette</code> so, dass alle Vorkommen eines bestimmten durch den Benutzer festgelegten (Teil-)Wortes durch ein anderes durch den Benutzer festgelegtes Wort ersetzt werden.\n", "\n", "**Beispiel**\n", "\n", "`>> Geben Sie bitte einen Satz ein:` *`Das ist ein Beispielsatz. In diesem Beispiel soll die Textersetzung geübt werden.`* <br/>\n", "`>> Geben Sie bitte einen Teil der Zeichenkette ein, der ersetzt werden soll:` *`Beispiel`*\n", "<br/>\n", "`>> Geben Sie bitte die Zeichenkette ein, die dafür eingefügt werden soll:` *`Bsp.`*\n", "<br/>\n", "`Das ist ein Bsp.satz. In diesem Bsp. soll die Textersetzung geübt werden. Deshalb ist es ein Übungsbeispiel.`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das eine Eingabe vom Benutzer entgegennimmt und prüft, ob die Eingabe ein Palindrom ist, also genauso rückwärts gelesen werden kann.\n", "\n", "**1. Beispiel**\n", "\n", "`>> Geben Sie bitte einen Satz ein:` *`Das ist kein Palindrom`*\n", "<br/>\n", "`False`\n", "\n", "**2. Beispiel**\n", "\n", "`>> Geben Sie bitte einen Satz ein:` *`Erika feuert nur untreue Fakire`*\n", "<br/>\n", "`True`\n", "\n", "**3. Beispiel**\n", "\n", "`>> Geben Sie bitte einen Satz ein:` *`Trug Tim eine so helle Hose nie mit Gurt`*\n", "<br/>\n", "`True`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das die Worte eines Satzes auf Zahlenwörter prüft und die entsprechenden numerischen Werte aufaddiert.\n", "\n", "**1. Beispiel**\n", "\n", "`>> Geben Sie bitte einen Satz ein:` <code>*Peter ist auf einer Lan***drei***se durch ***zwei*** Wohn***vier***tel unterwegs.*</code>\n", "<br/>\n", "`Die Summe lautet 9.`\n", "\n", "**2. Beispiel**\n", "\n", "`>> Geben Sie bitte einen Satz ein:` <code><i>***Acht***ung! Ein N***acht***falter landet im Er***drei***ch.</i></code>\n", "<br/>\n", "`Die Summe lautet 19.`\n", "\n", "**3. Beispiel**\n", "\n", "`>> Geben Sie bitte einen Satz ein:` <code>*Eine Fahrt mit Ra***drei***fen nach W***eins***tein ist kur***zwei***lig.*</code>\n", "<br/>\n", "`Die Summe lautet 6.`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Funktionen"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie eine Funktion <code>schnittmenge</code>, die zwei Listen als Parameter erwartet\n", "und eine Liste zurückgibt, die nur die Elemente beinhaltet, die in beiden übergebenen Listen enthalten waren."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code für die Funktion ein.\n", "\n", "print(schnittmenge([1, 2, 3, 10], [3, 4, 1]))"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie eine Funktion <code>pascal</code>, der eine Liste <code>z</code> von Integer-Zahlen \n", "übergeben wird. Sei <code>n</code> die Länge dieser Liste. \n", "Das Ergebnis soll eine neue Liste sein mit folgenden Einträgen\n", "\n", "Falls <code>n == 0</code>:\n", "\n", "&nbsp;<code>[ 1 ]</code>\n", "\n", "Falls <code>n == 1</code>:\n", "\n", "&nbsp;<code>[ 1 , 1 ]</code>\n", "\n", "Sonst:\n", "\n", "&nbsp;<code>[ 1 , z[0]+z[1] , z[1]+z[2] , ... , z[n-2]+z[n-1] , 1 ]</code>"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code für die Funktion ein.\n", "\n", "print(pascal([]))\n", "print(pascal([5]))\n", "print(pascal([5, 2, 7, 3]))"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie eine Funktion `prim_sum_up_to`, die die Summe aller Primzahlen von 2 bis *n* berechnet, wobei *n* als\n", "Parameter übergeben wird."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie Ihren Code für die Funktion prim_sum_up_to ein.\n", "\n", "print(prim_sum_up_to(100))"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Dictionaries"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das alle Einträge einer Liste in einem Dictionary speichert. Als Schlüssel soll die Position innerhalb der Liste verwendet werden. Geben Sie anschließend die Einträge des Dictionary zeilenweise in der Form <code>Schlüssel -> Wert</code> aus."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["liste = [1, 'ABBA', 23.3, 45, 'Text', -123]\n", "\n", "# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Python-Skript, das Studierende in einem Dictionary verwaltet. Schlüssel soll\n", "die ganzzahlige Matrikelnummer sein, der Wert der Name des Studierenden.\n", "\n", "Ihr Skript soll dabei zunächst eine Matrikelnummer einlesen. Ist sie im Dictionary vorhanden,\n", "soll der gespeicherte Name ausgegeben werden. Anschließend soll das Programm mit dem\n", "Einlesen der nächsten Matrikelnummer fortgesetzt werden.\n", "\n", "Ist die Matrikelnummer nicht vorhanden, soll der Name eingelesen und im Dictionary gespeichert\n", "werden. Anschließend geht es weiter mit der nächsten Matrikelnummer.\n", "\n", "Bei der Eingabe einer negativen Matrikelnummer soll der Studierende aus dem Dictionary\n", "entfernt werden.\n", "\n", "Wird 0 eingegeben, endet das Programm."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das ein Dictionary beinhaltet und daraus ein neues Dictionary erstellt, in dem die vorher enthaltenen Paare umgedreht werden, also jeder Schlüssel jetzt Wert und umgekehrt ist. Die Umwandlung soll für beliebige Dictionaries funktionieren. Das Programm soll beide Dictionaries ausgeben. \n", "\n", "Ist eine Umdrehung der Key-Value-Beziehung eines Dictionaries immer möglich?\n", "\n", "**Beispiel**\n", "\n", "`altes_dict[a] = 1`\n", "<br/>\n", "`altes_dict[b] = 2`\n", "<br/>\n", "`altes_dict[c] = 3`\n", "<br/>\n", "`neues_dict[1] = a`\n", "<br/>\n", "`neues_dict[2] = b`\n", "<br/>\n", "`neues_dict[3] = c`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das Eingaben vom Benutzer solange liest, bis dieselbe Eingabe 3-mal (nicht notwendigerweise direkt hintereinander) erfolgt ist. Am Ende soll das Programm alle Eingaben und deren Häufigkeit ausgeben. Die Information soll als Dictionary abgelegt werden.\n", "\n", "**Beispiel**\n", "\n", "`>> Machen Sie eine Eingabe:` *`12a`*\n", "<br/>\n", "`>> Machen Sie eine Eingabe:` *`a`*\n", "<br/>\n", "`>> Machen Sie eine Eingabe:` *`a`*\n", "<br/>\n", "`>> Machen Sie eine Eingabe:` *`12`*\n", "<br/>\n", "`>> Machen Sie eine Eingabe:` *`abc`*\n", "<br/>\n", "`>> Machen Sie eine Eingabe:` *`12a`*\n", "<br/>\n", "`>> Machen Sie eine Eingabe:` *`a`*\n", "<br/>\n", "`Die Eingabe '12a' wurde 2-mal getätigt.`\n", "<br/>\n", "`Die Eingabe 'a' wurde 3-mal getätigt.`\n", "<br/>\n", "`Die Eingabe '12' wurde 1-mal getätigt.`\n", "<br/>\n", "`Die Eingabe 'abc' wurde 1-mal getätigt.`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Exceptions"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie eine Funktion <code>get_it_or_none1</code>, die ein Dictionary und einen\n", "Schlüsselwert als Parameter erhält. Sie soll den im Dictionary gespeicherten Wert\n", "zurückgeben, wenn er enthalten ist, andernfalls <code>None</code>.\n", "\n", "Vermeiden Sie bei der Implementierung das Auftreten einer Exception, indem Sie vor\n", "dem Zugriff prüfen, ob der Schlüssel enthalten ist."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["Implementieren Sie eine Funktion <code>get_it_or_none2</code> mit der gleichen\n", "Funktionalität. Allerdings verzichten Sie dieses Mal auf die Prüfung und fangen\n", "eine evtl. auftretende Exception, um dann <code>None</code> zurückzugeben."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["Überprüfen Sie die Laufzeit der beiden Varianten, indem Sie jede Funktion\n", "10000-mal so aufrufen, dass <code>None</code> zurückgegeben wird. Was ist schneller?"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["import timeit\n", "\n", "# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["Tatsächlich besitzt ein Python-Dictionary eine bisher nicht eingeführte Methode\n", "<code>get</code>, der neben dem Schlüssel auch ein Default-Wert übergeben werden kann,\n", "der zurückgegeben wird, wenn der Schlüssel nicht enthalten ist.\n", "\n", "<code>dict.get( \\< key \\>, \\< default \\> ) </code>\n", "\n", "Überprüfen Sie auch die Laufzeit dieses Ansatzes."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["Wie erklären Sie sich die Ergebnisse?"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Module"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Kopieren Sie sich Ihre Lösung für die Funktion `prim_sum_up_to` aus der Aufgabengruppe ***Funktionen***.\n", "\n", "Sobald Sie die Funktion mit größeren *n* aufrufen, steigt die Laufzeit des Programms an. Um zu verhindern,\n", "dass der Anwender fälschlicherweise annimmt, dass das Programm abgestürzt ist, soll jede Sekunde ein\n", "Stern ausgegeben werden, bis das Ergebnis vorliegt.\n", "\n", "Verwenden Sie hierfür das in der Standardbibliothek enthaltene Modul <code>datetime</code> und\n", "importieren Sie daraus die Objekte <code>datetime</code> und <code>timedelta</code>.\n"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Objektorientierte Programmierung (OOP)"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Erstellen Sie eine Klasse `ZeichenZaehler`, die bei der Erstellung eines ihrer Objekte einen String mit zu suchenden Zeichen übergeben bekommt. Die Klasse soll eine öffentliche Methode `zaehle` anbieten, die wiederum einen String übergeben bekommt. Innerhalb dieses Strings werden die Zeichen gezählt, die bei der Erstellung des Objekts übergeben wurden. Die Methode kann mehrfach mit unterschiedlichen Strings aufgerufen werden und liefert `True` zurück, wenn ein String übergeben wurde, ansonsten `False`. Die Klasse bietet eine zweite öffentliche Methode `zaehlerStand` an, die zurückliefert, wie häufig die zu zählenden Zeichen bisher insgesamt gezählt wurden. Zudem bietet die Klasse eine dritte öffentliche Methode `setzeZurueck` an, die den Zählerstand zurücksetzt. Ansonsten soll die Klasse keine Informationen nach außen anbieten. Zwischen Groß- und Kleinschreibung soll nicht unterschieden werden."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihre Klassendefinition für ZeichenZaehler ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["Führen Sie die obige Code-Zelle aus, sodass Ihre Klassendefinition für `ZeichenZaehler` bekannt ist. Lassen Sie den Benutzer nun solange Eingaben vornehmen, bis er eine leere Eingabe tätigt. Nach jeder Eingabe soll die Anzahl aller bisherig eingegebenen Vokale angezeigt werden. Gibt der Benutzer `0` ein, soll das Zählen von vorne beginnen. Nutzen Sie dafür Ihre oben definierte Klasse.\n", "\n", "**Beispiel**\n", "\n", "`>> Geben Sie einen Text ein: ` *`Das ist ein Text.`*\n", "<br/>\n", "`Bisher war(en) 5 Vokal(e) in Ihren Eingaben enthalten.`\n", "<br/>\n", "`>> Geben Sie einen Text ein: ` *`Ein neuer Text.`*\n", "<br/>\n", "`>> Bisher war(en) 11 Vokal(e) in Ihren Eingaben enthalten.`\n", "<br/>\n", "`>> Geben Sie einen Text ein: ` *`0`*\n", "<br/>\n", "`>> Geben Sie einen Text ein: ` *`Das ist wieder ein Text.`*\n", "<br/>\n", "`Bisher war(en) 8 Vokal(e) in Ihren Eingaben enthalten.`\n", "<br/>\n", "`>> Geben Sie einen Text ein: ` *`Und noch einer.`*\n", "<br/>\n", "`Bisher war(en) 13 Vokal(e) in Ihren Eingaben enthalten.`\n", "<br/>\n", "`>> Geben Sie einen Text ein: `\n", "<br/>\n", "`Bisher war(en) 13 Vokal(e) in Ihren Eingaben enthalten.`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Sie entwickeln im Team ein CAD-Programm,\n", "das das Zusammenstellen komplexer Zeichnungen aus einfachen 2D-Elementen erlaubt.\n", "Gegeben ist bereits eine Klasse `Element`."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["class Element():\n", "\n", " def bezeichnung(self):\n", " return \"N.N.\"\n", "\n", " def umfang(self):\n", " raise NotImplementedError()\n", "\n", " def __str__(self):\n", " return self.bezeichnung() + f\" Umfang: {self.umfang()}\""]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["Ihr Teamleiter beauftragt Sie, für die Elemente `Kreis` und `Rechteck` Unterklassen zur Oberklasse `Element` so zu implementieren,\n", "dass anschließend die Aufrufe\n", "\n", "<code>k = Kreis(radius=3)</code>\n", "\n", "<code>r = Rechteck(breite=10, hoehe=5)</code>\n", "\n", "möglich sind.\n"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code für die Klassen Kreis und Rechteck ein."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["k = Kreis(radius=3)\n", "print(k)\n", "\n", "r = Rechteck(breite=10, hoehe=5)\n", "print(r)"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Entwurfsmuster"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["## Aufgabe\n", "Ihr Team entwickelt eine Datenbank-Anwendung. Ein Objekt der `Datenbank`-Klasse darf dabei in der gesamten Software nur einmal existieren, um Redundanzen zu vermeiden. Unten finden Sie eine bisherige Implementierung. Nutzen Sie das Singleton-Entwurfsmuster, um nur ein Objekt der `Datenbank`-Klasse zu halten. Der Code darf nur an den markierten Stellen verändert werden.\n", "\n", "Nach erfolgreicher Arbeit sollte der Code folgende Ausgabe generieren:\n", "\n", "<code>Inhalt von database_obj1:<br/>\n", "Erster Eintrag<br/>\n", "Ein anderer erster Eintrag<br/>\n", "Zweiter Eintrag<br/>\n", "Ein anderer zweiter Eintrag<br/>\n", "<br/>\n", "Inhalt von database_obj2:<br/>\n", "Erster Eintrag<br/>\n", "Ein anderer erster Eintrag<br/>\n", "Zweiter Eintrag<br/>\n", "Ein anderer zweiter Eintrag</code>"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Erweitern Sie die Klasse Database\n", "\n", "class Database:\n", " def __init__(self):\n", " self.__entries = []\n", "\n", " def show_entries(self):\n", " for entry in self.__entries:\n", " print(entry)\n", "\n", " def add_entry(self, entry):\n", " self.__entries.append(entry)\n", "\n", "\n", "database_obj1 = Database()\n", "database_obj2 = Database()\n", "\n", "database_obj1.add_entry('Erster Eintrag')\n", "database_obj2.add_entry('Ein anderer erster Eintrag')\n", "database_obj1.add_entry('Zweiter Eintrag')\n", "database_obj2.add_entry('Ein anderer zweiter Eintrag')\n", "\n", "print('Inhalt von database_obj1:')\n", "database_obj1.show_entries()\n", "\n", "print('\\nInhalt von database_obj2:')\n", "database_obj2.show_entries()"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie eine Klasse `Quadrat`, die bei der Erstellung eines Objekts die Seitenlänge übergeben bekommt und als öffentliche Methode `seitenlaenge` anbietet, die die Seitenlänge zurückgibt. Führen Sie die Code-Zelle aus, um die Klasse bekannt zu machen."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code für die Quadrat-Klasse ein."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["Schreiben Sie nun einen Objekt-Adapter `RechteckAdapter`, der ein Objekt der Klasse `Quadrat` auf das Ziel-Interface `Rechteck` anpasst. Die Schnittstellen des `Rechteck`-Interfaces können Sie der Funktion `verarbeiteRechteck` entnehmen. Verwenden Sie den Adapter, um das `Quadrat`-Objekt mit der `verarbeiteRechteck`-Funktion verwenden zu können. Code darf nur an den markierten Stellen verändert bzw. hinzugefügt werden. \n", "\n", "**Hinweis:** Die `verarbeiteRechteck`-Funktion darf nicht verändert werden. Solange der Adapter nicht richtig implementiert und erstellt wurde, wird der Code Fehler produzieren."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code für die RechteckAdapter-Klasse ein.\n", "\n", "def verarbeiteRechteck(rechteck):\n", " print(f'Die 1. Seite des Rechtecks ist {rechteck.seite1()} Einheiten lang.')\n", " print(f'Die 2. Seite des Rechtecks ist {rechteck.seite2()} Einheiten lang.')\n", " print(f'Die Fläche des Rechtecks beträgt {rechteck.flaecheninhalt()} Einheiten.')\n", " print(f'Der Umfang des Rechtecks beträgt {rechteck.umfang()} Einheiten.')\n", "\n", "\n", "quadrat = Quadrat(4)\n", "verarbeiteRechteck(quadrat) # Erstellen bzw. ergänzen Sie hier Ihr Adapter-Objekt, um es mit dem Quadrat-Objekt an die Funktion zu übergeben."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Es soll eine Vorrichtung implementiert werden, die zählt, wie viele Personen sich in einem Raum befinden. An den Eingängen des Raums befinden sich Ampeln, die grün anzeigen, falls noch weitere Personen eintreten dürfen, gelb, falls nur noch eine Person eintreten darf, und rot, falls sich die Höchstanzahl an Personen im Raum befindet. In der übernächsten Code-Zelle ist dieses Verhalten simuliert, allerdings noch nicht lauffähig.\n", "\n", "Implementieren Sie daher zunächst die Klasse `EntryCounter`, die einen Raumbelegungssensor simuliert und immer aufgerufen wird, wenn eine Person den Raum betritt oder verlässt. Bei der Erstellung eines ihrer Objekte kann die Höchstzahl an Personen für den Raum festgelegt werden. Implementieren Sie die Klasse zunächst so, dass immer nur die richtige Anzahl an Personen in der übernächsten Code-Zelle angezeigt wird. Vergessen Sie nach der Implementierung der Klasse nicht, die untere Code-Zelle auszuführen, um ihren Inhalt der übernächsten Code-Zelle bekannt zu machen. Die Ampeln können Sie zunächst erst einmal ignorieren."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code für die Klasse EntryCounter ein.\n", "\n", "class TrafficLight:\n", " def __init__(self, status):\n", " self.__status = status\n", "\n", " def get_light_status(self):\n", " return self.__status\n", "\n", " # Erweitern Sie hier die Klasse TrafficLight um weitere Methoden, falls notwendig."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Dieser Code darf nur an markierten Stellen erweitert, ansonsten aber nicht verändert werden.\n", "\n", "traffic_light1 = TrafficLight('red')\n", "traffic_light2 = TrafficLight('red')\n", "\n", "entry_counter = EntryCounter(5)\n", "# Fügen Sie hier zusätzlichen Code für entry_counter ein, falls notwendig, und nur, wenn Sie in der Aufgabenbeschreibung dazu aufgefordert werden.\n", "\n", "for enter_or_leave in [1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, -1]:\n", " if enter_or_leave == 1:\n", " entry_counter.someoneEnters()\n", " elif enter_or_leave == -1:\n", " entry_counter.someoneLeaves()\n", " else:\n", " print(f'Unrecognized code: {enter_or_leave}')\n", "\n", " print(f'People in the room: {entry_counter.getCount()}')\n", " print(f'Traffic light 1: {traffic_light1.get_light_status()}')\n", " print(f'Traffic light 2: {traffic_light2.get_light_status()}\\n')"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["\n", "Nun sollen die Ampeln ebenfalls immer richtig eingestellt werden. Also grün, wenn noch mehr als eine Person eintreten darf, gelb, wenn nur noch eine Person eintreten darf, und rot, wenn keine Person mehr eintreten darf. Die Ampeln sollen allerdings immer nur aktualisiert werden, wenn eine Änderung Ihres Status wirklich notwendig ist. Nutzen Sie dafür das Beobachter-Entwurfsmuster. Erweitern Sie dafür die Klassen `EntryCounter` und `TrafficLight` und ergänzen Sie in der Code-Zelle darunter Code an der markierten Stelle, um die Erweiterungen zu nutzen."]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe Input/Output (IO)"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Gegeben ist eine binäre Grafikdatei <code>ohm.png</code>."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["from IPython.display import Image\n", "Image(filename=\"ohm.png\")"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["Erstellen Sie ein Python-Programm, dass diese Datei in eine zweite\n", "Datei <code>logo.png</code> kopiert. Übertragen Sie die Daten bitte\n", "in 32 Byte Paketen."]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein.\n", "\n", "Image(filename=\"logo.png\")"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Vervollständigen Sie das untenstehende Programmfragment, das beliebige Eingaben vom Benutzer solange einlesen soll, bis der Benutzer eine leere Eingabe tätigt. Danach sollen die Eingaben in eine Textdatei `eingaben.txt` gespeichert werden. Anschließend soll der Inhalt der Datei in umgekehrter Reihenfolge in ein Textdatei `umgekehrte_eingaben.txt` kopiert werden. Geben Sie am Ende beide Textdateien Zeile für Zeile aus, wobei immer eine Zeile von `eingaben.txt` und `umgekehrte_eingaben.txt` abwechselnd ausgegeben werden. Füllen Sie dafür die bereitgestellten Funktionen aus.\n", "\n", "**Beispiel**\n", "\n", "`>> Geben Sie einen Text ein: ` *`Dies ein Test.`*\n", "<br>\n", "`>> Geben Sie einen Text ein: ` *`Hier kommt eine weitere Test-Zeile.`*\n", "<br>\n", "`>> Geben Sie einen Text ein: ` *`Und noch eine.`*\n", "<br>\n", "`>> Geben Sie einen Text ein: ` *`Ende.`*\n", "<br>\n", "`>> Geben Sie einen Text ein: `\n", "\n", "<code>\n", "Dies ist ein Test.<br/>\n", ".ednE<br/>\n", "Hier kommt eine weitere Test-Zeile.<br/>\n", ".enie hcon dnU<br/>\n", "Und noch eine.<br/>\n", ".elieZ-tseT eretiew enie tmmok reiH<br/>\n", "Ende.<br/>\n", ".tseT nie tsi seiD</code>"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["def input_lines(prompt_text):\n", " # Fügen Sie hier Ihren Code ein.\n", " pass\n", "\n", "def write_lines_to_file(lines, filename):\n", " # Fügen Sie hier Ihren Code ein.\n", " pass\n", "\n", "def copy_textfile_reversed(text_filename, cpy_filename):\n", " # Fügen Sie hier Ihren Code ein.\n", " pass\n", "\n", "def output_files_together(filename1, filename2):\n", " # Fügen Sie hier Ihren Code ein.\n", " pass\n", "\n", "lines = input_lines('Geben Sie einen Text ein: ')\n", "write_lines_to_file(lines, 'eingaben.txt')\n", "copy_textfile_reversed('eingabe.txt', 'umgekehrte_eingaben.txt')\n", "output_files_together('eingaben.txt', 'umgekehrte_eingaben.txt')"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Aufgabengruppe gemischt\n", "**Wichtig:** An den meisten Stellen sind globale Variablen verboten. Sollten Sie also Funktionen schreiben und die Variablen bereits vorhandenen Quellcodes direkt in der Funktion verwenden, ohne diese übergeben bekommen zu haben, ist dies ebenfalls ein Fehler."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das eine Textdatei <code>ein_filter_anfangszeichen.txt</code> einliest und jede Zeile in eine Textdatei <code>aus_filter_anfangszeichen.txt</code> schreibt. Dabei sollen alle Wörter herausgefiltert werden, die mit Buchstaben der Zeichenkette <code>filter_zeichen</code> beginnen. Sie können davon ausgehen, dass die Wörter eines Texts immer nur durch Leerzeichen getrennt sind.\n", "\n", "**Beispiel:**\n", "\n", "<code>filter_zeichen = 'AEIOUaeiou'</code>\n", "\n", "<code>ein_filter_anfangszeichen.txt</code> enthält:\n", "</br>\n", "*Eine Textdatei beginnt mit T*<br/>\n", "*Sie beginnt nicht immer mit a*<br/>\n", "*Aber das ist natürlich auch Quatsch*<br/>\n", "\n", "Nach Aufruf des Programms enthält <code>aus_filter_anfangszeichen.txt</code>:\n", "</br>\n", "*Textdatei beginnt mit T*<br/>\n", "*Sie beginnt nicht mit*<br/>\n", "*das natürlich Quatsch*<br/>\n"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["filter_zeichen = 'AEIOUaeiou' # Die Werte sollen als veränderbar angesehen werden.\n", "\n", "# Fügen Sie hier Ihren Code ein."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Python-Programm, das vom Benutzer solange Eingaben einliest, bis der Benutzer eine leere Eingabe tätigt. Zählen Sie danach die einzelnen Zeichen und speichern Sie das Ergebnis mithilfe eines Dictionaries. Geben Sie schließlich alle eingegebenen Zeichen mit Ihrer Häufigkeit und Ihrem prozentualen Anteil an der Gesamtanzahl an Zeichen aus.\n", "\n", "Implementieren Sie zunächst eine Funktione <code>gib_mehrere_eingaben_ein</code>, die das Einlesen mehrerer Eingaben übernimmt, bis der Benutzer einfach Enter drückt (also eine leere Eingabe tätigt). Die Funktion soll alle Eingaben als eine Zeichenkette zurückgeben.\n", "\n", "Implementieren Sie danach eine Funktion <code>ermittle_haeufigkeiten</code>, die die Eingabezeichenkette von oben übergeben bekommt und daraus ein Dictionary erstellt, das zu jedem Zeichen dessen Anzahl in der Zeichenkette speichert. Die Funktion gibt dieses Dictionary zurück.\n", "\n", "Implementieren Sie schließlich eine Funktion <code>gib_haeufigkeiten_aus</code>, die das Dictionary von oben übergeben bekommt und daraus zu jedem Zeichen die Häufigkeit in der Zeichenkette sowie den prozentualen Anteil zur Gesamtanzahl an Zeichen ausgibt.\n", "\n", "Schreiben Sie keinerlei Code außer die drei geforderten Funktionen. Globale Variablen sind verboten. Zudem muss Ihr Programm mit dem bereits vorhandenen Code laufen. Sie sollen nur die fehlenden Funktionen ergänzen. \n", "\n", "**Beispiel**\n", "\n", "`>> Geben Sie bitte Text ein:` *`aad b`*\n", "<br/>\n", "`>> Geben Sie bitte Text ein:` *`cb`*\n", "<br/>\n", "`>> Geben Sie bitte Text ein:` *`dda`*\n", "<br/>\n", "`>> Geben Sie bitte Text ein:`\n", "<br/>\n", "`Zeichen 'a' kommt so häufig in Ihren Eingaben vor: 3 (30.0 %)`\n", "<br/>\n", "`Zeichen 'd' kommt so häufig in Ihren Eingaben vor: 3 (30.0 %)`\n", "<br/>\n", "`Zeichen ' ' kommt so häufig in Ihren Eingaben vor: 1 (10.0 %)`\n", "<br/>\n", "`Zeichen 'b' kommt so häufig in Ihren Eingaben vor: 2 (20.0 %)`\n", "<br/>\n", "`Zeichen 'c' kommt so häufig in Ihren Eingaben vor: 1 (10.0 %)`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein. Es sind nur die geforderten Funktionen erlaubt. Globale Variablen oder anderer Code außerhalb der Funktionen sind nicht erlaubt.\n", "\n", "# Der untenstehende Code soll sich nicht verändern. Das Programm soll mithilfe Ihrer Funktionen korrekt laufen.\n", "if __name__ == '__main__':\n", " eingabe = gib_mehrere_eingaben_ein()\n", " haeufigkeiten_dict = ermittle_haeufigkeiten(eingabe)\n", " gib_haeufigkeiten_aus(haeufigkeiten_dict)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Schreiben Sie ein Programm, das eine Textdatei <code>studierende.txt</code> mit Studierenden-Daten einliest und die Daten gewünschter Matrikelnummern am Bildschirm ausgibt. Die Textdatei enthält pro Zeile immer die folgende Werte mit einem <code>;</code> getrennt: <code>Matrikelnummer;Vor- und Nachname;Note</code>\n", "\n", "Es soll zudem für jede Ausgabe vermerkt werden, ob die jeweilige Note oberhalb des Notendurchschnitts liegt. Dieser soll am Ende mit ausgegeben werden.\n", "\n", "Schreiben Sie zunächst eine Funktion <code>lies_studierende_ein</code>, die eine Textdatei mit dem übergebenen Namen einliest und das Ergebnis als Dictionary zurückliefert. Der Notendurchschnitt soll hier noch nicht ermittelt werden. Sie können davon ausgehen, dass innerhalb der Zeilen keine Fehler enthalten sind, also die Formatvorgabe immer eingehalten wird. Allerdings sind leere Zeilen möglich.\n", "\n", "Schreiben Sie danach eine Funktion <code>gib_studierenden_daten_aus</code>, die das Dictionary und einen Teil einer Matrikelnummer übergeben bekommt, eine Ausgabe nach untenstehender Vorgabe durchführt und dabei den Notendurchschnitt ermittelt. Sollte die Ausgabe pro Eintrag anders als im Beispiel über zwei Zeilen gehen, ist dies tolerierbar.\n", "\n", "Schreiben Sie keinerlei Code außer die drei geforderten Funktionen. Globale Variablen sind verboten. Zudem muss Ihr Programm mit dem bereits vorhandenen Code laufen. Sie sollen nur die fehlenden Funktionen ergänzen.\n", "\n", "**Hinweis:** Vergessen Sie nicht, dass die Daten einer Textdatei zunächst nur als Zeichenkette ausgelesen werden.\n", "\n", "**Beispiel:**\n", "\n", "Inhalt der Textdatei:\n", "<br/>\n", "<code>1234567;Max Mustermann;1.7<br/>9991231;Helene Meier;1.3<br/>1928374;Frank Müller;3.7<br/>9876123;Maria Schmidt;4.0</code>\n", "\n", "**Ablauf des Programms:**\n", "\n", "`>> Bitte geben Sie den Teil einer Matrikelnummer ein:` *`123`*\n", "<br/>\n", "`Notendurchschnitt: 2.675`\n", "<br/>\n", "`Max Mustermann (1234567) liegt mit 1.7 im Durchschnitt oder besser.`\n", "<br/>\n", "`Helene Meier (9991231) liegt mit 1.3 im Durchschnitt oder besser.`\n", "<br/>\n", "`Maria Schmidt (9876123) liegt mit 4.0 schlechter als der Durchschnitt.`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein. Es sind nur die geforderten Funktionen erlaubt. Globale Variablen oder anderer Code außerhalb der Funktionen sind nicht erlaubt.\n", "\n", "# Der untenstehende Code soll sich nicht verändern. Das Programm soll mithilfe Ihrer Funktionen korrekt laufen.\n", "if __name__ == '__main__':\n", " stud_dict = lies_studierende_ein('studierende.txt')\n", " matrikel_filter = input('Geben Sie den Teil einer Matrikelnummer ein: ')\n", " gib_studierende_aus(stud_dict, matrikel_filter)\n", " "]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Für einen Zoo können Eintritte im Voraus bezahlt werden. Wer dies nutzen will, zeigt seinen Ausweis am Eingang und zahlt für eine bestimmte Anzahl an Besuchen. Bei einem erneuten Eintritt muss nun nur noch der Name aus dem Personalausweis eingelesen werden, bis die maximale Anzahl an Besuchen erreicht ist. Alternativ kann zusätzlich für eine weitere Anzahl an Besuchen vorbezahlt werden. Wer nicht vorbezahlt hat oder keine Besuche mehr auf seinem Konto hat, wird nicht eingelassen.\n", "\n", "Simulieren Sie dieses Szenario, bis eine leere Eingabe erfolgt. Durch die Eingabe des Namens mit einem Plus und einer Zahl kann das Konto entsprechend erhöht bzw. angelegt werden, also z.B. <code>Hans Müller+10</code> würde die Anzahl von Besuchen von Hans Müller um 10 erhöhen bzw. den Account mit 10 Besuchen anlegen und anschließend einen Besuch tätigen. Wird nur der Name angegeben, wird ein Besuch abgezogen oder der Einlass verweigert. Sie können davon ausgehen, dass nur sinnvolle Eingaben getätigt werden, also entweder nur ein Name eingegeben wird oder ein Name mit einem + und einer positiven Zahl eingegeben wird.\n", "\n", "**Beispiel**\n", "`>> Wer geht in den Zoo:` *`Hans Müller+1`*\n", "<br/>\n", "`Eintritt gewährt. Danach haben Sie noch 0 Besuch(e) offen.`\n", "<br/>\n", "`>> Wer geht in den Zoo:` *`Martha Mustermann`*\n", "<br/>\n", "`Eintritt verweigert. Bitte laden Sie Ihren Account auf.`\n", "<br/>\n", "`>> Wer geht in den Zoo:` *`Martha Mustermann+10`*\n", "<br/>\n", "`Eintritt gewährt. Danach haben Sie noch 9 Besuch(e) offen.`\n", "<br/>\n", "`>> Wer geht in den Zoo:` *`Hans Müller`*\n", "<br/>\n", "`Eintritt verweigert. Bitte laden Sie Ihren Account auf.`\n", "<br/>\n", "`>> Wer geht in den Zoo:` *`Hans Müller+15`*\n", "<br/>\n", "`Eintritt gewährt. Danach haben Sie noch 14 Besuch(e) offen.`\n", "<br/>\n", "`>> Wer geht in den Zoo:` *`Hans Müller+5`*\n", "<br/>\n", "`Eintritt gewährt. Danach haben Sie noch 18 Besuch(e) offen.`\n", "<br/>\n", "`>> Wer geht in den Zoo:` *`Martha Mustermann`*\n", "<br/>\n", "`Eintritt gewährt. Danach haben Sie noch 8 Besuch(e) offen.`\n", "<br/>\n", "`>> Wer geht in den Zoo:`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# Fügen Sie hier Ihren Code ein"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### Aufgabe\n", "Vervollständigen Sie untenstehendes Programmfragment, sodass es solange eine Eingabe vom Benutzer einliest, bis dieser eine positive Zahl eingibt. Danach soll der Benutzer eine Eingabe solange tätigen, bis deren Anzahl an Wörtern der vorher eingegebenen Zahl entspricht. Sollten in der Eingabe die Satzzeichen `,;.!?` vorkommen, sollen diese entfernt werden. Es sollen nun genauso viele Zufallszahlen \"gewürfelt\" werden, wie es Wörter gibt. Jede Zufallszahl legt fest, wie häufig jedes entsprechende Wort der Eingabe wiederholt werden soll. Ist die zweite Zufallszahl z.B. eine 3, so soll das zweite Wort 3-mal wiederholt werden. Sie dürfen nur die geforderten Funktionen ergänzen, am Code aber sonst nichts ändern.\n", "\n", "**Beispiel**\n", "\n", "`>> Geben Sie eine positive Zahl ein:` *`bla`*\n", "<br/>\n", "`>> Geben Sie eine positive Zahl ein:` *`-2`*\n", "<br/>\n", "`>> Geben Sie eine positive Zahl ein:` *`7`*\n", "<br/>\n", "`>> Geben Sie einen Text mit 7 Wörtern ein:` *`Mach ich`*\n", "<br/>\n", "`>> Geben Sie einen Text mit 7 Wörtern ein:` *`Mach ich doch! Oder sind das jetzt zu viele Wörter?`*\n", "<br/>\n", "`>> Geben Sie einen Text mit 7 Wörtern ein:` *`Ist das ein Test? Ja, ist es!`*\n", "\n", "`Folgende Zahlen wurden gewürfelt: [4, 6, 1, 3, 3, 3, 3]`\n", "<br/>\n", "`Veränderter Text: Ist Ist Ist Ist das das das das das das ein Test Test Test Ja Ja Ja ist ist ist es es es`"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["import random\n", "\n", "def wuerfel():\n", " return random.randint(1, 6)\n", "\n", "# Fügen Sie hier Ihren Code für die fehlenden Funktionen ein.\n", "\n", "wuerfel_anzahl = gib_zahl_ein('Geben Sie eine positive Zahl ein: ')\n", "eingabe = gib_text_mit_n_woertern_ein(f'Geben Sie einen Text mit {wuerfel_anzahl} Wörtern ein: ', wuerfel_anzahl)\n", "eingabe = entferne_satzzeichen(eingabe, '.,;?!')\n", "zufallszahlen = wuerfel_mehrfach(wuerfel_anzahl)\n", "dupl_text = dupliziere_woerter(eingabe, zufallszahlen)\n", "print(f'Folgende Zahlen wurden gewürfelt: {zufallszahlen}')\n", "print(f'Veränderter Text: {dupl_text}')"]}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.9"}, "toc": {"base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false}, "vscode": {"interpreter": {"hash": "5262627ae68dcea4376de6b1fa6fa990a8f0102ba1998c55b1d43f5e3b907515"}}}, "nbformat": 4, "nbformat_minor": 2}