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

Range und Fließkommazahlen-Problem

Beitragvon Robin21 » Freitag 13. April 2007, 16:56

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:

Beitragvon CM » Freitag 13. April 2007, 17:05

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

Beitragvon BlackJack » Freitag 13. April 2007, 17:10

`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

Beitragvon Goa » Freitag 13. April 2007, 17:40

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

Beitragvon Robin21 » Freitag 13. April 2007, 18:37

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

Beitragvon birkenfeld » Freitag 13. April 2007, 19:33

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

Beitragvon HWK » Samstag 14. April 2007, 13:13

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]