Python Busch-Generator:

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
2011pscro
User
Beiträge: 2
Registriert: Freitag 22. Juni 2012, 09:57

Ich habe für die Schule einen kleines Programm gemacht, in dem man einen Busch erstellen kann.

Ich komme nicht weiter, denn der Teil mit Turtle funktioniert nicht!

Ich habe schon meinen Lehrer Gefragt und er wusste es auch nicht.
Kann mir bitte jemand helfen? Danke!!!


Mein Programm:

Code: Alles auswählen

print("-----------------------------------------------------------------------")
print("-----------------------------------------------------------------------")
print("----------------------------Strauchgenerator---------------------------")
print("-----------------------------------------------------------------------")
print("-----------------------------------------------------------------------")
print("Herzlich willkommen bei Ihrem Strauchgenerator")
print("")
print("")
print("")
print("Bitte geben Sie die Daten für Ihren Strauch an")
print("")

print("Beispiel zu Länge: 5cm => 5  (Es ist nur von 0 bis 40 möglich)")
x = int(input("Länge des Stammes: "))
if x > 40:
    x==40
    print("Zu gross! Der Strauchgenerator nimmt jetzt 40")
if x < 0:
    x==1
    print("Nicht unter null! Der Strauchgenerator nimmt jetzt 1")
else:
    print("Gut! Deine Nummer wird gebraucht")
print("")
print("Die Farbe deines Strauches ist Dunkelgrün")
print("")
z = int(input("Bitte gib noch die Dicke von 1cm bis 5cm an: "))
if z < 1:
    z == 1
    print("Die Dicke von 1cm wurde jetzt genommen")
if z > 5:
    z == 5
    print("Die Dicke von 5cm wurde jetzt genommen")
else:
    print("Ok deine Dicke wurde gespeichert")

print("")
print("Ihr Strauch wird jetzt in einigen Sekunden geöffnet!")
print("Viel Spass mit dem Strauch!")
print("")
from turtle import*
import time

def strauch(a, n):
    # Die Prozedur strauch ruft sich rekursiv selber auf!
    if n>0:
        forward(a);left(30);forward(a);
        strauch(a/2,n-1); backward(a); right(30); forward(a);
        right(30); forward(a/2);
        strauch(a/2,n-1); backward(a/2); left(30); forward(a);
        strauch(a/2,n-1); backward(3*a)

tracer(0)
a==x
color == x
width == z
left(90)
strauch(a,5)
time.sleep(10)
exit()



Ich würde mich sehr Freuen wenn mit Jemand helfen würde, danke schon im Voraus!
deets

Da sind diverse Fehler drin.

Du willst zb bestimmt nicht

x == 40

machen. Denn das *vergleicht* x mit 40, statt x den Wert 40 zuzuweisen... das ist der Unterschied zwischen = und ==. Und ganz ehrlich: ich bezweifele, dass dein Lehrer den nicht kennt!

Und ansonsten - was ist denn der konkrete Fehler den du bekommst?
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Was ist die Aufgabe des einzelnen exit's am Ende?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Generell ist die Struktur des Codes auch ziemlich "wüst". Wieso steht da ausführbarer Code vor einer Funktion und div. Imports? So etwas sollte man anders strukturieren, in etwa so:

Code: Alles auswählen

#!/usr/bin/env python

# Lizenzangaben
"""
    DocString zur Beschreibung Deines Moduls (=Programms)
"""

import bar
import foo
...

def func_1():
    pass

def func_2():
    pass

...

def main():
    # Startpunkt für Deinen Code... also etwa die ganzen Abfragen zur
    # Konfiguration

if __name__ == "__main__":
    main()
Damit ist Dein Script sauber strukturiert und leichter zu lesen.

Ich muss gestehen, dass ich den gesamten ersten Teil irgend wie unschön finde; den würde ich def. in eine separate Funktion auslagern, die bei Bedarf aufgerufen wird, um die ganzen Abfragen vom Benutzer zu holen. Zum Testen, ob Deine Busch-Mal-Routine überhaupt funktioniert, ist es doch umständlich, immer erst einmal alle Parameter einzutippen! Das kann man doch zum testen erst einmal fix in der `main`-Funktion hinterlegen:

Code: Alles auswählen

def main():
    # zum Testen
    length, diameter = 24, 3
    # Benutzerabfrage zum Testen auskommentieren
    # length, diameter = get_parameters()
    strauch(length, diameter)
(Zu den Namen s.u.)

Auch ist der Abfragecode ziemlich viel Copy-and-Paste-Programmierung. Du hast doch quasi zweimal eine identische Abfrage, einmal zur Länge und einmal zur Dicke. Dabei gibt es einen Mindest- und eine Höchstwert. Das kann man doch prima in eine Funktion auslagern, die das auswertet:

Code: Alles auswählen

def get_user_input(info, min_value, max_value):
    while True:
        value = int(input(info))
        if min_value <= value <= max_value:
            return value
        else:
            print("Bitte nur Werte zwischen {} und {} eingeben!".format(min_value, max_value))

def get_parameters():
    print("Herzlich willkommen bei Ihrem Strauchgenerator")
    print("-" * 79)
    print("Bitte geben Sie die Daten für Ihren Strauch an")
    print()
    # jetzt rufen wir zweimal die Abfragefunktion auf und merken uns
    # den Rückgabewert
    length = get_user_input("Länge des Stammes", 1, 40)
    diameter = get_user_input("Durchmesser des Stammes", 1, 5)
    print("")
    print("Ihr Strauch wird jetzt in einigen Sekunden geöffnet!")
    print("Viel Spass mit dem Strauch!")
    print("")
    # hier geben wir die Daten an die aufrufende Funktion zurück
    # das wäre z.B. Deine `main`-Funktion
    return length, diameter
Generell sind Deine Namen schlecht gewählt. Was sagen denn `x` und `z` aus? Ich habe oben aussagekräftige Namen gewählt: Unter `length` kann man sich sofort etwas vorstellen, genauso unter `diameter`; in diesem Kontext ist klar, dass es sich dabei um die Länge und den Durchmesser des Busches handelt. Bei `x` und `z` musst Du erst mal "nachgucken", was sich dahinter verbirgt. Entweder direkt im Code, wo die Zuweisung stattfindet, oder aber in einem Kommentar - beides macht den Code schwerer lesbar und schwerer nachvollziehbar. Merke: Gute Namen sind das A und O bei der Programmierung :-)

Die Namen sind übrigens auch bei der `strauch`-Funktion schlecht ;-) Zudem sollte ein Funktionsname immer eine Tätigkeit ausdrücken; `strauch` ist aber eher ein Objektname. Wieso nicht `paint_strauch` - wobei wir hier Deutsch und Englisch mischen, was auch nicht so dolle ist :-D Also eher `paint_bush`.

So, ich hoffe ich habe Dich jetzt nicht erschlagen mit Vorschlägen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
2011pscro
User
Beiträge: 2
Registriert: Freitag 22. Juni 2012, 09:57

darktrym hat geschrieben:Was ist die Aufgabe des einzelnen exit's am Ende?

es soll dann automatisch beenden
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

2011pscro hat geschrieben:es soll dann automatisch beenden
Das tut es doch eh, also wozu das ``exit``?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten