Jackery IFA Fireplace

Python Anfänger hat nen Syntaktischen Fehler (Methoden?)

Kai-133

Lieutenant
Registriert
Feb. 2009
Beiträge
715
Hallo alle zusammen,

in meiner Schule programmieren wir zur Zeit mit Java. Ich habe es mir aber zur Aufgabe gemacht ein Python Programm zu schreiben und dieses dann mit Java zu vergleichen.
Kleinere Programme habe ich bereits mit Python programmiert (if und while schleifen). Nun zerbreche ich mir aber den Kopf, weil ich bei den Methoden nicht weiter komme. Mein geschriebenes Programm kann ich nicht einmal ausführen.

PHP:
# Dies ist das Kassenprogramm (zum vergleich liegt eine Java version bei)

rabatt = 0.0
rbetrag = 0.0
mws = 0.0
ht = ""
wied = "j"

# Anfang der "do-while" Schleife
while wied == "j":
	
	# Eingabe des Rechnungsbetrags
	rbetrag=input("Bitte geben Sie den Rechnungsbetrag ein: ")
	
	# If bedingungen zum ermitteln der Prozente
	if rbetrag>=1000
		proz=10
		prozent(rbetrag, proz)
		ht="höher"
		
	if rbetrag<1000
		proz=5
		prozent(rberag, proz)
		ht="niedriger"
	
	# Ausrechnen des Endbetrags, soewie der mws	
	rbetrag=rbetrag-rabatt
	mws=prozent(rbetrag, 19)

	# Ausgaben	
	print "Ihr Betrag ist " ,ht ,", als 1000 Euro. Sie erhalten einen Rabatt von " ,proz ," Prozent"
	print "Sie müssen " ,rbetrag ," Euro zahlen."
	print "Mehrwertsteuer: " ,mws ," Euro"
	
	#Abfrage ob die Rechnung korrekt ist (für die Schleife)
	wied=raw_input("Ist der eingegebene Rechnungsbetrag und somit die Rechnung korrekt? (j/n): "
	print
	
	if wied == "j"
		break

# Methode zum ausrechnen des: rabattes, mws		
def prozent(rbetrag, proz):
	erg=0.0
	erg=rbetrag*proz/100
	return erg

Könnt ihr mir bitte helfen?

Mit freundlichen Grüßen

Kai
 
Zuletzt bearbeitet:
Wie startest du das ganze?
Wie lautet die Fehlermeldung?

Falls du das so in den Interpreter schickst:
Die Definition der Funktion muss vor dem ersten Aufruf stehen.
Geht der Code so in den Interpreter, erfolgt die Definition jedoch zum Schluss.
Dann kennt er die Funktion "prozent" nicht.

Kleine Anmerkung: das mit wied finde ich etwas kompliziert...anstatt von vorneherein
die Wiederholung auf "j" zu setzten, würde ich eine Variable korrekt='n' setzten.
Schließlich fragst du am Ende den User ob die Rechnung so korrekt ist, und dort setzt der User dann
"Wied='j'" und trotzdem wird nicht wiederholt. Das funktioniert zwar, macht aber von der Variablenbenennung keinen Sinn.
 
Zuletzt bearbeitet:
Also ich gehe in die Console und gebe dann den Pfad von dem Programm ein.
Das DOS Fesnster verschwindet aber ganz schnell.
Programmieren tue Ich mit Notepad++

PHP:
# Dies ist das Kassenprogramm (zum vergleich liegt eine Java version bei)

rabatt = 0.0
rbetrag = 0.0
mws = 0.0
ht = ""
wied = "j"

# Methode zum ausrechnen des: rabattes, mws		
def prozent(rbetrag, proz):
	erg=0.0
	erg=rbetrag*proz/100
	return erg

# Anfang der "do-while" Schleife
while wied == "j":
	
	# Eingabe des Rechnungsbetrags
	rbetrag=input("Bitte geben Sie den Rechnungsbetrag ein: ")
	
	# If bedingungen zum ermitteln der Prozente
	if rbetrag>=1000:
		proz=10
		rabatt=prozent(rbetrag, proz)
		ht="hoeher"
		
	else:
		proz=5
		rabatt=prozent(rbetrag, proz)
		ht="niedriger"
	
	# Ausrechnen des Endbetrags, soewie der mws	
	rbetrag=rbetrag-rabatt
	mws=prozent(rbetrag, 19)

	# Ausgaben	
	print "Ihr Betrag ist " ,ht ,", als 1000 Euro. Sie erhalten einen Rabatt von " ,proz ," Prozent"
	print "Sie muessen " ,rbetrag ," Euro zahlen."
	print "Mehrwertsteuer: " ,mws ," Euro"
	
	#Abfrage ob die Rechnung korrekt ist (fuer die Schleife)
	wied=raw_input("Ist der eingegebene Rechnungsbetrag und somit die Rechnung korrekt? (j/n):")
	print wied
	
	if wied == "j":
		break

beim if haben ":" gefehlt und ich hatte umlaute. Jetzt muss ich nurnoch die do-while zum laufen bekommen :)
 
Zuletzt bearbeitet:
Code:
# Dies ist das Kassenprogramm (zum vergleich liegt eine Java version bei)

rabatt = 0.0
rbetrag = 0.0
mws = 0.0
ht = ""
wied = "j"

# Methode zum ausrechnen des: rabattes, mws		
def prozent(rbetrag, proz):
	erg=0.0
	erg=rbetrag*proz/100
	return erg

# Anfang der "do-while" Schleife
while wied == "j":
	
	# Eingabe des Rechnungsbetrags
	rbetrag=input("Bitte geben Sie den Rechnungsbetrag ein: ")
	
	# If bedingungen zum ermitteln der Prozente
	if rbetrag>=1000:
		proz=10
		prozent(rbetrag, proz)
		ht="hoeher"
		
	if rbetrag<1000:
		proz=5
		prozent(rbetrag, proz)
		ht="niedriger"
	
	# Ausrechnen des Endbetrags, soewie der mws	
	rbetrag=rbetrag-rabatt
	mws=prozent(rbetrag, 19)

	# Ausgaben	
	print "Ihr Betrag ist " ,ht ,", als 1000 Euro. Sie erhalten einen Rabatt von " ,proz ," Prozent"
	print "Sie muessen " ,rbetrag ," Euro zahlen."
	print "Mehrwertsteuer: " ,mws ," Euro"
	
	#Abfrage ob die Rechnung korrekt ist (fuer die Schleife)
	wied=raw_input("Ist der eingegebene Rechnungsbetrag und somit die Rechnung korrekt? (j/n):")
	print wied
	
	if wied == "j":
		break


So gehts:

-Keine Rechtschreibfehler bitte! ;) rbetrag wurde mal falschgeschrieben (Line 29).
-Dann werden Methoden/Funktionen am Anfang deklariert - nicht am Schluss.
-Bei "if" folgt der Bedingung ein ":"
-Einmal hast du NUR print geschrieben, allerdings nicht, was ausgegeben werden soll.



Nebenbei: Welche Python-Version nutzt du? Hier sollte glaub 2.7 genutzt werden, da ab späteren Versionen <<print "hallo">> nicht mehr geht -- muss so geschrieben werden: <<print("Hallo")>>



Kleiner Tipp: Du kannst
Code:
erg=0.0
erg=rbetrag*proz/100
auch so schreiben:
Code:
erg=rbetrag*proz/100.0

Und:
if rbetrag>=1000:
...
if rbetrag<1000:
Hier gibt es auch ein "else" ;)


Noch ein kleiner Tipp (in Python sehr schnell):
Code:
print "Der Wert ", variable, " steht in der Variable"
==
print " ".join(["Der Wert", variable, "steht in der Variable"])


Achso und noch etwas:
In Python sind Umlaute verboten! Nicht in Kommentaren, nicht in Strings, nicht in Variablennamen. Einfach durch ae, ue, oe ersetzen.
 
Zuletzt bearbeitet:
Vielen Dank!

So sieht jetzt das fertige Programm aus:
PHP:
# Dies ist das Kassenprogramm (zum vergleich liegt eine Java version bei)

rabatt = 0.0
rbetrag = 0.0
mws = 0.0
ht = ""
wied = "j"

# Methode zum ausrechnen des: rabattes, mws		
def prozent(rbetrag, proz):

	erg=rbetrag*proz/100
	return erg

# Anfang der "do-while" Schleife
while wied == "j":
	
	# Eingabe des Rechnungsbetrags
	rbetrag=input("Bitte geben Sie den Rechnungsbetrag ein: ")
	
	# If bedingungen zum ermitteln der Prozente
	if rbetrag>=1000:
		proz=10
		rabatt=prozent(rbetrag, proz)
		ht="hoeher"
		
	else:
		proz=5
		rabatt=prozent(rbetrag, proz)
		ht="niedriger"
	
	# Ausrechnen des Endbetrags, soewie der mws	
	rbetrag=rbetrag-rabatt
	mws=prozent(rbetrag, 19)

	# Ausgaben	
	print "Ihr Betrag ist " ,ht ,", als 1000 Euro. Sie erhalten einen Rabatt von " ,proz ," Prozent"
	print "Sie muessen " ,rbetrag ," Euro zahlen."
	print "Mehrwertsteuer: " ,mws ," Euro"
	
	#Abfrage ob die Rechnung korrekt ist (fuer die Schleife)
	wied=raw_input("Ist der eingegebene Rechnungsbetrag und somit die Rechnung korrekt? (j/n):")
	print 
	
	if wied == "j":
		break

Alles funktioniert wie es soll, nur die do-while Schleife nicht, obwohl Python Strings vergleichen kann. ( Ich habe mir hierzu den Abschnitt 7.5 durchgelesen.)
 
Zuletzt bearbeitet:
ich hab es dir oben schon geschrieben:

die while-schleife wird solange ausgeführt wie wied='j' ist.

Ist die Rechnung allerdings falsch, setzt der user wied!='j'. Die Schleife bricht also trotzdem ab.
Niemals zum beenden und fortführen einer Schleife die gleiche Bedingung verwenden!
Damit verwirrt man sich nur selbst...

Setze einfach den standard-case auf wied='n' und die while-schleife ebenfalls. Dann passt es.
Nur dann stimmt der Name deiner Variable nicht mehr. Deswegen der Vorschlag mit correct.

Außerdem solltest du noch Input abfangen, der nicht (j/n) ist und nochmal zur Eingabe auffordern. ;)
 
Zuletzt bearbeitet:
Ja danke da hab ich wohl nicht richtig nachgedacht. Jetzt funktioniert alles.
 
Aber nur solange rbetrag und proz nicht-ganze Zahlen sind. (In der Funktion)
Lieber noch ein ".0" hinter die 100 schreiben.
 
Zurück
Oben