BMI ausrechnen... etwas optimieren!

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:

HAAALT Komando zurück ;)

Diese Abfrage ist stuss, stuss und nichts als stuss *g*
http://www.uni-hohenheim.de/wwwin140/in ... es/bmi.htm

Sagt, das das nicht mit Alter<==>BMI zu tun hat, sondern mit Mänlich und Weiblich ... gut... gleich mal umschreiben *g*


€dit:
Ich glaube du hast die range-Funktion noch nicht richtig verstanden.
Nicht?
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Und so funktioniert nun meine Neuauflage, für die BMI-Berechnung.

Code: Alles auswählen

# -*- coding: cp1252 -*-
# den BMI des Menschen ausrechnen
# BMI = Körpergewicht : (Körpergröße in m)²

import re, sys

POS = {
    'Untergewicht': (lambda g,b,a: (g=='m' and b<20) or (g=='w' and b<19)),
    'Normalgewicht': (lambda g,b,a: (g=='m' and b in range(20, 26)) or (g=='w' and (b in range(19,25)))),
    'Übergewicht': (lambda g,b,a: (g=='m' and b in range(25, 31)) or (g=='w' and (b in range(24,31)))),
    'Adipositas': (lambda g,b,a: (g=='m' and b in range(30, 41)) or (g=='w' and (b in range(30,41)))),
    'massive Adipositas': (lambda g,b,a: b>40),
}

def check_input(data):
    return round(float(re.sub(r'[a-zA-Z_]+', '', data).replace(',', '.')))

def create_bmi_table():
    result = []
    for i in xrange(6):
        result.append([14 + i * 10, 24 + i * 10, 19 + i])
    result[0][0] = 0
    result[-1][1] = sys.maxint
    return result

def main():
    print 'Mit diesem Programm wird Ihr BMI (Body Mass Index) ausgerechnet'
    print '--------------------------------------------------------------'

    weight = check_input(raw_input('Geben Sie bitte Ihr Körpergewicht an: '))
    height = check_input(raw_input('Geben Sie bitte Ihre Körpergröße(in Meter) an: '))
    bmi = weight / (height**2)
    print 'Ihr BMI ist %.2f' % bmi
    print 'Bitte geben Sie ihr alter an:'
    age = int(check_input(raw_input(' ')))
    gender = raw_input("Ihr geschlecht (m, w): ")
    bmi_table = create_bmi_table()
    for floor, cap, bmi_floor in bmi_table:
        if floor < age < cap:
            print ('Ihr BMI-Wert sollte Ihrem Alter entsprechend zwischen'
                   ' %d und %d liegen.' % (bmi_floor, bmi_floor + 5))
    print
    for x in POS:
        print "Sie haben %s: %s" % (x, POS[x](gender, int(bmi), age))

if __name__ == '__main__':
    main()
Nun mag ich aber eure Verbesserungsvorschläge hören?

MfG EnTeQuAk

€dit: nur nen blöödes kommentar rausgemacht
Zuletzt geändert von EnTeQuAk am Mittwoch 2. Mai 2007, 15:33, insgesamt 2-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

EnTeQuAk hat geschrieben:Nicht?
Ich habe es mir nicht im Detail angeschaut, aber es sieht so aus, als versuchst du einen Test der Art: FLOAT in range(...)

Im Speziellen meine ich die Zeile 46:

Code: Alles auswählen

POS[x](bmi, age)
Falls ich die Umwandlung in einen Integer nicht gesehen habe, darfst du mir gerne sagen wo, Suchen ist mir zu anstrengend :D
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich habe Py2Exe auf Linux laufen.

Habe dazu folgendes gemacht:
pwe Wine python25 .msi installiert
per wine die dazugehörende py2exe .exe
und nun kann ich auch per Wine die python.exe ansprechen bzw. auch PythonWin32 ;-)

WINE ist schon sehr schick.

zu dem %f

Code: Alles auswählen

>>> x = 5
>>> print "H: %s"%x
H: 5
>>> print "H: %i"%x
H: 5
>>> print "H: %f"%x
H: 5.000000
%s = Strings
%i Ganzezahlen (intergers)
%f = Flieskommazahlen (floats)
%d = double ~ Übersetzung? ^^

PS: Kann es sein EnTeQuAk das du unter falschen Nick schreibst? Du sagt das Forum ist Klasse hast aber schon 600 Posts :-D, oder kann man das einfach nicht oft genug sagen :-D ?
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Huch, da kommen ja ganz alte Sachen wieder hoch... ;)

@Sr4l: Supi --> gleich mal ausprobieren, wenn ich wieder zu Hause bin... :)

@EyDu: Allerdings... das war mein Fehler *g* --> hab ihn aber vorher gefunden. Wie 'rage' funktioniert, weiß ich ja... nur daran habe ich nicht gedacht.


Alles in Allem ein schönes Programm geworden ;)
(siehe letzter Post von mir!)

Ich musste den Thread einfach vortführen... sonst währ ich hier auf Arbeit eingeschlafen ...


MfG EnTeQuAk

€dit:
PS: Kann es sein EnTeQuAk das du unter falschen Nick schreibst? Du sagt das Forum ist Klasse hast aber schon 600 Posts Very Happy, oder kann man das einfach nicht oft genug sagen?
Früher hieß ich hier mal 'ChrissiG' :) Und schau mal auf das Datum... das ist ein Thread, aus meinen Anfangszeiten... nein.. das war sogar mein erstes "richtiges" Pythonprogramm, was ich geschrieben habe.(damals!)

Und ansonsten.... nein!, das kann man nicht oft genug sagen. Das Forum hier ist KLASSEEEE!
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Die lambdas sind richtig, in den jeweils letzten Klammern meintest Du wohl a statt x - damit ist auch range() richtig eingesetzt.

bmi = float(weight) / float((height/100)**2)
print 'Ihr BMI ist %2f' % float(bmi)

Probleme gibts unten - und an anderer Stelle als Dein Kommentar. Das hier funktioniert schon besser (bitte genau hinsehen):

Code: Alles auswählen

    bmi = float(weight) / float((height/100)**2)
    print 'Ihr BMI ist %2f' % float(bmi)
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

joost hat geschrieben:Die lambdas sind richtig, in den jeweils letzten Klammern meintest Du wohl a statt x - damit ist auch range() richtig eingesetzt.
siehe letzte Version *g* habs ja selber gefunden...
und äähm --> nein... 'b' statt 'x' wäre richtig gewesen ;)
bmi = float(weight) / float((height/100)**2)
print 'Ihr BMI ist %2f' % float(bmi)

Probleme gibts unten - und an anderer Stelle als Dein Kommentar. Das hier funktioniert schon besser (bitte genau hinsehen):

Code: Alles auswählen

    bmi = float(weight) / float((height/100)**2)
    print 'Ihr BMI ist %2f' % float(bmi)
Hmm? 'check_input', gibt mir ne wunderschöne 'float' Zahl zurück. Daher brauche ich das nicht mehr so umständlich machen ;)

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

So... nochmal eine kleine Fehlerbereinigte Version, wo die Ausgabe auch wieder schön ist:

Code: Alles auswählen

# -*- coding: cp1252 -*-
# den BMI des Menschen ausrechnen
# BMI = Körpergewicht : (Körpergröße in m)²

import re, sys

POS = {
    'Untergewicht': (lambda g,b,a: (g=='m' and b<20) or (g=='w' and b<19)),
    'Normalgewicht': (lambda g,b,a: (g=='m' and b in range(20, 26)) or (g=='w' and (b in range(19,25)))),
    'Übergewicht': (lambda g,b,a: (g=='m' and b in range(25, 31)) or (g=='w' and (b in range(24,31)))),
    'Adipositas': (lambda g,b,a: (g=='m' and b in range(30, 41)) or (g=='w' and (b in range(30,41)))),
    'massive Adipositas': (lambda g,b,a: b>40),
}

def check_input(data):
    return float(re.sub(r'[a-zA-Z_]+', '', data).replace(',', '.'))

def create_bmi_table():
    result = []
    for i in xrange(6):
        result.append([14 + i * 10, 24 + i * 10, 19 + i])
    result[0][0] = 0
    result[-1][1] = sys.maxint
    return result

def main():
    print 'Mit diesem Programm wird Ihr BMI (Body Mass Index) ausgerechnet'
    print '--------------------------------------------------------------'

    weight = check_input(raw_input('Geben Sie bitte Ihr Körpergewicht an: '))
    height = check_input(raw_input('Geben Sie bitte Ihre Körpergröße(in Meter) an: '))
    bmi = weight / (height**2)
    print 'Ihr BMI ist %.2f' % bmi
    print 'Bitte geben Sie ihr alter an:'
    age = int(check_input(raw_input(' ')))
    gender = raw_input("Ihr geschlecht (m, w): ")
    for x in POS:
        if POS[x](gender, int(bmi), age):
            print 'Sie haben %s... und...' % x
    bmi_table = create_bmi_table()
    for floor, cap, bmi_floor in bmi_table:
        if floor < age < cap:
            print ('... Ihr BMI-Wert sollte Ihrem Alter entsprechend zwischen'
                   ' %d und %d liegen.' % (bmi_floor, bmi_floor + 5))
    print

if __name__ == '__main__':
    main()
Viel Spaß, beim ausprobieren!
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

EnTeQuAk, darum ging es nicht. Es geht um den gestrichenen Punkt in '%2f' und die '/100'.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich muss mich korrigieren mit Py2Exe schaffe ich es nicht eine EXE unter Linux zu builden. Aber der Fehler ist warscheinlich nicht das es nicht geht. Man muss sicherlich nur den Code etwas anpassen. Es gibt einen nicht implementiert Error nach dem er die benötigten Datein hat und versucht sie zusammen zu kopieren.

Spielt auch keine Rolle, weil ich gerade ein Tkinter Exe und eine Consollen Exe unter Linux mit Pyinstaller gebuildet habe und sie laufen mit WINE unter Linux und auch auf Windows (getestet mit XP SP.1)
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

EnTeQuAk, darum ging es nicht. Es geht um den gestrichenen Punkt in '%2f' und die '/100'.
Hast du das ausprobiert? Komme was wolle... ich verstehe nicht, was du mir damit sagen möchtest. Setze ich beides in mein Programm ein, bekomme ich Ergebnisse, die ich nicht sehen möchte...
Konsole hat geschrieben:Ihr BMI ist 249307.479224
und solche Sachen *g*


@Sr4l: macht auch nichts. Ich hab mir jetzt auf Vaters' PC selbst ne build-umgebung eingerichtet. ;) Einer muss ja drann glauben *g*
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Ja, lief so bei mir. Ich meinte 'schon besser' wirklich wörtlich, davor hatte ich immer 0.00 im Ausdruck. Dass es so nur fast hinhaut, war auch meinen Ergebnissen anzusehen.
Antworten