source = [ 'print("source = [")', ... ] print("source = [") for line in source: print(line, ",") ...
Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Programmierübungen
Programmieren lernt man am besten durch Programmieren. Nicht durch das Zugucken, auch nicht durch das Lesen von Büchern und Webseiten, und auch nicht durch das Schauen von Videos.
Übungen zu Schleifen
Bei den folgenden Aufgaben ist die Lösung mit einer for-Schleife einfach zu erstellen. Kannst du sie auch mit einer while-Schleife lösen?
Für Profis, dich sich mit Rekursion auskennen: Man kann die Aufgaben sogar komplett ohne Schleife lösen.
Zahlen bis maximum
Von der Tastatur wird eine Zahl maximum
eingelesen. Anschließend gibt das Programm alle Zahlen von 1 bis maximum
aus.
Eingabe: 8 Ausgabe: 1, 2, 3, 4, 5, 6, 7, 8
Gerade Zahlen
Von der Tastatur wird eine Zahl maximum
eingelesen. Anschließend gibt das Programm alle geraden Zahlen von 0 bis maximum
aus.
Eingabe: 6 Ausgabe: 0, 2, 4, 6
Hoch- und Runterzählen
Das Programm gibt die Zahlen von 1 bis 10 und dahinter die Zahlen von 10 bis 1 aus. Es zählt also einmal rauf und dann wieder runter. Versuche, nur eine for-Schleife zu verwenden.
Ausgabe: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
Sternenreihe
Schreiben Sie ein Programm, das zunächst die Eingabe einer positiven Zahl anzahl
über die Tastatur erwartet. Anschließend soll das Programm anzahl-mal ein Sternchen (*) auf den Bildschirm ausgeben.
Beispielablauf des Programms (Benutzereingaben in <>):
Anzahl (>0): <8> ********
Sternentreppe
Schreiben Sie ein Programm, das nach Eingabe einer positiven Zahl hoehe
eine Treppe der im folgenden Beispielprogramm skizzierten Form auf den Bildschirm ausgibt. Die Treppe soll aus hoehe-Zeilen bestehen.
Beispielablauf des Programms (Benutzereingaben in <>):
Hoehe (>0): <5> * ** *** **** *****
Sternendreieck
Schreiben Sie ein Programm, das nach Eingabe einer ungeraden Zahl basislaenge
ein Sterndreieck auf den Bildschirm ausgibt. Die unterste Reihe soll dabei aus basislaenge
Sternchen bestehen.
Beispielablauf des Programms (Benutzereingaben in <>):
Basislaenge (>0 und ungerade): <9> * *** ***** ******* *********
BMI-Rechner
Der Body-Mass-Index (BMI) ist eine Maßzahl für die Bewertung des Körpergewichts eines Menschen. Der BMI berechnet sich aus dem Körpergewicht [kg] dividiert durch das Quadrat der Körpergröße [m²]. Die Formel lautet: BMI = Körpergewicht / (Körpergröße in m)². Die Einheit des BMI ist demnach kg/m². Implementieren Sie einen BMI-Rechner.
Beispielablauf des Programms (Benutzereingaben in <>):
Bitte geben Sie Ihr Gewicht ein (in kg): <75> Bitte geben Sie ihre Größe ein (in m): <1.81> BMI = 22.89307408198773
Notenrechner
Der Notenrechner berechnet die Note bei Eingabe der Gesamtpunktzahl und der erreichten Punkte nach dem IHK-Schlüssel.
Note | ab |
---|---|
1 | 92% |
2 | 81% |
3 | 67% |
4 | 50% |
5 | 30% |
Beispielablauf eines Programms (Nutzereingaben in <>
):
Maximale Punktzahl: <10> Note ab 1 9.2 2 8.1 3 6.7 4 5.0 5 3.0 6 0.0 Maximale Punktzahl: <5> Note ab 1 4.6 2 4.05 3 3.35 4 2.5 5 1.5 6 0.0
Zahlenraten
Bei dem Spiel Zahlenraten geht es darum, möglichst schnell eine Zahl zwischen 0 und 100 zu erraten, die sich der Computer zufällig ausgedacht hat. Man kann dem Computer immer wieder eine Zahl nennen und er antwortet jeweils mit Die gesuchte Zahl ist kleiner oder Die gesuchte Zahl ist größer oder Richtig geraten.
Erstelle ein Programm, mit dem du das Spiel gegen den Computer spielen kann.
Tipp: Eine Zufallszahl zwischen a und b kann in Python mit import random
und dann mit random.randint(a, b)
erzeugt werden.
Übungen zu Klassen und Objekten
Fehler-Erzeuger
Erzeuge die folgenden Fehlermeldungen mit Hilfe kleiner Programme und erläutere, was die Ursache des Fehlers ist oder sein könnte.
- NameError: name 'math' is not defined
- TypeError: unsupported operand type(s) for +: 'int' and 'str'
- SyntaxError: invalid syntax
- IndentationError: expected an indented block
- AttributeError: 'Person' object has no attribute 'speed'
- TypeError: move_faster() missing 1 required positional argument: 'new_speed'
Fehler-Erzeuger 2
Versuche, so viele unterschiedliche(!) Fehler wie möglich zu erzeugen. Welche Arten von Fehlern kann du produzieren? Kannst du sie gruppieren?
Exception-Erzeuger
Erstelle ein Programm, das den folgenden Stacktrace produziert. Schaffst du es auch, die korrekten Zeilennummern zu verwenden?
Traceback (most recent call last): File "circle.py", line 22, in <module> circ.area() File "circle.py", line 8, in area return self.get_radius() ** 2 * math.pi File "circle.py", line 11, in get_radius self.check_radius_sign() File "circle.py", line 17, in check_radius_sign raise Exception("Radius is negative:" + str(self.radius)) Exception: Radius is negative:-3
Schlechter Stil
Welche stilistischen Probleme erkennst du bei der folgenden Funktion?
def handleStuff(inputRec, crnQtr, empRec, estimRevenue, ytdRevenue, screenx, screeny, newColor, prevColor, status, expenseType): for i in range(100): inputRec[i] = 0 inputRec[i] = corpExpense[ crnQtr ][ i]; UpdateCorpDatabase(empRec) estimRevenue = ytdRevenue * 4.0 / double(crnQtr) newColor = prevColor status = SUCCESS if expenseType == 1: for i in range(12): profit[i] = revenue[i] - expense.type2[i] elif expenseType == 2: profit[i] = revenue[i] - expense.type2[i] elif expenseType == 3: profit[i] = revenue[i] - expense.type3[i]
Verschiedene Laufzeiten
Erstelle die Funktionen, linear(n), quadratic(n), cubic(n), exponential(n), die in Abhängigkeit von n eine lineare, quadratische, kubische oder exponentielle Laufzeit haben.
Das bedeutet: wenn linear(10) eine Laufzeit von 10 Sekunden hat, dann hat quadratic(10) eine Laufzeit von 10*10=100 Sekunden, cubic(10) eine Laufzeit von 10*10*10=1000 Sekunden und exponential(10) eine Laufzeit von 2^10 = 1024 Sekunden.
n | Methode | Laufzeit in Sekunden |
---|---|---|
10 | linear | 10 |
quadratic | 100 | |
cubic | 1000 | |
exponential | 1024 | |
20 | linear | 20 |
quadratic | 400 | |
cubic | 8000 | |
exponential | 1048576 | |
50 | linear | 50 |
quadratic | 2500 | |
cubic | 125000 | |
exponential | 1125899906842624 |
Tic Tac Toe
Ergänze eine Gewinnüberprüfung für das Spiel TicTacToe in der folgenden Klasse. Programmiere dafür die Methoden `x_wins` und `o_wins`.
- ttt.py
class TicTacToe: 'A game of tic tac toe.' def __init__(self): # mapping (x,y) to 'x' or 'o' self.stones = {} def place_x_at(self, x, y): assert 0 <= x <= 2 and 0 <= y <= 2 self.stones[(x, y)] = "x" def place_o_at(self, x, y): assert 0 <= x <= 2 and 0 <= y <= 2 self.stones[(x, y)] = "o" def x_wins(self): 'Return whether player x has three in a row.' def o_wins(self): 'Return whether player o has three in a row.' # Tests ttt = TicTacToe() ''' o.x xxo x.o ''' for x, y in [(2, 0), (1, 0), (1, 1), (0, 2)]: ttt.place_x_at(x, y) for x, y in [(0, 0), (2, 1), (2, 2)]: ttt.place_o_at(x, y) assert len(ttt.stones) == 7 assert ttt.x_wins() assert not ttt.o_wins()
IBAN-Prüfsumme
Die IBAN ist eine international standardisierte Notation für Bankkontonummern. Ein Beispiel seht ihr hier.
DE68 2105 0170 0012 3456 78
Sie wird z.B. bei Überweisungen verwendet, um das Empfängerkonto anzugeben. Diese IBAN hat im vorderen Bereich zwei Prüfziffern, mit denen geprüft werden kann, ob die IBAN korrekt eingetragen wurde.
- Schaue dir den Abschnitt zur Validierung der Prüfsumme an.
- Schreibe ein Programm, das eine IBAN überprüft und ausgibt, ob eine eingegebene IBAN korrekt ist oder nicht.
- (schwieriger) Schreibe ein Programm, dass eine Prüfziffer berechnet.
Programm, das den eigenen Quelltext ausgibt
Schreibe ein Programm, das den eigenen Quelltext ausgibt. Dabei darf nicht auf Dateioperationen zurückgegriffen werden. Sonst wäre es zu einfach. Dann könnte man einfach nur die Datei ausgeben, die den Quelltext enthält.
Das schöne an dieser Aufgabenstellung ist, dass sie zunächst sehr einfach und nach ein paar Versuchen faktisch unmöglich erscheint.
Versuche dich selbst an einem Python-Programm, das den eigenen Quelltext ausgibt.
Wenn du keinen Ansatz findest, kann du den (unvollständigen) Quelltext aus der Fußnote1) nutzen.
FizzBuzz Katas
Bei dem FizzBuzz-Spiel werden die Zahlen von 1 bis 100 durchlaufen. Nun können folgende Fälle eintreten:
- Wenn die Zahl durch 3 teilbar ist, wird „Fizz“ ausgegeben
- wenn sie durch 5 teilbar ist, wird „Buzz“ ausgegeben und
- wenn sie durch 3 und 5 teilbar ist, wird „FizzBuzz“ ausgegeben.
- Tritt keiner dieser Fälle ein, wird die Zahl ausgegeben.
Ob eine Zahl durch eine andere Zahl teilbar ist, kann mit Hilfe des Modulo-Operators (oder Restwert-Operator) %
herausgefunden werden. Er berechnet den Divisionsrest: 10 % 3
ist 1, da 10 geteilt durch 3 genau 3 Rest 1 ergibt.
Die ersten 20 Ausgaben sehen wir folgt aus:
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz
Versuche das Problem nun auf unterschiedliche Arten in den folgenden Katas (Übungen) zu lösen:
- auf Papier
- mit einer Methode
- ohne Verwendung einer Schleife (rekursiv)
- mit Hilfe von nebenläufigen Threads
- mit einer anderen IDE
- in einer anderen Programmiersprache
- als Client-Server Anwendung
- mit einer grafischen Oberfläche (GUI)
- Objekt-Orientiert: Klassen und Objekte verwenden
- objekt-orientiert mit Vererbung
- funktional mit map, reduce und lambda-Ausdrücken
- als Webanwendung (mit bottle)
- in git-repo einchecken
- als installierbares Programm
- als getestetes Programm (mit unittest und doctests)
- mit einem EA-Modul ansteuern
- mit Anbindung an eine Datenbank
- mit Dokumentation
- als Chatbot (z.B. mit sopel https://sopel.chat/)
- auf einem Cluster (mit GNU parallel)
- in einem UML-Aktivitätsdiagramm
- in einem UML-Sequenzdiagramm
- in einem UML-Klassendiagramm
- Als IOT-Anwendung mit einem Message-Broker (MQTT)
- Mit Kommandozeilenparametern
- Mit einer Konfigurationsdatei
- Als Web-Service mit REST-API
- In einer MVC-Architektur
- Als Spiel (mit pygame)
- In einem docker Container
- Mit Fehlerbehandlung
- Mit einem neuronalen Netzwerk
- Mit logging in ein logfile
- Mit einem Profiler
- Mit einer geplotteten Visualisierung
Mögliche Lösungen für die Katas befinden sich hier oder hier.
Katas im Randori-Prinzip
Ein Coding Dojo ist eine Form der gezielten kollaborativen Übung für Softwerker, bei der wir voneinander lernen und zusammen eine interessante Programmieraufgabe lösen können.
Es arbeiten immer zwei Leute an einem Computer und programmieren zusammen testgetrieben (TDD) und im Pair (Driver + Navigator). Die Zuschauer können via Beamer das Entwickeln verfolgen und den Programmierenden Anregungen und Tipps geben.
Nach ein paar Minuten (Timebox) rotieren wir weiter (Randori Prinzip):
Einer der Programmierenden kehrt ins Publikum zurück, ein weiterer Zuschauer rückt aus dem Publikum nach. So kann jeder zur Lösung beitragen und von möglichst vielen Leuten lernen.
Welches Code Kata wir wählen, also welcher Problemstellung wir uns an diesem Abend widmen, entscheiden wir gemeinsam in der Gruppe.
(Quelle: Softwerkskammer)
Links
- Practice Python enthält verschiedene Übungen für Anfänger.
- Weitere Übungen zur OOP mit Python gibt es hier.
- Project Euler ist eine Sammlung mathematischer Aufgaben und Programmierübungen für unterschiedliche Programmiersprachen. Es gibt viele Lösungen, die in einem Forum gesammelt werden.
- Wer der englischen Sprache mächtig ist, findet bei RosettaCode eine Vielzahl von Programmieraufgaben inklusive Lösungen in vielen verschiedenen Programmiersprachen.
- codewars enthält verschiedene Übungen für verschiedene Sprachen und einem Forum, um die Lösungen zu diskutieren.
- Advent Of Code stellt jedes Jahr im Dezember im Stile eines Adventskalenders an jedem Tag ein neues Programmierproblem vor, das mit einer beliebigen Programmiersprache gelöst werden kann. Die Aufgabenschwierigkeit reicht von leicht bis knackig.