Range und Fließkommazahlen-Problem

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
Robin21
User
Beiträge: 5
Registriert: Freitag 13. April 2007, 16:46

Hallo,
ich habe vor kurzem mit Python angefangen und hab als Übung mal einen BMI-Rechner gebastelt. Er funktioniert auch gut nur wollt ich noch etwas erweitern, sodass er das Ergebnis auf zwei Nachkommastellen rundet. Eigentlich kein problem, nur scheint die Range-Funktion Probleme zu haben:

Code: Alles auswählen

#!/usr/bin/python
# den BMI ausrechnen
#BMI=Körpergröße:(Körpergröße in m)²

import string

print "Mit diesem Programm können Sie Ihren BMI ausrechnen."
while True:
        print
        kg=int(raw_input("Tippen Sie bitte Ihr Gewicht in kg ein: "))
        if kg<25 or kg>300:
                print "Geben Sie bitte eine sinnvolle Eingabe ein"
                print"_____________________________________________"
                continue
                   
        cm=float(raw_input("Tippen Sie bitte ihre Größe in Metern ein: "))#float, wegen Fließkommadarstellung von Metern
        if cm<1.00 or cm>2.50:
                print"Geben Sie bitte eine sinnvolle Eingabe ein"
                print"_____________________________________________"
                continue
        
              
        bmi=int (kg/cm**2) #BMI ausrechnen: als Ganzzahl=>Programm funktioniert einwandfrei
                                          #als Fließkommazahl(bmi=float(kg/cm**2)=>Programm lässt den Rest aus

        print"Ihr BMI beträgt : ","%.2f" % (bmi)
        print
        
        if bmi<20:
                print "Sie sind untergewichtig!"
                print
                print
                rest=raw_input("""Wollen Sie eine weitere Eingabe machen?
Beliebige Taste zum Fortfahren, `nein´ zum Beenden...
""") 
                if rest=="nein":
                        print "Vielen Dank! Auf Wiedersehen!"
                        break
                else:
                        print "_____________________________________________"
                        continue
                
        elif bmi in range(20,25):#eine Stelle, hab auch schon 20.00,25.00 ausprobiert
                print "Sie sind normalgewichtig"
                print
                print
                rest=raw_input("""Wollen Sie eine weitere Eingabe machen?
Beliebige Taste zum Fortfahren, `nein´ zum Beenden...
""") 
                if rest=="nein":
                        print "Vielen Dank! Auf Wiedersehen!"
                        break
                else:
                        print "_____________________________________________"
                        continue
                
        elif bmi in range (26,31):
                print "Sie sind übergewichtig"
                print
                print
                rest=raw_input("""Wollen Sie eine weitere Eingabe machen?
Beliebige Taste zum Fortfahren, `nein´ zum Beenden...
""") 
                if rest=="nein":
                        print "Vielen Dank! Auf Wiedersehen!"
                        break
                else:
                        print "_____________________________________________"
                        continue
                

        elif bmi>30:
                print "Sie sind stark übergewichtig"
                print
                print
                rest=raw_input("""Wollen Sie eine weitere Eingabe machen?
Beliebige Taste zum Fortfahren, `nein´ zum Beenden...
""") 
                if rest=="nein":
                        print "Vielen Dank! Auf Wiedersehen!"
                        break
                else:
                        print "_____________________________________________"
                        continue



Das problem ist, dass er den Bmi zwar mit zwei Nachkommastellen ausrerchent, aber wenn er dann sagen soll man ist z.b. normalgewichtig hat er eben Probleme mitdem range, vermutlich weil die range_funktion keine Fließkommazahlen unterstützt.
Kann ich das irgendwie hinkriegen, gibts da auch einen anderen befehl?
Zuletzt geändert von Robin21 am Freitag 13. April 2007, 18:31, insgesamt 1-mal geändert.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi und willkommen im Forum,

range() generiert eine Liste, üblicherweise um darüber zu iterieren.

Was Du möchtest (mit irgendwelchen Dummy-Werten) sieht so aus:

Code: Alles auswählen

>>> bmi = 25
>>> 24 < bmi < 31
True
>>> bmi = 1027
>>> 24 < bmi < 31
False
Insgesamt sieht der Code für den Anfang nicht schlecht aus, aber die Einrückung ist etwas seltsam: Hast Du Leerzeichen verwendet (empfohlen) oder tabs oder (ganz schlimm ;-) ) ein Gemisch?

Du importierst außerdem "string" was Du nicht verwendest und nicht brauchst.

Viel Erfolg beim Weiterlernen - mit Funktionen & Co. wirst Du sicher schöner programmieren können. *winkmitdemZaunpfahl*

Gruß,
Christian
BlackJack

`range()` erzeugt eine Liste mit ganzen Zahlen und der ``in``-Operator testet ob ein Objekt in einem anderen enthalten ist. Im Falle von Listen übrigens in linearer Laufzeit.

Code: Alles auswählen

In [33]: a = range(10)

In [34]: a
Out[34]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [35]: 5 in a
Out[35]: True

In [36]: 4.2 in a
Out[36]: False
Wie man sieht ist das Objekt 5 in der Liste, 4.2 aber nicht.

Bei `kg` hattest Du ja schon den richtigen Ansatz, das kann man sogar noch etwas "mathematischer" und kürzer schreiben:

Code: Alles auswählen

if not (25 <= kg <= 300):
    # ...
Das geht dann natürlich auch mit den BMI-Werten.

Edit: Mist, zu spät :-)
Goa
User
Beiträge: 18
Registriert: Dienstag 10. Oktober 2006, 11:00

und noch ein kleines Deatil:
Hier musst du nicht 2 strings verwenden:

Code: Alles auswählen

print"Ihr BMI beträgt : ","%.2f" % (bmi) 
D.h es geht einfacher (naja, eher eleganter...) mit

Code: Alles auswählen

print"Ihr BMI beträgt : %.2f" % (bmi) 
Robin21
User
Beiträge: 5
Registriert: Freitag 13. April 2007, 16:46

Cool, DANKE für die schnelle Hilfe!Super!
Jetzt versteh ich auch besser weshalb und warum.
Habs jetzt auch hingekriegt und Programm läuft^^.
Zur Einrückung: da mach ich eigentlich immer Tabs, den einen Fehler beim Quelltext hab ich grad noch editiert.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Für alle, die gerne "if x in Range(y, z)" schreiben wollen:

Code: Alles auswählen

class Range(object):
    def __init__(self, start, stop):
        self.start = start
        self.stop = stop
    def __contains__(self, val):
        return self.start <= val < stop
;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

birkenfeld hat geschrieben:Für alle, die gerne "if x in Range(y, z)" schreiben wollen:

Code: Alles auswählen

class Range(object):
    def __init__(self, start, stop):
        self.start = start
        self.stop = stop
    def __contains__(self, val):
        return self.start <= val < stop
;)
Wahrscheinlich doch:

Code: Alles auswählen

return self.start <= val < self.stop
MfG
HWK
Antworten