Benutzer-Werkzeuge

Webseiten-Werkzeuge


schule:programmieruebungen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
schule:programmieruebungen [2019-12-19 16:52] – Übungen zu Fehlern ausgelagert marco.bakeraschule:programmieruebungen [2021-05-06 20:55] (aktuell) – [Links] elevator challenge: link zu py3 version pintman
Zeile 5: Zeile 5:
 ===== Übungen zu Schleifen ===== ===== Ü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? +→ [[Programmierübungen Schleifen]]
  
-Für Profis, dich sich mit [[Rekursion]] auskennen: Man kann die Aufgaben sogar komplett ohne Schleife lösen. 
  
-==== Zahlen bis maximum ====+===== Mini-Projekte =====
  
-Von der Tastatur wird eine Zahl ''maximum'' eingelesen. Anschließend gibt das Programm alle Zahlen von 1 bis ''maximum'' aus.+Die folgenden kleineren Projekte können in kurzer Zeit umgesetzt werden und 
 +zeigen unterschiedliche interessante Aspekte der Programmierung.
  
-  Eingabe: 8 +  * [[BMI-Rechner]] 
-  Ausgabe: 1, 2, 3, 4, 5, 6, 7, 8 +  * [[Notenrechner]] 
- +  * [[Zahlenraten]] 
- +  * [[IBAN]] 
-==== Gerade Zahlen ==== +  * [[FizzBuzz Katas]]
- +
-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 [[wpde>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 ''<>''): 
- 
-<code> 
-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 
-</code> 
-===== 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 ===== ===== Übungen zu Klassen und Objekten =====
  
Zeile 125: Zeile 26:
  
 → [[Programmierübungen Fehler]] → [[Programmierübungen Fehler]]
- 
- 
  
 ===== Schlechter Stil ===== ===== Schlechter Stil =====
  
-Welche stilistischen Probleme erkennst du bei der folgenden Funktion?+Welche stilistischen Probleme erkennst du bei der folgenden Funktion? Nenne möglichst viele 
 +Probleme.
  
 <code python> <code python>
Zeile 166: Zeile 66:
 --></html> --></html>
    
-===== Verschiedene Laufzeiten =====+===== Testgetriebene Entwicklung (TDD) ===== 
 + 
 +→ [[Testgetriebene Entwicklung (Übung)]] 
 + 
 + 
 +===== Unterschiedliche 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. 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.
Zeile 303: Zeile 208:
  
 <file python ttt.py> <file python ttt.py>
 +'''
 +Auf diese Art kann die Klasse verwendet werden:
 +
 +>>> ttt = TicTacToe()
 +>>> ttt.stones
 +{}
 +>>> ttt.place_x_at(1,1)
 +>>> ttt.place_o_at(0,0)
 +>>> ttt.stones
 +{(1, 1): 'x', (0, 0): 'o'}
 +>>> ttt.x_wins()
 +False
 +>>> ttt.o_wins()
 +False
 +>>> ttt.place_x_at(0,1)
 +>>> ttt.place_o_at(1,0)
 +>>> ttt.place_x_at(2,1)
 +>>> ttt.x_wins()
 +True
 +>>> ttt.o_wins()
 +False
 +>>> ttt.stones
 +{(1, 1): 'x', (0, 0): 'o', (0, 1): 'x', (1, 0): 'o', (2, 1): 'x'}
 +'''
 +
 +import doctest
 +
 class TicTacToe: class TicTacToe:
     'A game of tic tac toe.'     'A game of tic tac toe.'
Zeile 325: Zeile 257:
  
  
-# Tests+
  
 ttt = TicTacToe() ttt = TicTacToe()
Zeile 340: Zeile 272:
 assert ttt.x_wins() assert ttt.x_wins()
 assert not ttt.o_wins() assert not ttt.o_wins()
 +
 +doctest.testmod()  # running tests from class documentation
 </file> </file>
  
 <html><!-- <html><!--
 +'''
 +Auf diese Art kann die Klasse verwendet werden:
 +
 +>>> ttt = TicTacToe()
 +>>> ttt.stones
 +{}
 +>>> ttt.place_x_at(1,1)
 +>>> ttt.place_o_at(0,0)
 +>>> ttt.stones
 +{(1, 1): 'x', (0, 0): 'o'}
 +>>> ttt.x_wins()
 +False
 +>>> ttt.o_wins()
 +False
 +>>> ttt.place_x_at(0,1)
 +>>> ttt.place_o_at(1,0)
 +>>> ttt.place_x_at(2,1)
 +>>> ttt.x_wins()
 +True
 +>>> ttt.o_wins()
 +False
 +>>> ttt.stones
 +{(1, 1): 'x', (0, 0): 'o', (0, 1): 'x', (1, 0): 'o', (2, 1): 'x'}
 +'''
 +
 +import doctest
 +
 class TicTacToe: class TicTacToe:
     'A game of tic tac toe.'     'A game of tic tac toe.'
Zeile 351: Zeile 312:
  
     def place_x_at(self, x, y):     def place_x_at(self, x, y):
 +        assert 0 <= x <= 2 and 0 <= y <= 2
         self.stones[(x, y)] = "x"         self.stones[(x, y)] = "x"
  
     def place_o_at(self, x, y):     def place_o_at(self, x, y):
 +        assert 0 <= x <= 2 and 0 <= y <= 2
         self.stones[(x, y)] = "o"         self.stones[(x, y)] = "o"
  
Zeile 402: Zeile 365:
 assert not ttt.o_wins() assert not ttt.o_wins()
  
 +doctest.testmod()  # running tests from class documentation
 --></html> --></html>
-===== IBAN-Prüfsumme ===== 
  
-Die [[wpde>IBAN]] ist eine international standardisierte Notation für Bankkontonummern. Ein Beispiel seht ihr hier. 
- 
-DE**68** 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 [[wpde>IBAN#Validierung_der_Pr.C3.BCfsumme|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 ===== ===== 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.+→ [[Eigenen Quelltext ausgeben]]
  
-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ßnote(( 
-<code python> 
-source = [ 
-    'print("source = [")', 
-    ... 
-] 
- 
-print("source = [") 
-for line in source:   
-    print(line, ",") 
-... 
- 
-</code> 
-)) 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 [[https://cscircles.cemc.uwaterloo.ca/7b-de/|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: 
-<code> 
-1 
-2 
-Fizz 
-4 
-Buzz 
-Fizz 
-7 
-8 
-Fizz 
-Buzz 
-11 
-Fizz 
-13 
-14 
-FizzBuzz 
-16 
-17 
-Fizz 
-19 
-Buzz 
-</code> 
- 
- 
-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 [[https://www.bakera.de/fizzbuzz/|hier]] oder [[http://vihart.com/fifty-fizzbuzzes/|hier]]. 
  
 ===== Katas im Randori-Prinzip ===== ===== Katas im Randori-Prinzip =====
Zeile 529: Zeile 391:
 ===== Links ===== ===== Links =====
  
 +  * Hinter einem [[wpde>Kata (Programmierung)|Kata]] verbirgt sich in der Programmierung eine kleine, abgeschlossene Übung. [[http://codekata.com/|CodeKata]] versammelt eine Reihe interessanter Übungen.
   * [[https://www.practicepython.org/|Practice Python]] enthält verschiedene Übungen für Anfänger.   * [[https://www.practicepython.org/|Practice Python]] enthält verschiedene Übungen für Anfänger.
   * Weitere Übungen zur OOP mit Python gibt es [[https://www.inf-schule.de/modellierung/ooppython/bank/objekteklassen/uebungen|hier]].   * Weitere Übungen zur OOP mit Python gibt es [[https://www.inf-schule.de/modellierung/ooppython/bank/objekteklassen/uebungen|hier]].
Zeile 538: Zeile 401:
   * [[Flagserver]]   * [[Flagserver]]
   * [[https://blog.bakera.de/ein-programm-das-den-eigenen-quelltext-ausgibt.html|Programm, welches den eigenen Quelltext ausgibt]]   * [[https://blog.bakera.de/ein-programm-das-den-eigenen-quelltext-ausgibt.html|Programm, welches den eigenen Quelltext ausgibt]]
 +  * Bei der [[https://github.com/pintman/python-elevator-challenge|Python Elevator Challenge]] muss ein Aufzug in [[Python]] programmiert werden.
 +
 +
schule/programmieruebungen.1576770756.txt.gz · Zuletzt geändert: 2019-12-19 16:52 von marco.bakera