definition/quiz/probleme

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
Arox
User
Beiträge: 9
Registriert: Montag 24. Oktober 2016, 14:31

]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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
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.
Arox
User
Beiträge: 9
Registriert: Montag 24. Oktober 2016, 14:31

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?
eckhard
User
Beiträge: 33
Registriert: Montag 14. Dezember 2015, 10:06
Wohnort: Karlsruhe

@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
Arox
User
Beiträge: 9
Registriert: Montag 24. Oktober 2016, 14:31

[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
eckhard
User
Beiträge: 33
Registriert: Montag 14. Dezember 2015, 10:06
Wohnort: Karlsruhe

@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
Arox
User
Beiträge: 9
Registriert: Montag 24. Oktober 2016, 14:31

Wie mach ich das genau? Bitte gib mir ein Beispiel.
Danke
Arox
User
Beiträge: 9
Registriert: Montag 24. Oktober 2016, 14:31

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]
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.
Arox
User
Beiträge: 9
Registriert: Montag 24. Oktober 2016, 14:31

Ok, danke.
Welche klammer meinst du genau?
BlackJack

@Arox: Bei der Frage nach den warum meinen Sirius3 und ich die in den Zeilen 1 bis 3.
Arox
User
Beiträge: 9
Registriert: Montag 24. Oktober 2016, 14:31

Danke, habe es jetzt verstanden.
Also brauche ich bei variablen generell keine klammern?
Mfg
Arox
User
Beiträge: 9
Registriert: Montag 24. Oktober 2016, 14:31

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
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.
Antworten