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-22 09:36] – [FizzBuzz Katas] Flagserver verlinkt marco.bakeraschule:programmieruebungen [2021-05-06 20:55] (aktuell) – [Links] elevator challenge: link zu py3 version pintman
Zeile 17: Zeile 17:
   * [[Zahlenraten]]   * [[Zahlenraten]]
   * [[IBAN]]   * [[IBAN]]
 +  * [[FizzBuzz Katas]]
      
 ===== Übungen zu Klassen und Objekten ===== ===== Übungen zu Klassen und Objekten =====
Zeile 28: Zeile 29:
 ===== 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 64: 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 201: 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 223: Zeile 257:
  
  
-# Tests+
  
 ttt = TicTacToe() ttt = TicTacToe()
Zeile 238: 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 249: 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 300: Zeile 365:
 assert not ttt.o_wins() assert not ttt.o_wins()
  
 +doctest.testmod()  # running tests from class documentation
 --></html> --></html>
  
Zeile 305: Zeile 371:
 ===== 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]]. Auf dem [[Flagserver]] gibt es auch eine Übung [[FizzBuzz]] 
  
 ===== Katas im Randori-Prinzip ===== ===== Katas im Randori-Prinzip =====
Zeile 417: 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 426: 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.1577003806.txt.gz · Zuletzt geändert: 2019-12-22 09:36 von marco.bakera