Seite 1 von 1

definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 14:44
von Arox
]Hallo!
Ich bin neu hier, genauso wie im programmieren in Python.
Ich wollte ein bisschen rum experementieren, und wollte ein kleines quiz machen, wo man mehrere Antwortmöglichkeiten hat, zu einer Frage.
Wenn der Benutzer die Antwort falsch eingibt, soll die def. erneut abspielen, und die Frage erneut zeigen.Hier mein Coding:

[codebox=python file=Unbenannt.txt]frag1 = ("FrageEins>>> ")
ant1 = ("3")
ant2 = ("4")
def quiz () :
input (frag1)
if input == ant1 or ant2 :
print ("richtig")
else:
print ("falsch")
quiz ()
quiz ()[/code]

ein sehr simpler code, dennoch habe ich folgendes Problem:
wenn ich ein falsches Ergebniss eingebe, sagt er mir dennoch "richtig", als ob er else garnicht lesen würde.
Ich freue mich auf Antworten :)
MfG

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 14:57
von Sirius3
@Arox: an dem Programm ist so einiges falsch.
1. Was sollen denn die Klammern um die Strings?
2. input ist eine Funktion, die einen Rückgabewert hat
3. irgendein String ant1 ist nie gleich einer Funktion input.
4. "or" ist kein umganssprachliches Oder sondern ein logische Oder: (input == ant1) oder ant2, wobei ersteres immer False, zweites immer zu True und damit der oder-Ausdruck immer zu True evaluiert wird.

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 14:59
von BlackJack
@Arox: Das Problem ist das ``or`` nicht das macht was Du denkst. Das darf man nicht wie natürliche Sprache lesen sondern man muss sich klar machen, dass das ein binärer Operator ist, der zwei Argumente bekommt. Das eine ist das Ergebnis des Vergleichst und das andere ist die Zeichenkette '4'. Und da die immer ”wahr” ist, ist dieser Ausdruck *immer* wahr. Du musst also entweder tatsächlich beide Vergleiche machen und deren Ergebnis mit ``or`` verknüpfen, oder beispielsweise testen ob die Antwort in einer Liste mit den richtigen Antworten enthalten ist.

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 15:04
von Arox
Also erstmal danke für die schnelle Antworten.
Ich bin eigentlich komplett neu also tut mir leid :D
Ich habe jetzt nicht verstanden, wie ich beide antworten gelten lassen kann, dass man entweder 3 oder 4 eingeben kann. Beides soll richtig sein. Und wieso sagt er mir " richtig " wenn ich was falsches eingebe? Er muss doch else lesen wenn ich falsches eingebe?

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 15:20
von eckhard
@Arox: wie Sirius schon sagte, musst Du den Rückgabewert von inpur einer Variablen zuweisen,
Also
eingabe = input(frag1)
Weiter wie BlackJack schon sagte, musst Du beide Vergleiche machen. D.H.
if input == ant1 or ant2 :
ersetzen durch
if eingabe == ant1 or eingabe == ant2 :

Die Abfrage
if eingabe == ant1 or ant2:
vergleicht eingabe mit ant1 und wenn das falsch ist, prüft ob ant2 wahr ist.
Da ant2 den Wert "4" hat ist dies immer wahr; also wird der else Teil
niemals durchlaufen.

eckhard

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 15:37
von Arox
[codebox=python file=Unbenannt.txt]("FrageEins>>> ")
ant1 = ("3")
ant2 = ("4")
def quiz () :
input (frag1)
if input == ant1 or input == ant2:
print ("richtig")
else:
print ("falsch")
quiz ()
quiz ()[/code]

So? Er sagt mir das 3 und 4 falsch ist. Genauso wie ein komplett anderes Ergebniss

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 15:46
von eckhard
@Arox: N i c h t input abfragen, sondern das Ergebnis von input einer Variablen zuweisen
und diese dann abfragen, wie ich es schon gemailt habe.

eckhard

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 15:51
von Arox
Wie mach ich das genau? Bitte gib mir ein Beispiel.
Danke

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 15:55
von Arox
Hab es! So funktionierts!!!
[codebox=python file=Unbenannt.txt]
frag1 = ("FrageEins>>> ")
ant1 = ("3")
ant2 = ("4")
def quiz () :
eingabe = input (frag1)
if eingabe == ant1 or eingabe == ant2:
print ("richtig")
else:
print ("falsch")
quiz ()
quiz ()[/code]

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 18:22
von BlackJack
@Arox: Den rekursiven Aufruf der Funktion würde ich als Programmierfehler sehen. Das führt irgendwann zu einem Programmabbruch weil der Aufrufstapel überläuft, und das Problem hätte man mit einer imperativen Schleife nicht.

`frag` und `ant` sind keine guten Namen. `frage` und `antwort` wären besser. Bei einem Namen sollte der Leser nicht erst raten müssen wofür er denn stehen könnte.

Funktionen haben üblicherweise Namen von Tätigkeiten die sie ausführen. Damit kann man sie dann auch gleich einfacher von eher ”passiven” Werten unterscheiden.

Was sollen denn nun die Klammern um die Zeichenketten bewirken?

Du setzt ein paar komische Leerzeichen. Zwischen Funktionsname und öffnender Klammer gehört weder bei der Definition noch beim Aufruf ein Leerzeichen. Und vor dem Doppelpunkt bei ``def`` auch nicht.

Die Zeichenketten am Anfang an Namen zu binden macht in diesem Beispiel auch eher keinen Sinn.

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 18:42
von Arox
Ok, danke.
Welche klammer meinst du genau?

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 18:59
von BlackJack
@Arox: Bei der Frage nach den warum meinen Sirius3 und ich die in den Zeilen 1 bis 3.

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 19:26
von Arox
Danke, habe es jetzt verstanden.
Also brauche ich bei variablen generell keine klammern?
Mfg

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 20:24
von Arox
Ich hätte da noch eine Frage:
Was wenn ich einen sehr langen code habe.
Beispielweise ein quiz welches mehrere Fragen enthält.
Am Ende mache ich was anderes hin, wie eine neue definition, die aber falsch sein könnte. Ich müsste den Code laufen lassen, und dann alle Fragen beantworten. Das wäre unnötige Zeit Verschwendung. Kann ich das irgendwie umgehen?
danke im vorraus
Mfg

Re: definition/quiz/probleme

Verfasst: Montag 24. Oktober 2016, 20:35
von BlackJack
@Arox: Schreib nicht so langen Code den man tatsächlich bis dorthin laufen lassen muss. Programmieren besteht zu einem Grossteil darin Probleme in kleinere Teilprobleme aufzuteilen, und diese Teilprobleme dann wieder in kleinere Teilprobleme, solange bis die so klein sind, das man sie mit einer Funktion mit ein paar Zeilen Code lösen kann. Diese kleinen Teillösungen kann man dann testen, und wenn sie funktionieren in Funktionen mit ein paar Zeilen Code zu grösseren Teillösungen zusammensetzen. Solange bis das Gesamtproblem gelöst ist.

Der Ansatz für eine weitere Frage neuen Code zu schreiben klingt aber schon falsch. Man würde da eher der Datenstruktur in der man die Fragen und Antworten speichert einen weiteren Datensatz hinzufügen. Der Code ist ja für alle Fragen und Antworten der gleiche, den schreibt man nur einmal allgemein mit Parametern für die Daten die sich in den Fragen unterscheiden.