Seite 1 von 2

Verfasst: Freitag 28. Juli 2006, 12:52
von birkenfeld
DatenMetzgerX hat geschrieben:

Code: Alles auswählen

gewicht = float(string.replace(gewicht, ',', '.')) #Ersetzt das Komma durch einen Punkt
groesse = float(string.replace(groesse, ',', '.'))
Kleine Sache:
string.replace ist deprecated. Entweder str.replace nehmen oder gleich gewicht.replace(',', '.').

Verfasst: Freitag 28. Juli 2006, 13:15
von EnTeQuAk
Danke ;)

gleich mal umgeschrieben.


So und mein Problem mit der EXE ich weiß nicht warum aber ich finds komisch. Ich habe Pyinstaller nun mal doch auf dem Notebook(Windows) auisgeführt und es klappt einwandfrei. Aber wenn ich es wieder unter Linux zur EXE mache klappt es wieder nicht. Auch der Inhalt ist komplett anders.

Kann es sein das ich unter Linux nicht wirklich eine EXE für Windows XP machen kann?

MfG ChrissiG

Verfasst: Mittwoch 2. Mai 2007, 14:49
von EnTeQuAk
Ich trau mich jetzt einfach mal zu einer Neuauflage... ;)

Nur... ganz funktionieren tut das noch nicht. Ich habe endlich mal eine Möglichkeit gefunden, wo ich mich mal an 'lambda' Ausdrücken ausprobieren kann. Nur... ich habs einfach nicht drauf.

Wo habe ich meine Lambda's falsch definiert? Sieht jemand von euch eventuell den Fehler?

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 x,y: x<20 and y<19),
    'Normalgewicht': (lambda x,y: (x in range(20, 25)) and (y in range(19,24))),
    'Übergewicht': (lambda x,y: (x in range(25, 31)) and (y in range(24,31))),
    'Adipositas': (lambda x,y: (x in range(30, 41)) and (y in range(30,41))),
    'massive Adipositas': (lambda x,y: x>40 and y>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 = check_input(raw_input(' '))
    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))

    # Hier kommt mein Problem... wo hab die die lambda's falsch definiert?
    print
    for x in POS:
        print "Sie haben %s: %s" % (x, POS[x](bmi, age))

if __name__ == '__main__':
    main()
MfG EnTeQuAk

€dit: BMI == Body Mass Index...
Danke, birkenfeld! *g*

Verfasst: Mittwoch 2. Mai 2007, 14:50
von birkenfeld
Das Ding heißt übrigens "Body Mass Index"... ;)

Verfasst: Mittwoch 2. Mai 2007, 14:59
von EyDu
EnTeQuAk hat geschrieben:Wo habe ich meine Lambda's falsch definiert? Sieht jemand von euch eventuell den Fehler?
Ich glaube du hast die range-Funktion noch nicht richtig verstanden.

Verfasst: Mittwoch 2. Mai 2007, 14:59
von EnTeQuAk
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?

Verfasst: Mittwoch 2. Mai 2007, 15:11
von EnTeQuAk
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

Verfasst: Mittwoch 2. Mai 2007, 15:13
von EyDu
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

Verfasst: Mittwoch 2. Mai 2007, 15:13
von Sr4l
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 ?

Verfasst: Mittwoch 2. Mai 2007, 15:20
von EnTeQuAk
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!

Verfasst: Mittwoch 2. Mai 2007, 15:31
von joost
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)

Verfasst: Mittwoch 2. Mai 2007, 15:35
von EnTeQuAk
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

Verfasst: Mittwoch 2. Mai 2007, 15:43
von EnTeQuAk
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!

Verfasst: Mittwoch 2. Mai 2007, 16:12
von joost
EnTeQuAk, darum ging es nicht. Es geht um den gestrichenen Punkt in '%2f' und die '/100'.

Verfasst: Mittwoch 2. Mai 2007, 16:35
von Sr4l
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)

Verfasst: Mittwoch 2. Mai 2007, 17:12
von EnTeQuAk
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*

Verfasst: Mittwoch 2. Mai 2007, 17:43
von joost
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.