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:

Freitag 28. Juli 2006, 10:11

Hallo, ich habe mir gerade ein Programm gebastelt, welches den BMI-Wert eines Menschen ausrechnet.

Das ganze schaut im Moment so aus:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# den BMI des Menschen ausrechnen
# BMI = Körpergewicht : (Körpergröße in m)²


print 'Mit diesem Programm wird Ihr BMI (Body Maß Index) ausgerechnet'
print
print 'Geben Sie nur Zahlen ein und ersetzen sie ein Komma durch einen Punkt!'
print
gewicht = input('Geben Sie Ihr Körpergewicht an: ')
groesse = input('Geben Sie Ihre Körpergröße an: ')
bmi = gewicht / (groesse*groesse)

ausgabe = 'Sie haben einen BMI von', int(bmi) # umwandeln in ganze Zahl
print
print ausgabe[0], ausgabe[1]
print
print
print 'Zum Vergleich So sind die BMI Normalwerte:'
print '19-24 Jahre	19-24'
print '25-34 Jahre	20-25'
print '35-44 Jahre	21-26'
print '45-54 Jahre	22-27'
print '55-64 Jahre	23-28'
print '>64 Jahre	24-29'
print
print 'Und hier die Einstufung:'
print 'Untergewicht	<20	<19'
print 'Normalgewicht	20-25	19-24'
print 'Übergewicht	25-30	24-30'
print 'Adipositas	30-40	30-40'
print 'massive Adipositas	>40	>40'

Das ganze geht ohne Probleme. Nur ich frage mich. Woran liegt es das ich das Ergebnis in der Variablen "ausgabe" als Tupel gespeichert wird. Denn wenn ich nur

Code: Alles auswählen

print ausgabe
eingebe zeigt er mir seinen Tupel an.

Liegt das an

Code: Alles auswählen

int(bmi)
?

Und wie loese ich das Problem das die Person am Anfang seine Körpergröße auch mit einem Komma angeben kann? Meine Idee war es das ganze als String einzugeben und dann in eine Float-Zahl umzuwandeln... Ich dachte dadurch würde er das Komma automatisch umwandeln, aber das tat er nicht ;'(

Was gäbe es da für Möglichkeiten?

Danke für die Hilfe... schon vorweg: Das Board is Klasse! ;) *schleim*

MfG EnTeQuAk
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Freitag 28. Juli 2006, 10:21

Code: Alles auswählen

#!/usr/bin/env python
#-*-coding: latin-1 -*-
# den BMI des Menschen ausrechnen
# BMI = Körpergewicht : (Körpergröße in m)²

import os
import string

print 'Mit diesem Programm wird Ihr BMI (Body Maß Index) ausgerechnet'
print
print 'Geben Sie nur Zahlen ein und ersetzen sie ein Komma durch einen Punkt!'
print
gewicht = raw_input('Geben Sie Ihr Körpergewicht an: ')
groesse = raw_input('Geben Sie Ihre Körpergröße an: ')

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

bmi = gewicht / (groesse*groesse)

#ausgabe = 'Sie haben einen BMI von', int(bmi) Unnoetig, ueber umweg zu machen
print
print 'Sie haben einen BMI von %.2f' % bmi
print
print
print 'Zum Vergleich So sind die BMI Normalwerte:'
print '19-24 Jahre    19-24'
print '25-34 Jahre    20-25'
print '35-44 Jahre    21-26'
print '45-54 Jahre    22-27'
print '55-64 Jahre    23-28'
print '>64 Jahre    24-29'
print
print 'Und hier die Einstufung:'
print 'Untergewicht    <20    <19'
print 'Normalgewicht    20-25    19-24'
print 'Übergewicht    25-30    24-30'
print 'Adipositas    30-40    30-40'
print 'massive Adipositas    >40    >40'

os.system('Pause')
[/code]
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Freitag 28. Juli 2006, 10:35

Ok das geht. Aber wozu importierst du das OS?

Code: Alles auswählen

import os
Weil wenn ich das auskommentiere bekomme ich keine Fehlermeldung, daher vermute ich das man es weglassen kann oder?

Und für die Lösung mit dem Umwandeln des Komma Danke!

Und Danke ;) jetzt habe ich gelernt wie man Stellen nach dem Komma wegmacht ;)

Code: Alles auswählen

print 'Sie haben einen BMI von %.2f' % bmi
und bedeutet das er nur die erste Stelle anzeigt... und dabei aufrundet ;) Das ist sehr hilfreich!

Danke!

MfG EnTeQuAk
BlackJack

Freitag 28. Juli 2006, 10:44

ChrissiG hat geschrieben:

Code: Alles auswählen

gewicht = input('Geben Sie Ihr Körpergewicht an: ')
groesse = input('Geben Sie Ihre Körpergröße an: ')
Hier wäre es nicht schlecht dem Benutzer auch zu sagen in welcher Einheit die Eingaben erwartet werden. Meine Mutter würde da zum Beispiel wahrscheinlich Zentimeter und Pfund angeben und sich über das Ergebnis wundern. ;-)

Code: Alles auswählen

ausgabe = 'Sie haben einen BMI von', int(bmi) # umwandeln in ganze Zahl[code][/quote]

Hier ist das Problem:  Du weist `ausgabe` ein Tupel mit zwei Elementen zu!  Tupel werden durch Kommata "gemacht", nicht durch runde Klammern.  Ausnahmen sind das leere Tupel ``()`` und an Stellen wo Mehrdeutigkeiten auftreten können, müssen runde Klammern gesetzt werden.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Freitag 28. Juli 2006, 10:56

ahh daran lag es ;) schön das ich euch habe :D

So nun eine etwas weitreichendere Frage... glaub ich.

Mein Vater möchte das mal wieder selber auf seinem Windowsrechner ausprobieren. Ich benutze ja Ubuntu Linux. So mit py2exe kann ich das umwandeln.

Aber entweder bin ich blind oder auf der Webseeite von http://www.py2exe.org/ steht nichts wie das unter Linux geht. Geht das unter Linux, wenn ja wie?

Freue mich auf Antworten ;)

MfG EnTeQuAk
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 28. Juli 2006, 11:30

ChrissiG hat geschrieben:Aber entweder bin ich blind oder auf der Webseeite von http://www.py2exe.org/ steht nichts wie das unter Linux geht. Geht das unter Linux, wenn ja wie?
Natürlich nicht mit py2exe, denn Linux nutzt keine EXE-Dateien. Such mal im Forum nach cx_Freeze oder PyInstaller.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 28. Juli 2006, 11:36

Leonidas hat geschrieben:Such mal im Forum nach cx_Freeze oder PyInstaller.
Hi!

Allerdings glaube ich nicht, dass man mit cx_Freeze unter Linux eine Executable für Windows machen kann.

Installiere auf Vaters Computer Python. Das geht am Schnellsten. Wenn du mehr mit Python machen willst, dann wird es sicher auch mehrere Programme geben, die dein Vater von dir haben möchte. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 28. Juli 2006, 11:53

gerold hat geschrieben:Allerdings glaube ich nicht, dass man mit cx_Freeze unter Linux eine Executable für Windows machen kann.
Mit etwas Aufwand sollte es möglich sein.

Aber py2exe unter WIndows installieren und nutzen ist natürlich am einfachsten. Noch einfacher: gleich Python auf dem Rechner installieren, da spart man sich das erstellen der EXE Dateien ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Freitag 28. Juli 2006, 12:01

ja is schon klar mit dem erstellen der EXE Files ;) Aber ich wills einfach... schon weil ich es evtl. später sowieso brauchen werde.

So ich habe nun versucht Pyinstaller zu installieren bzw. damit zu arbeiten (unter Linux)

Es kam folgender "Dialog" heraus:
ente@EnTeQuAk:~/Desktop/pyinstaller_1.2$ python Configure.py
I: computing EXE_dependencies
I: Finding TCL/TK...
I: found TCL/TK version 8.4
I: testing for Zlib...
I: ... Zlib available
I: Testing for Unicode support...
I: ... Unicode available
I: testing for UPX...
I: ...UPX available
I: computing PYZ dependencies...
ente@EnTeQuAk:~/Desktop/pyinstaller_1.2$ cd source/linux
ente@EnTeQuAk:~/Desktop/pyinstaller_1.2/source/linux$ python Make.py
Now run "make" to build the targets: ../../support/loader/run ../../support/loader/run_d
ente@EnTeQuAk:~/Desktop/pyinstaller_1.2/source/linux$ make
gcc -pthread -I/usr/include -I/usr/include/python2.4 -I../common -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -DHAVE_WARNINGS -c getpath.c -o getpath.o
getpath.c:39:20: Fehler: Python.h: No such file or directory
getpath.c:40:20: Fehler: osdefs.h: No such file or directory
getpath.c:54: Fehler: »MAXPATHLEN« ist hier nicht deklariert (nicht in einer Funktion)
getpath.c: In Funktion »reduce«:
getpath.c:63: Fehler: »SEP« nicht deklariert (erste Benutzung in dieser Funktion)
getpath.c:63: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt
getpath.c:63: Fehler: für jede Funktion in der er auftritt.)
getpath.c: In Funktion »joinpath«:
getpath.c:135: Fehler: »SEP« nicht deklariert (erste Benutzung in dieser Funktion)
getpath.c: In Funktion »calculate_path«:
getpath.c:152: Warnung: implizite Deklaration der Funktion »Py_GetProgramName«
getpath.c:152: Warnung: Initialisierung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
getpath.c:159: Fehler: »SEP« nicht deklariert (erste Benutzung in dieser Funktion)
getpath.c:169: Warnung: implizite Deklaration der Funktion »getenv«
getpath.c:169: Warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
getpath.c:177: Fehler: »DELIM« nicht deklariert (erste Benutzung in dieser Funktion)
getpath.c:197: Warnung: implizite Deklaration der Funktion »free«
getpath.c:157: Warnung: Variable »numchars« wird nicht verwendet
getpath.c:153: Warnung: Variable »argv0_path« wird nicht verwendet
make: *** [getpath.o] Fehler 1
ente@EnTeQuAk:~/Desktop/pyinstaller_1.2/source/linux$
Das Problem ist das ich es exakt nach Anleitung gemacht habe... und verschiedene Attribute auch probiert habe... die haben aber exakt das gleiche herausgehauen ;(

Hat jmd. eine Lösung?

MfG EnTeQuAk
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 28. Juli 2006, 12:03

ChrissiG hat geschrieben:Hat jmd. eine Lösung?
Dir fehlt Python.h :arrow: python-dev installieren.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Freitag 28. Juli 2006, 12:10

Das brachte mich schonmal etwas weiter ;)

Nun allerdings leider noch ein Problem.

Der Dialog schaut diesmal so aus.
ente@EnTeQuAk:~/Desktop/pyinstaller_1.2/source/linux$ python Make.py
Now run "make" to build the targets: ../../support/loader/run ../../support/loader/run_d
ente@EnTeQuAk:~/Desktop/pyinstaller_1.2/source/linux$ make
gcc -pthread -I/usr/include -I/usr/include/python2.4 -I../common -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -DHAVE_WARNINGS -c getpath.c -o getpath.o
gcc -pthread -I/usr/include -I/usr/include/python2.4 -I../common -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -DHAVE_WARNINGS -c main.c -o main.o
In Datei, eingefügt von /usr/include/python2.4/Python.h:8,
von ../common/launch.h:185,
von main.c:28:
/usr/include/python2.4/pyconfig.h:835:1: Warnung: »_POSIX_C_SOURCE« redefiniert
In Datei, eingefügt von /usr/include/stdio.h:28,
von ../common/launch.h:30,
von main.c:28:
/usr/include/features.h:190:1: Warnung: dies ist die Stelle der vorherigen Definition
gcc -pthread -I/usr/include -I/usr/include/python2.4 -I../common -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -DHAVE_WARNINGS -c ../common/launch.c -o launch.o
In Datei, eingefügt von /usr/include/python2.4/Python.h:8,
von ../common/launch.h:185,
von ../common/launch.c:42:
/usr/include/python2.4/pyconfig.h:835:1: Warnung: »_POSIX_C_SOURCE« redefiniert
In Datei, eingefügt von /usr/include/stdio.h:28,
von ../common/launch.c:28:
/usr/include/features.h:190:1: Warnung: dies ist die Stelle der vorherigen Definition
../common/launch.c:44:18: Fehler: zlib.h: No such file or directory
../common/launch.c: In Funktion »importModules«:
../common/launch.c:574: Warnung: Variable »buf« wird nicht verwendet
../common/launch.c: In Funktion »decompress«:
../common/launch.c:702: Fehler: »z_stream« nicht deklariert (erste Benutzung in dieser Funktion)
../common/launch.c:702: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt
../common/launch.c:702: Fehler: für jede Funktion in der er auftritt.)
../common/launch.c:702: Fehler: syntax error before »zstream«
../common/launch.c:706: Fehler: »zlibVersion« nicht deklariert (erste Benutzung in dieser Funktion)
../common/launch.c:713: Fehler: »zstream« nicht deklariert (erste Benutzung in dieser Funktion)
../common/launch.c:720: Warnung: implizite Deklaration der Funktion »inflateInit«
../common/launch.c:722: Fehler: »inflate« nicht deklariert (erste Benutzung in dieser Funktion)
../common/launch.c:722: Fehler: »Z_FINISH« nicht deklariert (erste Benutzung in dieser Funktion)
../common/launch.c:724: Fehler: »inflateEnd« nicht deklariert (erste Benutzung in dieser Funktion)
../common/launch.c: In Funktion »runScripts«:
../common/launch.c:867: Warnung: Zeigerziele bei Übergabe des Arguments 1 von »PyRun_SimpleString« unterscheiden sich im Vorzeichenbesitz
../common/launch.c: In Funktion »init«:
../common/launch.c:991: Warnung: Variable »p« wird nicht verwendet
make: *** [launch.o] Fehler 1
Ich persönlich kann mal wieder gar nichts damit anfangen außer am Ende mit der Warnung das die Variable "p" nicht verwendet wird... das sagt mir etwas... der rest leider nicht.

Ich hoffe das ihr mir weiterhelfen könnt. Bisher hats ja auch geklappt ;)

MfG EnTeQuAk
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Freitag 28. Juli 2006, 12:11

zlib.h wird nicht gefunden

evtl heisst das packet zlib-dev
asc
User
Beiträge: 13
Registriert: Sonntag 23. Juli 2006, 00:05
Wohnort: Wien.
Kontaktdaten:

Freitag 28. Juli 2006, 12:12

../common/launch.c:44:18: Fehler: zlib.h: No such file or directory
zlib, bzw. zlib-dev installieren.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Freitag 28. Juli 2006, 12:16

Ich könnt euch knutschen...

Es geht! ;) ;) Ich habe nun alles was ich benötige!

DANKE an alle die hier wirklich wiedereinmal vantastische Arbeit geleistet haben!

und vor allem... so schnell (das ist NICHT ironisch gemeint!)


Danke!

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

Freitag 28. Juli 2006, 12:26

So die EXE wurde erstellt. ob sie geht, wird gleich getestet

Es kamen wärend des erstellens noch ein paar Fehlermeldungen heraus.. so schaute die Ausgabe aus
ente@EnTeQuAk:~/Desktop/pyinstaller_1.2$ python Build.py /home/ente/Desktop/pyinstaller_1.2/bmi/bmi.spec
checking Analysis
building Analysis because out0.toc non existent
running Analysis out0.toc
Analyzing: support/_mountzlib.py
Analyzing: support/useUnicode.py
Analyzing: /home/ente/Desktop/python-skripte/bmi.py
Warnings written to /home/ente/Desktop/pyinstaller_1.2/bmi/warnbmi.txt
checking PYZ
rebuilding out1.toc because out1.pyz is missing
building PYZ out1.toc
checking PKG
rebuilding out3.toc because out3.pkg is missing
building PKG out3.pkg
checking ELFEXE
rebuilding out2.toc because bmi missing
building ELFEXE out2.toc
checking COLLECT
building out4.toc because out4.toc missing
building COLLECT out4.toc
Die Datei "warnbmi.txt" schaut nun so aus
W: no module named org (top-level import by copy)
W: no module named _emx_link (conditional import by os)
W: __all__ is built strangely at line 0 - dis (/usr/lib/python2.4/dis.pyc)
W: delayed __import__ hack detected at line 0 - encodings (/usr/lib/python2.4/encodings/__init__.pyc)
W: __all__ is built strangely at line 0 - re (/usr/lib/python2.4/re.pyc)
W: delayed eval hack detected at line 0 - os (/usr/lib/python2.4/os.pyc)
W: __all__ is built strangely at line 0 - tokenize (/usr/lib/python2.4/tokenize.pyc)
W: delayed conditional exec statement detected at line 0 - iu (/home/ente/Desktop/pyinstaller_1.2/iu.pyc)
W: delayed conditional exec statement detected at line 0 - iu (/home/ente/Desktop/pyinstaller_1.2/iu.pyc)
Kann ich die ignorieren? Oder sind das schwerwiegende Fehler?



EDIT: Also das Script ansich scheint zu gehen. Nur schließt sich das "DOS-Fenster/Konsole" nach max. 2 sekunden wieder. selbst nach einem

Code: Alles auswählen

raw_input('Mit Return beenden')
will es nicht da bleiben.

MfG EnTeQuAk
Antworten