lehrkraefte:blc:informatik:ffprg1-2019:loops-and-conditionals

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:ffprg1-2019:loops-and-conditionals [2019/02/10 10:00] – [Aufgabe 2] Ivo Blöchligerlehrkraefte:blc:informatik:ffprg1-2019:loops-and-conditionals [2019/02/19 15:38] (current) – [Aufgabe 3 (*)] Ivo Blöchliger
Line 1: Line 1:
 +====== Aufgaben ======
 + ===== Aufgabe 1 =====
 +Programmieren Sie das Zahlenrate-Spiel. Der Computer generiert eine (ganze) Geheimzahl zwischen 1 und 100. 
 +<code python>
 +import random
 +geheim = random.randint(1,100)  # Ganzzahl zwischen 1 und 100 (inklusive, was ich ziemlich inkonsistent finde)
 +</code>
 +Der Benutzer darf dann die Zahl erraten. Der Computer meldet:
 +  * ob die Zahl stimmt und gibt die Anzahl benötigter Versuche aus.
 +  * oder ob die geratene Zahl zu gross oder zu klein ist.
 +
 +  - Programmieren Sie das Spiel
 +  - (*) Was ist wohl die optimale Strategie, um die Zahl mit möglichst wenig Versuchen zu erraten?
 +  - (* *) Können Sie ein Programm schreiben, das die durchschnittliche Anzahl Versuche ermittelt, die nötig sind?
 +  - (* * *) Können Sie ein Programm schreiben, das alle optimalen Strategien berechnet?
 +===== Aufgabe 2 =====
 +Wurzeln nur mit Grundoperationen bestimmen. Schreiben Sie eine Funktion, die als Argument eine Zahl x erhält, und eine Schätzung für die Wurzel zurückliefert:
 +<code python>
 +def wurzel(x):
 +  # Magic here
 +  # Schätzung für Wurzel aus x in w speichern
 +  return w  # Resultat zurückgeben 
 +  
 +n = 2
 +w = wurzel(n)
 +print "Wurzel %d ~ %f, (quadriert ~ %f)" % (n, w, w*w)
 +</code>
 +
 +Starten Sie mit einer beliebigen Schätzung w und berechnen Sie x/w. Das eine ist grösser als die Wurzel, das andere kleiner. Sei die neue Schätzung der Durchschnitt der beiden Zahlen. 
 +Wiederholen Sie:
 +  * eine fixe Anzahl mal (z.B. 10 oder 20).
 +  * bis sich das Quadrat um weniger als z.B. 0.000001 unterscheidet (geben Sie auch die Anzahl nötiger Schritte aus).
 +  * bis sich die Schätzung nicht mehr ändert (geben Sie auch die Anzahl nötiger Schritte aus).
 +Testen Sie die Varianten ausführlich mit diversen Grössenordnungen von Radikanden.
 +
 +
 +===== Aufgabe 3 (*)=====
 +Schreiben Sie eine Funktion ''variationen'', das alle möglichen Wörten mit 3 gegebenen Buchstaben ausgibt. Z.B. gibt ''variationen("ABC")'' folgendes aus:
 +
 +AAA
 +AAB
 +AAC
 +ABA
 +ABB
 +ABC
 +ACA
 +ACB
 +ACC
 +BAA
 +BAB
 +BAC
 +BBA
 +BBB
 +BBC
 +BCA
 +BCB
 +BCC
 +CAA
 +CAB
 +CAC
 +CBA
 +CBB
 +CBC
 +CCA
 +CCB
 +CCC
 +
 +
 +Für Fortgeschrittene: 
 +  * (* * *)Schreiben Sie eine Funktion, die für beliebige viele unterschiedliche Buchstaben funktioniert.
 +  * (* * *) Schreiben Sie eine Funktion, die alle Permutationen liefert (jeder Buchstabe kommt nur genau einmal in jedem Wort vor).
 +
 +<hidden Hilfestellungen>
 +Die Funktion ruft sich selbst auf, jeweils mit den noch zu vergebenen Buchstaben, und einem Wort, das schon teilweise aufgebaut ist. 
 +
 +Ist das teilweise aufgebaute Wort vollständig, wird es ausgegeben.
 +
 +Andernfalls, wird das teilweise aufgebaute Wort um je einen der möglichen Buchstaben erweitert und für jede Erweiterung die Funktion wieder selbst aufgerufen.
 +</hidden>
 +====== True und False ======
 +Das Resultat eines Vergleichs ist True (wahr) oder False (falsch). Wahrheitswerte können mit
 +  * and, or und not verknüpft werden.
 +  * ^ steht für xor (entweder oder) (es könnte auch != (ungleich) verwendet werden)
 +
 +====== Vergleichsoperatoren ======
 +  * == (Gleichheit)
 +  * <, <=, >=, > (Kleiner, kleiner gleich, grösser gleich, grösser)
 +
 +====== For-Schleife (Anzahl Wiederholungen bekannt, inkl. Laufvariable) ======
 +<code python>
 +for i in range(10):
 +  print i   # Gibt Zahlen von 0 bis und mit 9 aus.
 + 
 +for i in range(10,20):
 +  print i   # Gibt Zahlen von 10 bis und mit 19 aus.
 +</code>
 +
 +for i in range(30,100,3):
 +  print i   # Gibt Zahlen in 3er-Schritten von 30 bis und mit 99 aus
 +
 +for i in (2,3,5,7,11,13,17):
 +  print i   # Gibt die Zahlen in der Liste aus
 +</code>
 +
 +====== While-Schlaufe (Anzahl Wiederholungen typischerweise unbekannt) ======
 +<code python>
 +z = 1000
 +w = 1
 +while w*w<z:  # Wiederholen, so lange wie eine Bedingung wahr ist (ACHTUNG: Wird oft invertiert!)
 +  w+=1
 +print "Wurzel %d liegt zwischen %d und %d" % (z, w-1, w)
 +</code>
 +
 +====== Lösungsvorschläge ======
 +<hidden Lösungsvorschläge>
 +<code python>
 +def permutationen(s, prefix=""):
 +    if s=="":
 +        print prefix
 +    else:
 +        for i in range(len(s)):
 +            permutationen(s[0:i]+s[i+1:len(s)], prefix+s[i])
 +            
 +
 +def variationen(s, prefix=""):
 +    if len(s)==len(prefix):
 +        print prefix
 +    else:
 +        for i in range(len(s)):
 +            variationen(s,prefix+s[i])
 +
 +permutationen("ABC")
 +variationen("ABC")
 +</code>
 +</hidden>