Datentypen vergleichen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Lukas612
User
Beiträge: 6
Registriert: Donnerstag 14. Juni 2018, 16:31

Donnerstag 14. Juni 2018, 17:10

Hallo miteinander,

ich habe ein kleines Rechenspiel programmiert, bei dem man zuerst angibt wie viele Rechenaufgaben man lösen will. Als nächstes wird vom Programm eine Zufallszahl zwischen 1 und 4 ausgewählt wird, um die Rechenart zu bestimmen und anschließend die Zahlen für die Aufgabe, welche anschließend gestellt wird und gelöst werden soll. Eigentlich funktioniert alles so wie es soll. Nur bei der Division (Zufallszahl 4) hängt sich das Programm leider immer wieder auf.

Code: Alles auswählen

#!/usr/bin/python3

import random
random.seed()

versuche = 0
richtig = 0

while 1:
    try:
        print("Wie viele Aufgaben wollen Sie lösen?")
        anzahl = int(input())
        break
    except:
        print("Bitte geben Sie eine ganze Zahl ein")
        continue

for aufgabe in range(1, anzahl+1,1):
    auswahl = random.randint(1,4)
    if auswahl == 1:                 #Addition
        a = random.randint(1,20)
        b = random.randint(1,20)
        erg = a + b
        rzeichen = "+"
    elif auswahl == 2:             #Subtraktion
        erg = -1
        while erg < 0:
            a = random.randint(1,20)
            b = random.randint(1,20)
            erg = a - b
            rzeichen = "-"
    elif auswahl == 3:            #Multiplikation
        a = random.randint(1,20)
        b = random.randint(1,20)
        erg = a * b
        rzeichen = "*"
    elif auswahl == 4:          #Division
        erg = 0.5
        while type(erg) != int:
            a = random.randint(1,20)
            b = random.randint(1,20)
            erg = a / b
            rzeichen = "/"

    #Aufgabe stellen
    print("Ihre", aufgabe, ". Aufgabe von", anzahl,":")
    print( a, rzeichen, b)

    for i in range(1,4,1):
        versuche = versuche + 1
        try:
            print("Ihr Ergebnis:")
            eingabe = float(input())
        except:
            print("Sie haben keine Zahl eingegeben!")
            print("Sie müssen eine Zahl eingeben!")
            print()
            continue

        #Ergebnisüberprüfung
        if eingabe == erg:
            richtig = richtig + 1
            print("Ihr Ergebnis ist richtig :)")
            print()
            break
        elif i == 3:
            print("Ihr Ergebnis ist leider falsch :(")
            print("Sie haben drei mal das falsche Ergebnis eingegeben")
            print("Das richtige Ergebnis wäre gewesen: ", erg)
            print()
            print("Es geht weiter mit der nächsten Aufgabe")
            print()
        else:
            print("Ihr Ergebnis ist leider falsch :(")
            print("Versuchen Sie es noch einmal")
            print()
            continue

print("Anzahl der Aufgaben:", anzahl)
print("Richtige Aufgaben:  ", richtig)
print("Anzahl der Versuche:", versuche)

Meine eigentliche Frage ist jetzt, ob ich bei

Code: Alles auswählen

while type(erg) != int:
alles richtig gemacht habe und wenn ja wo dann der Fehler liegt bzw. ob überhaupt ein Fehler enthalten ist?

Vielen Dank
Sirius3
User
Beiträge: 8419
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 14. Juni 2018, 17:41

Der Aufruf von `random.seed` macht nur mit einer Zahl Sinn, wenn man immer die gleichen "Zufallszahlen" haben will. Python kennt Wahrheitswerte, also statt `while 1:` -> `while True:` schreiben. Niemals nackte except schreiben, sondern immer die konkrete Exception abfangen, hier also ValueError, weil andernfalls auch viele Programmierfehler verschluckt werden und man dann keine fehlerfreien Programme schreiben kann. `continue` sparsam einsetzen, hier ist es überflüssig.

Statt die Rechenoperation als Zahl zu kodieren, kannst Du auch gleich per

Code: Alles auswählen

rechen_zeichen = random.choice(["+", "-", "*", "/"])
eine Rechenart auswählen, das ist lesbarer als die Zahl. Apropos lesbar: keine Abkürzungen, also rechen_zeichen statt rzeichen.

Für die Subtraktion: statt einer while-Schleife, wähle einfach den Zufallsbereich von b so, dass a-b immer eine positive Zahl gibt.

Zur Division: a / b ist immer eine Fließkommazahl, auch wenn das Ergebnis zufällig eine ganze Zahl ist. Auch hier gilt, wähle einfach a so, dass es das Produkt aus b und erg(ebnis) ist.
Lukas612
User
Beiträge: 6
Registriert: Donnerstag 14. Juni 2018, 16:31

Freitag 15. Juni 2018, 20:40

Ok,
also kann ich

Code: Alles auswählen

random.seed()
gleich komplett aus dem Code schmeißen?


Was macht dann eigentlich genau

Code: Alles auswählen

ValueError
in

Code: Alles auswählen

except ValueError:
? :?:
Benutzeravatar
__blackjack__
User
Beiträge: 1228
Registriert: Samstag 2. Juni 2018, 10:21

Freitag 15. Juni 2018, 21:51

@Lukas612: Ja, den `random.seed()`-Aufruf kannst Du gleich raus werden.

Das `ValueError` an der Stelle sagt welche Ausnahmen dort behandelt werden sollen. Also in diesem Fall `ValueError` und nichts anderes.
“Pets are always a great help in times of stress. And in times of starvation too, o'course.” — Terry Pratchett, Small Gods
Lukas612
User
Beiträge: 6
Registriert: Donnerstag 14. Juni 2018, 16:31

Samstag 16. Juni 2018, 13:39

Achso
Ok

Vielen Dank
Antworten