lehrkraefte:blc:informatik:ffprg1-2020:funktionen

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-2020:funktionen [2020/02/22 12:01]
Ivo Blöchliger [Permutationen erzeugen]
lehrkraefte:blc:informatik:ffprg1-2020:funktionen [2022/06/23 12:58] (current)
Ivo Blöchliger [Sudoku parsen]
Line 5: Line 5:
  
 ===== Theorie ===== ===== Theorie =====
-Unterpogramme geben keine Werte zurück, z.B.+Unterprogramme geben keine Werte zurück, z.B.
 <code python> <code python>
 def hello(wer):  # Definition des Unterprogramms, führt noch nichts aus! def hello(wer):  # Definition des Unterprogramms, führt noch nichts aus!
Line 35: Line 35:
     return a     return a
          
-def kompliziert(a,b)+def kompliziert(a,b):
    a = summe(a,b)    a = summe(a,b)
    b = produkt(a,b)    b = produkt(a,b)
Line 59: Line 59:
     * Zwei Buchstaben in einem Wort vertauschen     * Zwei Buchstaben in einem Wort vertauschen
   * Den neuen Text zusammensetzen.   * Den neuen Text zusammensetzen.
- 
-<code python buchstabenvertauschen.py> 
-import random 
- 
-# Vertauscht zwei Buchstaben an der Stelle i und j im Wort und gibt das Resultat zurueck 
-def buchstabenTauschen(wort, i, j): 
-    pass  # Das ist zu ersetzen 
- 
-# Bestimmt zwei Positionen im Wort, um die Buchstaben zu verstauschen, ruft obige Funktion auf, und gibt das neue Wort als Resultat zurueck. 
-def buchstabenWuerfeln(wort): 
-    # Hier fehlt der Code, der i und j bestimmt. 
-    return buchstabenVertauschen(wort, i, j) 
- 
-# Diese Funktion kann noch ausgebaut werden (z.B. mehr Vertauschungen fuer laengere Woerter 
-def wortWuerfeln(wort): 
-    wort = buchstabenTauschen(wort) 
-    return wort 
- 
-# Entscheidet, ob ein Buchstabe zu einem Wort gehoert oder nicht und liefert True oder False (das Resultat eines Vergleichs) zurueck 
-def wortTeil(b): 
-    pass # Ersetzen durch Ihren Code 
- 
-# Den Text Position um Position durchgehen, schauen, ob der Buchstaben zu einem Wort gehoehrt, das Wort verlaengern und wenn das Wort fertig ist, das Wort verwuerfeln 
-def textWuerfeln(text): 
-    pass # Ersetzen! 
- 
-mytext = "Sie kennen sicher die Tatsache, dass man Text auch gut lesen kann, wenn die Buchstaben innerhalb der Woerter vertauscht werden, vorausgesetzt, der erste und letzte Buchstabe bleibt gleich. Ziel ist es, dieses Programm zu schreiben und die einzelnen Aufgaben in Funktionen zu verpacken." 
- 
-print(textWuerfeln(mytext)) 
-</code> 
  
 <hidden Lösungsvorschlag> <hidden Lösungsvorschlag>
Line 103: Line 73:
     if len(wort)<4:     if len(wort)<4:
         return wort         return wort
-    i = random.randint(1,len(wort)-3+    i = random.randint(1,len(wort)-2 # Zufällige Position von zweitem bis zweit-letztem Buchstaben 
-    j = random.randint(1,len(wort)-3) +    j = random.randint(1,len(wort)-3)  # Aus den n-3 verbleibenden Positionen eine auswählen 
-    if (j==i):+    if (j==i):  # Zufällig die gleiche Position erwischt? Also j um eins erhöhen.
         j+=1         j+=1
-    return buchstabenVertauschen(wort, i, j)+    return buchstabenTauschen(wort, i, j)
  
 def wortWuerfeln(wort): def wortWuerfeln(wort):
-    wort = buchstabenTauschen(wort)+    wort = buchstabenWuerfeln(wort)
     if (len(wort)>8):     if (len(wort)>8):
-        wort = buchstabenTauschen(wort)+        wort = buchstabenWuerfeln(wort)
     return wort     return wort
  
Line 151: Line 121:
     for element in a:     for element in a:
         s+=element         s+=element
 +    return s
 +    
 +a = list(range(1,11))
 +print(a)
 +print(summe(a))
 +
 </code> </code>
 </hidden> </hidden>
  
 ===== Tic-Tac-Toe schön ausgeben ===== ===== Tic-Tac-Toe schön ausgeben =====
 +
 +Hinweis: Diese Aufgabe gibt auch als [[lehrkraefte:blc:informatik:ffprg1-2020:funktionen-mit-klassen#tic_tac_toe|Aufgabe mit Klassen, inklusive Ausbaumöglichkeiten]].
 +
 Ein Tic-Tac-Toe Feld kann mit einem 3x3-Array dargestellt werden. Wir verwenden 0,1,2 als Einträge (leer, Kreis, Kreuz). Ein Tic-Tac-Toe Feld kann mit einem 3x3-Array dargestellt werden. Wir verwenden 0,1,2 als Einträge (leer, Kreis, Kreuz).
 Hier ein Beispiel: Hier ein Beispiel:
Line 160: Line 139:
 feld = [[0,1,1], [2,1,2], [0,2,2]] feld = [[0,1,1], [2,1,2], [0,2,2]]
 </code> </code>
-Wobei feld[2][0] die recht obere Ecke sein soll. Die Unter-Arrays stellen Spalten dar!+Wobei feld[2][0] die rechte obere Ecke sein soll. Die Unter-Arrays stellen Spalten dar!
  
 Schreiben Sie eine Funktion, die ein 3x3-Feld als Parameter bekommt, und einen String (inklusive Zeilenumbrüche "\n") als return-Wert generiert. Schreiben Sie eine Funktion, die ein 3x3-Feld als Parameter bekommt, und einen String (inklusive Zeilenumbrüche "\n") als return-Wert generiert.
Line 172: Line 151:
  O | X | X   O | X | X 
 </code> </code>
-Hinweis: Verwenden Sie ein Array, um die möglichen Symbole festzulegen. Der Eintrag im Array liefert dann den Index vom Symbol.+Hinweis: Verwenden Sie ein Array, um die möglichen Symbole festzulegen. Der Eintrag im Spielfeld-Array liefert dann den Index vom Symbol.
  
 <hidden Lösungsvorschlag> <hidden Lösungsvorschlag>
 +<code python tictactoe.py>
 feld = [[0,1,1], [2,1,2], [0,2,2]] feld = [[0,1,1], [2,1,2], [0,2,2]]
  
Line 191: Line 171:
  
 print(ascii(feld)) print(ascii(feld))
 +</code>
 </hidden> </hidden>
  
 ===== Sudoku parsen ===== ===== Sudoku parsen =====
 +
 +Hinweis: Diese Aufgabe gibt auch mit einer [[lehrkraefte:blc:informatik:ffprg1-2020:funktionen-mit-klassen#sudoku|Klasse und Ausbaumöglichkeiten]].
 +
 Gegeben ist ein String, der ein Sudoku darstellt. Die Regeln sind wie folgt: Gegeben ist ein String, der ein Sudoku darstellt. Die Regeln sind wie folgt:
   * Eine Ziffer von 1 bis 9 stellt ein gegebenes Feld dar.   * Eine Ziffer von 1 bis 9 stellt ein gegebenes Feld dar.
   * Eine Ziffer 0 oder ein . stellt ein leeres Feld dar.   * Eine Ziffer 0 oder ein . stellt ein leeres Feld dar.
-  * Alle anderen Zeichen werden komplett ignoriert, so dass 81 Zeichen übrigbleiben. Diese Stellen die Einträge zeilenweise von links nach rechts dar.+  * Alle anderen Zeichen werden komplett ignoriert, so dass 81 Zeichen übrigbleiben. Diese stellen die Einträge zeilenweise von links nach rechts dar.
  
 Ihre Aufgabe ist es daraus ein 9x9 - Array mit **Zahlen** (nicht Strings) von 0-9 zu erzeugen, wobei der Eintrag 0 für ein leeres Feld steht. Die Unter-Arrays stellen Spalten dar! Ihre Aufgabe ist es daraus ein 9x9 - Array mit **Zahlen** (nicht Strings) von 0-9 zu erzeugen, wobei der Eintrag 0 für ein leeres Feld steht. Die Unter-Arrays stellen Spalten dar!
Line 205: Line 189:
 sudoku1 = "003020600900305001001806400008102900700000008006708200002609500800203009005010300" sudoku1 = "003020600900305001001806400008102900700000008006708200002609500800203009005010300"
 sudoku2 = "200080300\n060070084\n030500209\n000105408\n\n000000000\n402706000\n301007040\n720040060\n004010003" sudoku2 = "200080300\n060070084\n030500209\n000105408\n\n000000000\n402706000\n301007040\n720040060\n004010003"
-sodoku3 = "......9.7\r\n...42.18.\r\n...7.5.26\r\n1..9.4...\r\n.5.....4.\r\n...5.7..9\r\n92.1.8...\r\n.34.59...\r\n5.7......"+sudoku3 = "......9.7\r\n...42.18.\r\n...7.5.26\r\n1..9.4...\r\n.5.....4.\r\n...5.7..9\r\n92.1.8...\r\n.34.59...\r\n5.7......"
 </code> </code>
 Ausgaben: Ausgaben:
Line 336: Line 320:
  
 def permutationen(n): def permutationen(n):
-    return vertausche([i for i in range(n)])+    return vertausche(list(range(n)))
  
 print(permutationen(3)) print(permutationen(3))
Line 351: Line 335:
         res += map(lambda x : [first]+map(lambda e: (e+1 if e>=first else e), x), permutationen(n-1))         res += map(lambda x : [first]+map(lambda e: (e+1 if e>=first else e), x), permutationen(n-1))
     return res     return res
 +
 +print(permutationen(4))
 +</code>
 +
 +Umwandlung des Index der lexikografischen Ordnung der Permutation:
 +<code python permutation_number.py>
 +def factorial(n):
 +    r = 1
 +    for i in range(2,n+1):
 +        r*=i
 +    return r
 +
 +# Berechnet die n-te Permutation vom Array a (nummeriert von 0 bis n!-1)
 +def num2perm(num, a):
 +    if len(a)==1:
 +        return a
 +    total = factorial(len(a)-1)
 +    first = num//total  # Erste Stelle
 +    rest = num % total  # Nummer der restlichen Permutation
 +    return [a[first]] + num2perm(rest, a[:first]+a[(first+1):])
 +
 +def permutationen(n):
 +    a = list(range(n))
 +    return [num2perm(j,a) for j in range(factorial(n))]
  
 print(permutationen(4)) print(permutationen(4))
 </code> </code>
 </hidden> </hidden>
 +
  
  • lehrkraefte/blc/informatik/ffprg1-2020/funktionen.1582369271.txt.gz
  • Last modified: 2020/02/22 12:01
  • by Ivo Blöchliger