Probleme bei einer ''if'' Abfrage.

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.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 29. Juli 2006, 10:07

Hallo!

Ich wollte gerade mein Programm zum ausrechnen der BMI um etwas ergänzen. Eine altersabfrage. Das wollte ich wiefolgt lösen:

Code: Alles auswählen

gewicht = raw_input('Geben Sie Ihr Körpergewicht in Kg an: ')
groesse = raw_input('Geben Sie Ihre Körpergröße in Meter an: ')
alter = raw_input('Geben Sie bitte Ihr Alter an oder schreiben sie "nein": ')

gewicht = float(gewicht.replace(',', '.')) #Ersetzt das Komma durch einen Punkt
groesse = float(groesse.replace(',', '.'))

bmi = gewicht / (groesse*groesse)

# Auf Alter hinweisen
if alter == 'nein' or 'Nein' or 'n':
    print 'Sie sollten Ihr alter angeben. Nur dann ist ein exakter Vergleich moeglich.'
    alterFrage = raw_input('Bitte geben Sie Ihr alter an oder schreiben Sie wieder "nein": ')
    if alterFrage == 'nein' or 'Nein' or 'n':
        alter = 'nein'
    else:
        alter = alterFrage
else:
    print 'Danke das Sie ihr Alter angegeben haben hier nun die Ausgabe:'
        
Nun ist das Problem das selbst wenn ich bei der ersten Abfrage mein Alter eingebe trotzdem noch einmal nachfragt. Aber ich habe doch mit ''else'' angegeben was geschehen soll wenn
Beim Alter eben nicht ''nein'' oder 'Nein' oder 'n' eingeben wurde.

Irgentwo muss ich etwas übersehen haben. Könnt ihr mir helfen, wo mein Problem liegt?

Ich freu mich auf die Antwort ;)


MfG ChrissiG
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 29. Juli 2006, 10:42

Ich habe mein Problem selbst gefunden ;)

Sorry!

Das Problem lag darin das ich statt ''or'' ''and'' verwenden musste. Nur so wurde alles geprüft ;)

Na Ja...

MfG ChrissiG
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Samstag 29. Juli 2006, 10:44

Ich würde, um der Usability willen, die Alterfrage so gestalten, dass der User auch einfach nix eingeben kann. Wenn er jetzt z.B. no schreibt, dann würdest du mit dem Alter no rechnen.
Und dann gehts auch mit der If leichter und kürzer:
if alter: Das sagt dir dann ob das Alter angegeben würde oder nich :wink:

Greetz
BlackJack

Samstag 29. Juli 2006, 10:47

``or`` verknüft das was links davon steht, mit dem was rechts davon steht. Du verknüpfst also das Ergebnis von (alter == 'nein') mit 'Nein' und dann nochmal mit 'n'. Da nichtleere Zeichenketten "wahr" sind, ist der Ausdruck immer wahr. Du hättest auch schreiben können ``(alter == 'nein') or True or True``.

Also entweder Du verknüpfst drei vollständige Vergleiche

Code: Alles auswählen

alter == 'Nein' or alter == 'nein' or alter == 'n'
oder etwas kürzer:

Code: Alles auswählen

alter.lower().startswith('n')
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 29. Juli 2006, 11:02

Wenn er jetzt z.B. no schreibt, dann würdest du mit dem Alter no rechnen.
Is wahr. Das sollte man auch beachten
Und dann gehts auch mit der If leichter und kürzer:
if alter: Das sagt dir dann ob das Alter angegeben würde oder nich Wink
Das sagt mir obs angegeben wurde oder nicht. Ok. Aber ich kenne Personen die trotz das ich sage. Nichts eingeben. Trotzdem ein ''nein'' eingeben. Dann haben wir hier auch wieder ein Problem.

Gäbe es eine Möglichkeit herauszufinden ob Zahlen oder Buchstaben angegeben wurden? Das würde das Problem ganz einfach lösen. Wenn Buchstabe oder gar nichts ist das ein ''nein''. Und wenn eine Zahl ist das das Alter. Gäbe es so eine Möglichkeit?

Und zu der extrem kurzen Lösung von BlackJack:

Code: Alles auswählen

alter.lower().startswith('n')
Versteh ich in soweit das es prüft ob der Inhalt von ''alter'' mit ''n'' anfängt.
Aber was macht das ''.lower()''?

Danke schon mal für die Hilfe.

MfG ChrissiG
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Samstag 29. Juli 2006, 11:06

lower() macht den wandelt den String in Kleinbuchstaben um.
Wenn alter mit einem n anfängt kann das für no,nein,nee,nnöhö usw stehen.

Code: Alles auswählen

if type(alter) == 'int':
damit weißt du, obs ein Integer is, aber das bringt dir nichts, da raw_input einen String zurückliefert, also rat ich dir zu einer try...except Überprüfung, ob du den String in ein Int umwandeln kannst. Damit kannst du dir auch die if Abfrage sparen :wink:

Code: Alles auswählen

try:
  int(alter)
except ValueError:
  #Frage wegen des Alters
else:
  alter=int(alter)
Soweit verstanden?
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Samstag 29. Juli 2006, 11:11

könntest auch

Code: Alles auswählen

if alter.isalnum() == True:
    #mach irgend was
else:
    #nach Alter fragen
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 29. Juli 2006, 11:18

...try...except Überprüfung...

Code: Alles auswählen

try:
  int(alter)
except ValueError:
  #Frage wegen des Alters
else:
  alter=int(alter)
schaun wa ma ;)

Also ver versucht alter in eine Zahl umzuwandeln. Sollte das nicht gehen ''except'' gibt es den ''ValueError'' und das heißt das Buchstaben angegeben wurden.
Nun kann ich nach dem Alter nochmal fragen.
Und wenn man ''alter'' in eine Zahl umwandelt kann tut er es.
Das wäre dann das ''else'' usw.

richtig verstanden? Wenn ja ;) schän wie kurtz man das machen kann ;)

Danke!

MfG ChrissiG
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Samstag 29. Juli 2006, 11:33

DatenMetzgerX hat geschrieben:könntest auch

Code: Alles auswählen

if alter.isalnum() == True:
    #mach irgend was
else:
    #nach Alter fragen
Wenn dus kurz willst, nimm diese Methode. Ich kannte die Methode isalnum() noch gar nich, is aber ne feine Sache :wink:
Die Methode überprüft ob der String nur Alfanummersiche "Daten" enthält. Wenn ja und wenn mindestens ein Wert in dem String steht, dann spuckt die Methode True aus - ansonsten False.
Eigentlich ne ganz feine Sache.
Quelle:
http://docs.python.org/lib/string-methods.html#l2h-185
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 29. Juli 2006, 12:20

CrackPod hat geschrieben:
DatenMetzgerX hat geschrieben:könntest auch

Code: Alles auswählen

if alter.isalnum() == True:
    #mach irgend was
else:
    #nach Alter fragen
Wenn dus kurz willst, nimm diese Methode. Ich kannte die Methode isalnum() noch gar nich, is aber ne feine Sache :wink:
Die Methode überprüft ob der String nur Alfanummersiche "Daten" enthält. Wenn ja und wenn mindestens ein Wert in dem String steht, dann spuckt die Methode True aus - ansonsten False.
Eigentlich ne ganz feine Sache.
Quelle:
http://docs.python.org/lib/string-methods.html#l2h-185
Is wirklich ne feine Sache ;)

Im Moment habe ich das ganze so eingebaut:

Code: Alles auswählen

# Auf Alter hinweisen
try:
    int(alter)
except ValueError:
    alter = raw_input('Bitte geben Sie Ihr Alter ein, es ist wichtig! Eingabe: ')
else:
    alter = int(alter)
Klappt ohne Probleme.

Doch die andere Version mit

Code: Alles auswählen

if alter.isalnum() == True:
schaut auch gut aus. Ob besser entscheide ich dann ;)

Jedoch klappt das nicht ganz so wie ich das wollte.

mal schaun ich habe das wie folgt eingebaut:

Code: Alles auswählen

# Auf Alter hinweisen
if alter.isalnum() == True:
    print 'Sie haben das Alter angegeben, die Auswertung wird gleich folgen'
else:
    raw_input('Bitte geben Sie Ihr Alter an. Es wird benoetigt!: ')
Das heißt ja dann eigentlich das wenn die Variable ''alter'' gefüllt ist und Zahlen enthällt kommt die Ausgabe, das man es eingegeben hat.
Das klappt! Insoweit, das die Ausgabe kommt wenn man Zahlen eingegeben hat.

Gut aber was ist wenn da jmd. ''nein'' hinschreibt? Das wollte ich auch abdecken. Es müsste ja eigentlich dann die ''else'' Klausel abgearbeitet werden oder sehe ich da was falsch? Da ''alter'' ja nicht aus Zahlen besteht kommt ja ein ''False'' heraus.

Aber es klappt nicht. Wenn ich nichts eingebe, kommt die Abfrage nach dem alter einwandfrei, aber wenn ich z.B. ''Nein'' eingebe sagt er das ich das Alter eingegeben habe.
Was habe ich falsch gemacht bzw. woran liegt das?

MfG ChrissiG
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Samstag 29. Juli 2006, 12:33

alter.isalnum() prüft auf alphanumerische Zeichen, also auch Buchstaben. alter.isdigit() prüft auf zahlen, dass müsste das gewünschte Ergebniss liefern.

Code: Alles auswählen

# Auf Alter hinweisen
if alter.isdigit() == True:
    print 'Sie haben das Alter angegeben, die Auswertung wird gleich folgen'
else:
    raw_input('Bitte geben Sie Ihr Alter an. Es wird benoetigt!: ')
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 29. Juli 2006, 12:45

hätte man auch selber drauf kommen können ;)

Danke!

So funktioniert nun alles einwandfrei.

So und nun gehts zur nächsten Aufgabe.

Ich möchte dem Benutzer am Ende ausgeben, was er machen muss. Zunehmen oder Abnehmen oder eben eine Erfolgsmeldung.

Sobald ich damit Fertig bin, stelle ich das mal wieder hier hinein, unter eure Meinung ;)

Bis Hierher... schonmal Danke!


mfG ChrissiG
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Samstag 29. Juli 2006, 12:58

Hilfe!
CrackPod hat geschrieben:

Code: Alles auswählen

if type(alter) == 'int':
ist falsch, da "type" ein Typobjekt zurückliefert und keinen String. Es muss also heißen

Code: Alles auswählen

if type(alter) is int:
CrackPod hat geschrieben:

Code: Alles auswählen

try:
  int(alter)
except ValueError:
  #Frage wegen des Alters
else:
  alter=int(alter)
Das ist umständlich. Man kann "alter = int(alter)" gleich in den try-Block schreiben.
DatenMetzgerX hat geschrieben:

Code: Alles auswählen

if alter.isalnum() == True:
    #mach irgend was
else:
    #nach Alter fragen
Man prüft die Rückgaben von Methoden, die einen Bool zurückgeben, nicht nochmal explizit auf True.
ChrissiG hat geschrieben:

Code: Alles auswählen

try:
    int(alter)
except ValueError:
    alter = raw_input('Bitte geben Sie Ihr Alter ein, es ist wichtig! Eingabe: ')
else:
    alter = int(alter) 
Das ist auch nicht gut, weil danach "alter" entweder ein Int oder ein String ist.

Außerdem musst du die Frage nach dem Alter in eine Schleife einbauen. Wer sagt dir, dass der Benutzer beim zweiten Mal ein gültiges Alter eingibt?
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 29. Juli 2006, 13:21

Außerdem musst du die Frage nach dem Alter in eine Schleife einbauen. Wer sagt dir, dass der Benutzer beim zweiten Mal ein gültiges Alter eingibt?
Stimmt schon. Aber das löse ich so das das Programm dem benutzer einfach eine Tabelle heraussucht und er sich das selber zusammensuchen muss ;)

Der der brav sein Alter eingibt bekommt gesagt ob er Abnehmen muss, zunehmen muss oder eben ein Erfolgsergebnis. (<--das ist gerade in Arbeit)

Weil ich bin der Meinung. Wer sein Alter beim 2. Mal nicht eingibt wird es nie eingeben. Zumindest würde ich das so machen.

Ich habe das ganze ja nun wie folgt gelößt:

Code: Alles auswählen

if alter.isdigit() == True:
    print 'Sie haben das Alter angegeben, die Auswertung wird gleich folgen'
else:
    alter = raw_input('Bitte geben Sie Ihr Alter an. Es wird benoetigt!: ')
    if alter.isdigit() == True:
        print 'Sie haben Ihr Alter angegeben, Danke. Die Auswertung folgt.'
    else:
        print 'Sie muessen Ihren BMI-Wert selbst vergleichen!'
Klappt auch einwandfrei.

Gäbe es an dieser Lösung auch etwas anders zu machen? Wenn ja was?

MfG ChrissiG
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Samstag 29. Juli 2006, 14:03

Was passiert wenn ich -856 eingebe? :)

mfg tlb
Antworten