Skip to content

Repetition

Programmieren

Flussdiagramme

Aufgabe: Flussdiagramme zum Programmcode

Zu folgendem Programmcode existieren drei Flussdiagramme. Doch es hat sich überall ein Fehler eingeschlichen.

  1. Notiere die problematischen Stellen und die nötige Korrektur.
  2. Was wird hier berechnet? Beschreibe möglichst kurz und präzise!
  3. Woran hat der/die Programmierer*in nicht gedacht? Was kann schiefgehen? Wie könnte man das Problem beheben?
Lösung: Flussdiagramme zum Programmcode
  1. Problematische Stellen:
  • bei 2 wird zahl=0 zu spät (in der Schleife) auf gerufen
  • bei 1 sind ja und nein vertauscht (bei while)
  • bei 3 ist unklar wie es nach der Schleife weitergeht (verzweigung ohne Bedingung)
  1. Was berechnet wird:
    Wir verschieben print(resultat) in die Schleife rein. Dann sehen wir wie das Resultat wächst:
python
print("Gib eine Zahl ein: ")
eingabe = int(input())
resultat = 0
zahl = 0
while zahl != eingabe:
    resultat = resultat + zahl
    print(resultat)
    zahl = zahl + 1

Es werden alle Zahlen bis zur, aber ohne eingegebener Zahl zusammengezählt!

  1. Was schiefgehen kann:
    Jemand gibt eine negative Zahl ein. Weil zahl bei 0 startet wird die Bedingung zahl != eingabe nie erfüllt sein. Wir landen in einer Endlosschleife!

Aufgabe: Flussdiagramm zeichnen

  1. Was macht das Programm?
  2. Zeichne zu folgendem Programmcode ein Flussdiagramm.
Lösung: Flussdiagramm zeichnen
  1. Es gibt die Wurzel der Zahl aus, falls eine ganzzahlige Wurzel exisitert (die Zahl eine Quadratzahl ist). Sonst wird nichts ausgegeben.
python
print("Gib eine Zahl ein: ")
a = int(input())
b = 1
while b < a:
    if b * b == a:
        print(b)
    b = b + 1

Fehler finden

Aufgabe: Fehler im Programmcode

Im folgenden Programmcode verstecken sich drei Syntax-Fehler (also Rechtschreibefehler oder Tippfehler). Die angezeigten Fehlermeldungen können helfen, die Fehler zu lokalisieren. Einer der drei Fehler wurde jedoch nicht erkannt, führt aber beim Programmstart zu einem Absturz.

Lösung
Zeile 3
Text ohne Anführungszeichen print("Pythagoras")
Zeile 6
Zuweisung mit Gleich und nicht Doppelpunkt: a = int(input())
Zeile 12
nach dem if kommt ein Doppelpunkt!

Zusatzaufgabe

Nachdem die drei Syntax-Fehler der letzten Aufgabe behoben sind und das Programm ohne Fehlermeldung/Absturz ausgeführt wird, zeigt sich aber noch ein weiterer Fehler, der zu einer falschen Ausgabe führen kann. Findest du ihn?

Lösung: Zusatzaufgabe

Wenn man eine falsche Eingabe macht, wird zuunterst trotzdem die Antwort ausgegeben, was aber zu einem Fehler führt, da c gar nicht definiert ist.

Man müsste also korrekterweise das letzte print nur ausführen, wenn die Eingabe korrekt war und c berechnet ist!

python
import math

print("Pythagoras")

print("Gib die Länge der Seite a ein:")
a = int(input())

print ("Gib die Länge der Seite b ein:")
b = int(input())

if a <= 0 or b <= 0:
    print ("Fehler: Die Seitenlänge darf nicht 0 oder kleiner sein!")
else:
    c = math.sqrt(a*a + b*b)
    print("Die Länge der Seite c lautet: " + str(c))

Aufgaben zu Verzweigungen

Aufgabe: a

Der Benutzer gibt eine positive Zahl ein. Das Programm gibt Folgendes aus:

  • «einstellig», wenn die Zahl kleiner als 10 ist,
  • «unbekannt» sonst.
Lösung: a
python
print("Gib eine positive Zahl ein:")
zahl = int(input())

if zahl < 10:
    print("einstellig")
else:
    print("unbekannt")

Aufgabe: b

Baue zwei zusätzliche Fallunterscheidungen ein:

  • «einstellig», wenn die Zahl kleiner als 10 ist,
  • «zweistellig», wenn die Zahl kleiner als 100 ist,
  • «dreistellig», wenn die Zahl kleiner als 1000 ist,
  • «unbekannt» sonst.
Lösung: b
python
print("Gib eine positive Zahl ein:")
zahl = int(input())

if zahl < 10:
    print("einstellig")
elif zahl < 100:
    print("zweistellig")
elif zahl < 1000:
    print("dreistellig")
else:
    print("unbekannt")

Aufgabe: c

Der Benutzer soll eine Zahl zwischen 50 und 100 eingeben. Überprüfe, ob er sich korrekt verhalten hat und gibt sonst eine Fehlermeldung aus.

Lösung: c
python
print("Gib eine Zahl zwischen 50 und 100 ein:")
zahl = int(input())

if zahl < 50:
    print("Zahl ist zu klein")
elif zahl > 100:
    print("Zahl ist zu gross")

Aufgabe: d

Der Benutzer soll zwei Zahlen eingeben. Das Programm rechnet die Summe der beiden Zahlen aus, aber nur, wenn diese beide positiv sind.

Lösung: d
python
print("Gib eine Zahl ein:")
zahl1 = int(input())

print("Gib eine zweite Zahl ein:")
zahl2 = int(input())

if zahl1 > 0 and zahl2 > 0:
    summe = zahl1 + zahl2
    print("Die Summer der beiden Zahlen lautet: " + str(summe))

Aufgaben zu Schleifen

Aufgabe: a

Das Programm soll 10x denselben Satz ausgeben.

Lösung: a
python
for i in range(10):
    print("Hallo Welt")

Aufgabe: b

Gib alle Zahlen von 0 bis 99 aus. (Zusatzaufgabe: wie würde man die Zahlen von 1 - 100 ausgeben?)

Lösung: b
python
for zahl in range(100):
    print(str(zahl))

# Zusatzaufgabe
for zahl in range(100):
    print(str(zahl + 1))
# oder
for zahl in range(1,101):
    print(str(zahl))

Aufgabe: c

Der Benutzer soll die Anfangs- und Endzahl wählen können. Das Programm gibt alle von der Anfangs- (inklusive) bis zur Endzahl (exklusive) aus.

Lösung: c
python
print("Gib eine Zahl ein:")
zahl1 = int(input())

print("Gib eine grössere Zahl ein:")
zahl2 = int(input())

for zahl in range(zahl1, zahl2):
    print(str(zahl))

Kombinierte Aufgaben

Aufgabe: Passwort

Im untenstehenden Programm hat der Benutzer 3 Versuche, um ein korrektes Passwort einzugeben. (der Befehl break beendet die for-Schleife)

python
passwort = "geheim"

for versuch in range(3):
    print("Passwort eingeben")
    eingabe = input()

    if eingabe == passwort:
        print("Zugriff gewährt")
        break
    else:
        print("Zugriff verweigert")

Erweitere das Programm so, dass gezählt und ausgegeben wird, wie viele Versuche der Benutzer bis zur korrekten Eingabe des Passwortes braucht.

Lösung: Passwort
python
passwort = "geheim"

for versuch in range(3):
    print("Passwort eingeben")
    eingabe = input()

    if eingabe == passwort:
        print("Zugriff gewährt")
        print("Du hast " + str(versuch + 1) + " gebraucht.")
        break
    else:
        print("Zugriff verweigert")

Aufgabe: Achterreihe

Gib nur die Zahlen von 1 bis 100 aus, die der Achterreihe angehören. Mit Hilfe des Operators % kannst du eine Division mit Rest durchführen: 16 % 8 ergibt 0, weil bei der Division von 16 durch 8 kein Rest übrig bleibt.

Lösung: Achterreihe
python
for zahl in range(1, 100):
    if zahl % 8 == 0:
        print(str(zahl))

Aufgabe: Zahlen raten

Programmiere das Spiel «Zahlen raten». Der Benutzer soll so lange eine positive Zahl kleiner als 100 eingeben (erraten), bis die vorher festgelegte Zahl gefunden wurde. Das Programm gibt dabei je nach Eingabe Tipps in der Art «Die gesuchte Zahl ist grösser!». Dem Benutzer stehen höchten 7 Rateversuche zur Verfügung. ist das immer zu schaffen?

Lösung: Zahlen raten
python
print("Zahlen raten")

zahl = 42

for i in range(7):
    print("Gib eine Zahl ein:")
    eingabe = int(input())

    if eingabe < zahl:
        print("Die gesuchte Zahl ist grösser!")
    elif eingabe > zahl:
        print("Die gesuchte Zahl ist kleiner!")
    else:
        print("Gratuliere, du hast es geschafft!")

Galgenmännchen

Wir haben schon mal probiert das Galgenmännchen-Spiel zu programmieren. Nun – mit Schleifen und Verzweigungen – können wir das tun:

python
wort = input("gib ein Wort ein, welches dann gesucht werden soll: ")
laenge = len(wort)

anzeige = laenge * "_"
print(anzeige)

versuche = 0
max_versuche = 5

while versuche < max_versuche:
    buchstabe = input("welchen Buchstaben wählst du? ")

    treffer = False
    for i in range(laenge):
        if wort[i] == buchstabe:
            treffer = True
            anzeige = anzeige[0:i] + buchstabe + anzeige[i + 1:laenge]

    if not treffer:
        versuche = versuche + 1
        print("Falscher Versuche:", versuche)
    else:
        print("sehr gut!")

    if anzeige == wort:
        break

    print(anzeige)

if versuche < max_versuche:
    print("gewonnen")
else:
    print("verloren!")

Aufgabe: Galgenmännchen

  1. kopiere den obenstehenden Code ins Thonny und teste das Programm
  2. versuche zu verstehen, wie die Variablen versuche und max_versuche eingesetzt werden, resp. wie am Schluss entschieden werden kann, ob der Spieler gewonnen oder verloren hat
  3. baue ein Unterprogramm mach_strich(schritt) ein, so dass bei jedem Falsch geratenen Buchstaben von der Turtle ein Strich der Galgenmännchenfunktion gezeichnet wird. Das Unterprogramm muss irgendwie wissen, was schon gezeichnet wurde – dies könnte man mit einem Argument erledigen:
python
import turtle

def mach_strich(schritt):
    if schritt == 0:
        ...
    if schritt == 1:
        ...
    ...

Knacknüsse

Aufgabe: Primzahl

Schreibe ein Programm, das für eine eingegebene Zahl prüft, ob es sich um eine Primzahl handelt. Eine Primzahl hat genau zwei Teiler: 1 und sich selbst.

Tipp:
Es gibt zwei spezielle Operatoren // und %, beide arbeiten mit der Ganzzahldivision. 14 // 3 ergibt 4 (4 ist also das Resultat der Ganzzahldivision), 14 % 3 ergibt 2, weil bei der Ganzzahldivision ein Rest von 2 übrig bleibt.

Lösung: Primzahl
python
print("Gib eine Zahl ein:")
zahl = int(input())

ist_primzahl = True

for teiler in range(2, zahl):    # Lässt sich diese Schleife effizienter machen?
    if zahl % teiler == 0:
        print("Keine Primzahl")
        ist_primzahl = False
        break

if zahl < 2:
    print("Keine Primzahl")
elif ist_primzahl:
    print("Primzahl")

Aufgabe: Fibonacci

Schreibe ein Programm, das die ersten 20 Fibonacci-Zahlen. Zwei Zahlen sind gegeben (z.B. 1 und 1). Die nachfolgende Fibonacci-Zahl berechnet sich aus der Summe der beiden vorhergehenden: 1, 1, 2, 3, 5, 8, 13, 21, …

Lösung: Fibonacci
python
zahl1 = 1
zahl2 = 1
print(str(zahl1))

for anzahl in range(20):
    print(str(zahl2))
    naechste_zahl = zahl1 + zahl2   # Es braucht eine zusätzliche Variable,
                                    # denn ohne sie ist es nicht möglich, die
                                    # Werte von zwei Variablen zu vertauschen.
    zahl1 = zahl2
    zahl2 = naechste_zahl

Gymnasium Kirchenfeld, fts