Hallo, brauche Rat beim erstellen einer Funktion V2.7.3

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
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

Hallo Programmierlinge !

Ich habe vor ein paar tagen mit Python angefangen. Nun will ich versuchen ein kleines Programm zu schreiben das ein paar Formeln der Physik ausrechnet. Hier erst mal der Code :

Code: Alles auswählen

version = "Version 1.0"
print "Physikprogramm, %s " % version
physikthemen = ["Mechanik", "Thermodynamik"]
mechanik = ["Senkrechter Wurf"]
thermodynamik = ["Gasgleichung"]
print "Was moechten Sie berechnen? "
for themen in physikthemen:
	print themen
a = raw_input("> ")

def calculate_one(t):
	return (10/2)*t*t
	
if a == physikthemen[0]:
	for themen in mechanik:
		print themen 
	print "Berechnung der Strecke mit g : "
	t = raw_input("Nach wieviel Sekunden ?\n> ")
	calculate_one(t)
	
	
elif a == physikthemen[1]:
	for themen in thermodynamik:
		print themen
	print "Berechnung des Volumens bei konstanter Dichte: "
	raw_input("Druck?\n>")
else:
	print "Abbruch"
Bitte nicht lachen wenn das zu bekloppt aussieht :D
Ich will da noch viel mehr einbauen, das soll erst mal der Prototyp sein für meine ersten Versuche.
Das ist der Fehler den ich bekomme:

Traceback (most recent call last):
File "ex1.py", line 19, in <module>
calculate_one(t)
File "ex1.py", line 12, in calculate_one
return (10/2)*t*t
TypeError: can't multiply sequence by non-int of type 'str'

Und zwar will ich das Programm so schreiben das ich möglichst viel von dem Zeug das ich gelesen hab dort verwenden kann. Ich hab mir überlegt das ich jeweils die Formeln als eigene Funktionen definiere, also die Rechenvorschrift in der Funktion ist, und diese Funktion dann den Wert ausgiebt. Der Fehler liegt jetzt also hier dran:

Code: Alles auswählen

def calculate_one(t):
	return (10/2)*t*t 
und eben an dem

Code: Alles auswählen

calculate_one(t)
Also ich hoffe man versteht was ich meine, ist irgendwie schwer zu erklären. Ich weiß das ich diese Berechnungen auch einfacher machen kann, ich will aber mit diesen Funktionen üben damit ich ein Gefühl dafür bekommen kann, daher diese Aufwand.
Kann mir da jemand helfen?

Lg
Zuletzt geändert von Anonymous am Sonntag 17. März 2013, 23:04, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

raw_input gibt immer eine Zeichenkette zurück, und wenn du mit der Eingabe rechnen willst, dann musst du sie erst mal umwandeln, zum Beispiel mit int(raw_input()) (für eine ganze Zahl) oder mit float(raw_input()) (für eine Fließkommazahl).
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

Hallo nomnom !
Klasse, es funktioniert :)
Vielen Dank für die Hilfe, ich schau mir auch mal die Eingabebefehle noch mal neu an !

Gruß
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

Hallo ich hab noch eine Frage.
Wie kann ich denn eine Eingabe machen die "string" und gleichzeitig auch zahlen,dezimalzahlen akzeptiert??
Hier noch mein code:
(ich will einfach das wenn man exit eingibt, dann das Programm "beendet" wird)

Code: Alles auswählen

version = "Version 1.0"
print "Physikprogramm, %s " % version
physikthemen = ["Mechanik", "Thermodynamik"]
mechanik = ["Senkrechter Wurf"]
thermodynamik = ["Gasgleichung"]
print "Was moechten Sie berechnen? Fuer Abbrechen, exit eingeben."
for themen in physikthemen:
	print themen
a = raw_input("> ")

def function_one(t):
	return (9.81/2)*t*t

def function_two(p):
	return (1*8.31*273.15 )/p

c = open("Mechanik.txt","w+")
b = open("Thermodynamik.txt","w+")
	
	
if a == physikthemen[0]:
	for themen in mechanik:
		print themen 
	while a != "exit":
		print "Berechnung der Strecke mit g : "
		t = float(raw_input("Zeit in Sekunden ?\n> "))
		print function_one(t)
		c.write(str(function_one(t)))
		
	
	
if a == physikthemen[1]:
	for themen in thermodynamik:
		print themen
	print "Berechnung des Volumens bei Standardbedingungen mit 1 mol: "
	p = float(raw_input("Druck?\n>"))
	print function_two(p)
	b.write(str(function_two(p)))
	c.close()
else:
	print "Ende"
Gruß
BlackJack

@JonnyDamnnox: Dafür könnte man sich eine Funktion schreiben die eine Zeichenkette einliest, prüft ob die gleich 'exit' ist und erst wenn das nicht der Fall ist die Zeichenkette in eine Zahl umwandelt.

Die Namen in dem Programm sind teilweise schlecht. `themen` ist nur an *ein* Thema gebunden. Die ganzen einbuchstabigen Namen verraten dem Leser rein gar nichts über die Bedeutung der Werte die daran gebunden sind. Selbst längere Namen wie `function_one()` und `function_two()` sind total nichtssagend.

Nach dem die erste Eingabe vom Benutzer gelesen wurde, werden erst einmal Funktionen definiert bevor der Quelltext mit der Verarbeitung der Eingabe weiter geht. Das ist unübersichtlich. Namen sollten dort eingeführt werden, wo sie auch gebraucht werden.

Egal welche Eingabe der Benutzer am Anfang macht, es werden beide Dateien geöffnet. Und eine wird gar nicht wieder geschlossen und die andere abhängig von der Benutzereingabe mal ja, mal nicht.

Die Listen `mechanik` und `thermodynamik` machen keinen Sinn sondern nur den Code unnötig komplexer.

Die Berechnungen mit `function_one()` und `function_two()` werden jeweils unnötigerweise zweimal durchgeführt, statt sich das Ergebnis für die beiden Ausgaben zu merken.

Alle Ergebnisse werden einfach aneinander gehängt in den Dateien, ohne das sie mindestens durch Leerzeichen, besser aber noch durch Zeilenenden getrennt werden. Ausserdem ist der Dateimodus 'w+' ziemlich sicher nicht der gewünschte. Es wird dabei weder mit einer neuen, leeren Datei begonnen, noch werden die Daten am Ende der Datei angehängt. Wenn die Datei also schon existiert und die neuen Ergebnisse kürzer als die Vorhandenen sind, hat man einen Mix in der Datei stehen mit dem man nicht wirklich etwas anfangen kann.
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

Hallo BlackJack, danke für deine ausführliche Hilfe !

Also das ist das erste Programm das ich schreibe, mir geht es jetzt nicht darum den code zu optimieren, sondern ich will erst mal das alles was ich gelernt hab zum ersten mal in einem Programm benutzen, ich hab noch überhaupt keinen Überblick. Also von daher bitte Gnade :D

Zu meinem Problem:
Wie würde denn so eine Funktion aussehen, die eine Zeichenkette einliest prüft ob sie exist ist und das dann wieder in eine Zahl umwandelt?? Gibts einen einfachereren Weg?

Lg
BlackJack

@JonnyDamnnox: Ich würde vernünftige Namen nicht als optimieren bezeichnen. Genau so wenig das man ein Programm nicht unnötig komplexer macht als es nötig ist. Wenn man etwas lernt, dann gehört dazu auch zu wissen wann man es benutzt, und wann eben nicht. Und die Sachen zu den Dateien sind IMHO Fehler in dem Programm, hat also auch nichts mit Optimieren zu tun.
Antworten