Problem im Code

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
misterchi
User
Beiträge: 5
Registriert: Dienstag 9. Februar 2016, 15:00

Hallo liebe Community,
ich habe eine kleine Lernsoftware für meinen kleinen Bruder programmiert. Laut der Fehlermeldung sind aber die Variablen Eingabe_richtig und Eingabe_falsch nicht definiert.

Das ist der Code:

Code: Alles auswählen

import random
import sys

for x in range(0,20):
    Zahl1=random.randint(3,9)
    Zahl2=random.randint(3,9)
    print('%s * %s' %(Zahl1,Zahl2))
    Eingabe=int(sys.stdin.readline())
    Lösung=Zahl1 * Zahl2
    if Eingabe == Lösung:
        Eingabe_richtig=Eingabe_richtig + 1
        print('Super! Die Lösung ist richtig!')
    else:
        Eingabe_falsch=Eingabe_falsch + 1
        print('Leider falsch! Die Lösung ist %s'%Lösung)

print('Du hast alle 20 Aufgaben bearbeitet!Davon waren %s richtig und %s falsch.'%(Eingabe_richtig,Eingabe_falsch))
Wie kann ich den oben genannten Fehler beheben?

Vielen Dank im Vorraus!

misterchi
Zuletzt geändert von Anonymous am Mittwoch 9. März 2016, 17:32, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
Rainier
User
Beiträge: 19
Registriert: Mittwoch 22. August 2007, 10:03

Der Fehler ist, dass Du die zum Zeitpunkt des 1. Durchlauf in der Zählschleife den Wert der von Dir angesprochen Variablen erhöhen willst, obwohl dem Rechner diese derzeit nicht bekannt sind.

Einfach vor der Zählschleife die beiden Werte auf 0 setzen

Eingabe_richtig, Eingabe_falsch = 0,0
misterchi
User
Beiträge: 5
Registriert: Dienstag 9. Februar 2016, 15:00

Vielen Dank!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@misterchi:
Wieso benutzt Du dieses umständliche Konstrukt ``Eingabe=int(sys.stdin.readline())`` statt eines einfachen ``Eingabe = int(input())``

Du könntest auch die Aufgabe in das ``input`` mit reinziehen, was imho noch hübscher aussieht und den "Nebeneffekt" hat, dass die Eingabe direkt nach dem Aufgabentext hinter dem ``=`` erfolgen kann; gerade so, als wäre das eine "echte" Shell:

Code: Alles auswählen

ergebnis = int(input("{} * {} = ".format(a, b)))
(Wobei ``a`` und ``b`` für Deine beiden Faktoren stehen)

Anstelle der langen Form für das Inkrementieren kannst Du auch folgendes schreiben: ``versuche += 1``.

Generell solltest Du PEP8 beachten; insbesondere bei der Namensgebung (kleine Namen!) und der Whitespaces zwischen Ausdrücken.

Im Schleifenkopf hast Du die ``20`` stehen und in der letzten Ausgabe auch; änderst Du die Anzahl der Durchgänge, vergisst Du die 20 im Text ganz bestimmt - oder anders herum. So etwas nennt man ``magic number`` und sollte vermieden werden. Definiere die Anzahl einfach als "Konstante" (per Konvention groß geschrieben):

Code: Alles auswählen

AUFGABEN = 20

for x in range(0, AUFGABEN):
    # and so on
    
print('Du hast alle {} Aufgaben bearbeitet".format(AUFGABEN))
# kannst Du natürlich auch mittels ``%``-Operator zusammenbauen; ist primär Geschmackssache)
(Du hast übrigens noch mehr solche ``magic numbers`` in Deinem Code! Versuche dahinter zu kommen, welche das sind und wie man diese eliminieren kann :-) )

Wenn Du Dir nun die Anzahl an Aufgaben eh merkst, brauchst Du auch nur noch über eine Erfolgsgröße Buch führen; also etwa nur die richtigen Aufgaben. Die falschen Aufgaben sind dann eine Residualgröße aus der Aufgabenanzahl und den erfolgreichen (endlich kann ich dieses Wort mal wieder außerhalb einer BWL-Vorlesung anbringen :twisted: )

Dein Code enthält noch mehr syntaktische und semantische Fehler! Der Schleifenkopf kann so nicht sinnvoll klappen, da ``x`` nicht definiert ist und auch nirgends im Rumpf zugewiesen wird. Als Faustregel kannst Du Dir aber merken: Wenn die Anzahl der Durchläufe bekannt ist, nimm eine ``for``-Schleife! In Diesem Falle z.B.:

Code: Alles auswählen

for _ in range(0, AUFGABEN):
(Du greifst auf den Wert der Zählvariablen im Schleifenrumpf nicht zu, daher weist der Name ``_`` einen (erfahrenen) Pythonprogrammierer direkt auf diesen Umstand hin, was das Lesen und Deuten der Schleife vereinfacht)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten