Wie kommt mein Prorgramm zurück an den Anfang?

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
Thinline
User
Beiträge: 5
Registriert: Mittwoch 25. November 2015, 14:29

Hallo zusammen,

ich bin der Neue, seit ca. 10 Minuten hier angemeldet und hatte schon Schwierigkeiten dabei,
mein Python-Programm hier mit dem "einrücken" abzubilden...

Das habe nun schon mal geschafft... klasse ! :P
Ich habe das unten stehende Programm in mühsamer Try and Error-Manier erstellt und dafür gefühlte Wochen gebraucht.

Was macht es?

Es wird nach einer Schichtdicke zwecks Vergoldung beim Galvanisieren gefragt.
Dann soll man wählen, ob die Oberfläche, oder eine Stiftlänge bekannt ist.
Dann rechnet Python in sekundenschnelle und spuckt mit die benötige Menge an Gold in Gramm aus.

Was ich ums verrecken nicht hin bekomme, ist, dass das Programm nach fertiger Berechnung wieder zurück an den Anfang springt.
Ja ich weiß, für den Profi ist das eine total dämliche Frage, aber ich bekomme es auch mit der Suchfunktion nicht hin.

Wer hat Lust, mir auf die Sprünge zu helfen...?

Danke und Gruß

Thin

Code: Alles auswählen

#-*- coding: iso-8859-1 -*-
s = float(input ("Bitte geben Sie die Schichtdicke in ym ein: "))
print ()
a = float(input ("Für bekannte Oberfläche bitte 1 eingeben, für Stift bitte 2 eingeben: "))
print ()
if a == 1:
    of1 = float(input ("Bitte Oberfläche in mm eingeben: "))
    g1 = s*of1/1000*19.3*1.1
    g2 = s*of1/1000*19.3*1.3
    print ()
    print("{:.5f}".format(g1), "Gramm Gold per 1.000 St. werden benötigt - incl. 10%")
    print("{:.5f}".format(g2), "Gramm Gold per 1.000 St. werden benötigt - incl. 30%")
elif a == 2:
    l = float(input ("Bitte die Länge in mm eingeben: "))
    b = float(input ("Bitte die Breite in mm eingeben: "))
    of2 = l*4*b+b*b*2
    g3 = s*of2/1000*19.3*1.1
    g4 = s*of2/1000*19.3*1.3
    print ()
    print("{:.5f}".format(g3), "Gramm Gold per 1.000 St. werden benötigt - incl. 10%")
    print("{:.5f}".format(g4), "Gramm Gold per 1.000 St. werden benötigt - incl. 30%")
else:
    print ("Bitte nur 1 oder 2 engeben")
input ()
Zuletzt geändert von Anonymous am Mittwoch 25. November 2015, 15:09, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Thinline: Dafür gibt es Schleifen. Zum Beispiel einfach eine Endlosschleife mit ``while True:`` um das setzen was immer wiederholt werden soll.

Du solltest Dich als nächstes unbedingt mal mit Funktionen auseinandersetzen damit Du keinen Quelltext nahezu gleich wiederholen musst, und vernünftige Namen wären nicht schlecht. Also keine einbuchstabigen und teilweise nummerierten Namen sondern solche die auch etwas über die Bedeutung des Wertes aussagen der daran gebunden wird.
Thinline
User
Beiträge: 5
Registriert: Mittwoch 25. November 2015, 14:29

Hallo BlackJack,

vielen Dank für die schnelle Antwort.
Ich denke, man sieht dem Programm an, dass ich mal irgendwann ein bisschen mit BASIC rumgespielt habe.. :roll:

mit dem ``while True:`` werde ich mal gucken.

Gruß
Thin
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und dann vielleicht noch mit einem schicken Menü versehen? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Erster Schritt zu mehr Funktionen und weniger Wiederholung (ungetestet):

Code: Alles auswählen

GOLD_WEIGHT = 19.3


def calculate_gold(thickness, area):
    return thickness * area * GOLD_WEIGHT


def print_result(gold, pieces=1000, overheads=(0.1, 0.3)):
    for percentage in overheads:
        print(
            '{0:.5f} Gramm Gold per {1} St. werden benötigt - incl. {2:.0%}'
                .format(gold * (1 + percentage), pieces, percentage)
        )


def main():
    while True:
        thickness = float(input('Bitte geben Sie die Schichtdicke in ym ein: '))
        print()
        answer = input(
            'Für bekannte Oberfläche bitte 1 eingeben,'
            ' für Stift bitte 2 eingeben: '
        )
        print()
        if answer == '1':
            area = float(input('Bitte Oberfläche in mm eingeben: '))
            print_result(calculate_gold(thickness, area))
        elif answer == '2':
            length = float(input('Bitte die Länge in mm eingeben: '))
            width = float(input('Bitte die Breite in mm eingeben: '))
            print_result(
                calculate_gold(thickness, length * 4 * width + width**2 * 2)
            )
        else:
            print('Bitte nur 1 oder 2 engeben')


if __name__ == '__main__':
    main()
Thinline
User
Beiträge: 5
Registriert: Mittwoch 25. November 2015, 14:29

Hallo BlackJack,

Wow, danke für die Umgestaltung des Programmes und ein Lob über dein Wissen bezüglich der benötigten Konstanten (z.B. Masse von Gold).

Ich habe die beiden Programme nebeneinander gehalten um zu gucken, was dein Programm macht wenn mein Programm etwas macht und
muss sagen..... Ich verstehe nur Bahnhof :D (Ich finde mein Scrip irgendwie verständlicher :oops: , liegt aber wohl an meinem VC20-BASIC-Wissen)

Beim Berechnen des Goldgewichts über Länge und Breite verrechnet sich dein Script um Faktor 1000 und ich kann ums verrecken nicht herauslesen,
wo der Rechenfehler in der Formel steckt. :K
Ich könnte natürlich irgendwo nochmal durch 1000 teilen, dann habe ich aber immer noch nicht herausgefunden, wo der Fehler ist...

Hast du da nochmal einen kleinen Tipp für mich...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Thinline hat geschrieben: Ich verstehe nur Bahnhof :D (Ich finde mein Scrip irgendwie verständlicher :oops: , ...
BlackJacks Code ist *deutlich* "pythonischer" als Deiner - das *impliziert* sogar bessere Lesbarkeit (setzt aber natürlich voraus, dass man sich in Python auskennt bzw. sich Wissen und Erfahrung angeeignet hat). Ein imho interessanter Artikel in Sachen "Verständnis von Code" findet sich hier.

Versuche einmal, Dich im offiziellen Tutorial mit Funktionen vertraut zu machen. Damit sollte einiges leichter zu verstehen sein. Viel "Magie" ist in dem Programm aber auch nicht drin; das sollte auch ein Anfänger mit ein wenig Zeit und Ausprobieren in einer Shell nachvollziehen können! Befasse Dich einfach damit ;-)
Thinline hat geschrieben: Beim Berechnen des Goldgewichts über Länge und Breite verrechnet sich dein Script um Faktor 1000 und ich kann ums verrecken nicht herauslesen,
wo der Rechenfehler in der Formel steckt. :K
Ich könnte natürlich irgendwo nochmal durch 1000 teilen, dann habe ich aber immer noch nicht herausgefunden, wo der Fehler ist...
Schau Dir mal Deine Formeln in den Zeilen 8,9 und 17, 18 an - da teilst Du durch 1000 - das taucht in der Tat bei BlackJack nicht auf. Ergo muss es irgendwo ergänzt werden. Das kann man an verschiedenen Stellen einbauen... hängt in dem Fall stark von der Domäne ab, die ich nicht verstehe :-D (Also entweder in der ``calculate_gold``-Funktion direkt oder der Ausgabefunktion oder in einer separaten, "dekorierenden" Funktion)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Da muß man nirgends raten, wo eine 1000 fehlt, sondern nur sauber mit Einheiten rechnen:
Gold hat eine Dichte von 19,32 g/cm³.
Bei einer Fläche in mm² und einer Dicke in µm ergibt sich ein Umrechnungsfaktor von 100.000 um auf cm³ zu kommen. Da die Menge für 1000 Stück angegeben werden soll, bleibt noch ein Faktor 100 übrig.

Code: Alles auswählen

volume = area * thickness / 100000
weight = density * volume * pieces
Bleibt noch ein Faktor 10 beim einen in die eine und Faktor 100 beim anderen in die andere Richtung. Ihr könnt Euch also quasi in der Mitte treffen und das zuviel bestellte Gold mir schicken. Ich sorge für eine kostenlose Entsorgung.
Thinline
User
Beiträge: 5
Registriert: Mittwoch 25. November 2015, 14:29

Sirius3 hat geschrieben: ...das zuviel bestellte Gold mir schicken. Ich sorge für eine kostenlose Entsorgung.
Sorry, das kann ich leider nicht befürworten... Da ist mir das Hemd näher als die Jacke. :wink:
Thinline
User
Beiträge: 5
Registriert: Mittwoch 25. November 2015, 14:29

Upps, und dann auch gar nicht richtig geguckt...
Ich hatte nur bei "Stifte" gerechnet und gedacht bei OF wäre es richtig...
Oh wie peinlich... :oops:
Antworten