Seite 1 von 2

Script neustarten

Verfasst: Sonntag 13. Februar 2005, 12:21
von Us0R
Hallo
ich hab gestern angefangen mit Phyton zu programmieren und ich hab gleich ein Problem :-( also hier der Code:

Code: Alles auswählen

# Taschenrechner von Us0R
# -*- coding: cp1252 -*-
print "Whählen sie aus :"
def wahl():
    print '1. = " + ", 2. = " - ", 3. = " * ", 4. = " : "'
wahl()
d = input()
if(d == 1):
    print "Geben sie die erste Zahl ein"
    a = input()

    print "Geben sie die zweite Zahl ein"
    b = input()

    print "Das ergebnis ist :"
    print a + b
    
if(d == 2):
    print "Geben sie die erste Zahl ein"
    a = input()

    print "Geben sie die zweite Zahl ein"
    b = input()

    print "Das ergebnis ist :"
    print a - b
    
if(d == 3):
    print "Geben sie die erste Zahl ein"
    a = input()

    print "Geben sie die zweite Zahl ein"
    b = input()

    print "Das ergebnis ist :"
    print a * b
    
if(d == 4):
    print "Geben sie die erste Zahl ein"
    a = input()

    print "Geben sie die zweite Zahl ein"
    b = input()

    print "Das ergebnis ist :"
    print a / b

print "Drücken sie Irgendeine zum beenden"
c = input()
also zum Problem kann ich am ende denn Script neu starten wenn der Benutzer das will also ungefehr:
Wollen sie das Program beenden?(Y/N)

Verfasst: Sonntag 13. Februar 2005, 12:51
von Dookie
Hi Us0R,

du kannst das ganze in eine Schleife packen:

Code: Alles auswählen

# Taschenrechner von Us0R
# -*- coding: cp1252 -*- 

def wahl():
    print '1. = " + ", 2. = " - ", 3. = " * ", 4. = " : "'

while True:
    print "Whählen sie aus :"
    wahl()
    d = input()
    if(d == 1):
        print "Geben sie die erste Zahl ein"
        a = input()
        ...

    print "Wollen sie das Program beenden?(Y/N)"
    a = input()
    if a.upper() == "Y":
        break
Gruß

Dookie

Hmmm...

Verfasst: Sonntag 13. Februar 2005, 13:00
von Us0R
Das geht aber nicht der schreibt ein Fehler kA was der bedeutet ^^
*** 'break' outside loop

Verfasst: Sonntag 13. Februar 2005, 13:03
von XT@ngel
Hi,
Das war auch nur ein Beispiel, den ich glaub kaum das ... gültiger code ist ;)

Code: Alles auswählen

print "Geben sie die erste Zahl ein"
        a = input()
        ... 
MfG
Andreas

Verfasst: Sonntag 13. Februar 2005, 13:08
von Us0R

Code: Alles auswählen

print "Wollen sie das Program beenden?(Y/N)"
    a = input()
    if a.upper() == "Y":
        break
Das meinte ich aber jetzt hab ichs kapiert ich hab das while fergessen

Verfasst: Sonntag 13. Februar 2005, 18:29
von Leonidas
Meine Schnelle, qnd (Quick and Dirty) Lösung:

Code: Alles auswählen

# Taschenrechner von Us0R
# -*- coding: cp1252 -*-

def wahl():
    print '1. = " + ", 2. = " - ", 3. = " * ", 4. = " : "'

while True:
    print "Wählen sie aus :"
    wahl()
    d = int(raw_input())
    print "Geben sie die erste Zahl ein"
    a = int(raw_input())
    print "Geben sie die zweite Zahl ein"
    b = int(raw_input())
    if d == 1:
        print "Das ergebnis ist :"
        print a + b

    print "Wollen sie das Program beenden?(Y/N)"
    a = raw_input()
    if a.upper() == "Y":
        break
Willkommen Us0r im Forum! Netter InuYasha Avatar :)

Verfasst: Sonntag 13. Februar 2005, 18:38
von mawe
Hi Leonidas!

Kann man sich das int(raw_input()) nicht sparen, wenn man input() verwendet? Nur so ne Idee :wink:

Gruß, mawe

Verfasst: Sonntag 13. Februar 2005, 19:41
von Leonidas
Hast recht, aber für "Wollen Sie ... verlassen..." sollte man raw_input() nehmen.

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 10:37
von Hans888
Mit Python3 sollte das heute so aussehen oder?

Code: Alles auswählen

# Taschenrechner von Us0R
# -*- coding: cp1252 -*-
print ("Wählen sie aus :")
def wahl():
    print ('1 = "Adition", 2 = "Subtraktion", 3 = "Multiplikation", 4 = "Division"')

while True:
    print("Wählen Sie aus: ")
    wahl()
    d = int(input("Ihre Wahl:"))
    a = int(input("Geben sie die erste Zahl ein: "))
    b = int(input("Geben sie die zweite Zahl ein: "))
    if(d == 1):
        print ("Das Ergebnis ist: ")
        print (a + b)
    if(d == 2):
        print ("Das Ergebnis ist: ")
        print (a - b)
    if(d == 3):
        print ("Das Ergebnis ist: ")
        print (a * b)
    if(d == 4):
        print ("Das Ergebnis ist: ")
        print (a / b)

    c= input("Wollen Sie das Programm beenden? (Y/N): ")
    if c.upper() == "Y":
        break

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 11:19
von Sirius3
Dateien sollten immer mit utf8 codiert sein. Ausführbaren Code und Funktionsdefinitionen sollte man nicht mischen. Das "Wählen sie aus :" wird doppelt ausgegeben, so dass das erste print eh weg sollte.
Die Funktion `wahl` wählt gar nichts, sondern gibt nur die Auswahl aus. Funktionsnamen müssen präzise sein.
Funktionen sollten nicht wie Funktionen geschrieben sein, die Klammern können weg.
Wenn sich verschiedene if-Blöcke gegenseitig ausschließen, benutzt man am besten elif.
Warum sind alle Ausgaben in deutsch, das Programm wird aber mit "Y" beendet?

Jetzt könnte man das Programm noch um Eingabeverifizierung erweitern.

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 11:39
von Hans888
Sirius3 hat geschrieben: Sonntag 30. Juni 2024, 11:19 Dateien sollten immer mit utf8 codiert sein. Ausführbaren Code und Funktionsdefinitionen sollte man nicht mischen. Das "Wählen sie aus :" wird doppelt ausgegeben, so dass das erste print eh weg sollte.
Die Funktion `wahl` wählt gar nichts, sondern gibt nur die Auswahl aus. Funktionsnamen müssen präzise sein.
Funktionen sollten nicht wie Funktionen geschrieben sein, die Klammern können weg.
Wenn sich verschiedene if-Blöcke gegenseitig ausschließen, benutzt man am besten elif.
Warum sind alle Ausgaben in deutsch, das Programm wird aber mit "Y" beendet?

Jetzt könnte man das Programm noch um Eingabeverifizierung erweitern.
Danke für die schnelle Rückantwort ich bin da kompletter Neuling und ich habe gedacht ich versuche mal das oben stehende alte in den Thread auf Python 3 umzustelln und funktionsfähig zu machen.
utf8 ist bei mir eingestellt ich habe da mit den Haschtack oben gar nicht so genau angeschaut ups^^
das erste print("Wählen SIe aus :") habe ich entfernt danke.
Das mit der Funktion Wahl wurde vom alten übernommen, danke für den Hinweis, mit der Funktion, man bruacht hier gar keine Funktion :)
Das am Schluss habe ich jetzt auch auf Deutsch J/N umgestellt, so dass es komplett in Deutsch ist.

Was ist mit einer Eingabevertifizierung gemeint?

Code: Alles auswählen

while True:
    print("Der Taschenrechner")
    print(" ")
    print("Wählen Sie aus: ")
    print ('1 = "Addition", 2 = "Subtraktion", 3 = "Multiplikation", 4 = "Division"')
    d = int(input("Ihre Wahl: "))
    a = int(input("Geben sie die erste Zahl ein: "))
    b = int(input("Geben sie die zweite Zahl ein: "))
    if(d == 1):
        print ("Das Ergebnis ist: ")
        print (a + b)
    elif(d == 2):
        print ("Das Ergebnis ist: ")
        print (a - b)
    elif(d == 3):
        print ("Das Ergebnis ist: ")
        print (a * b)
    elif(d == 4):
        print ("Das Ergebnis ist: ")
        print (a / b)

    c= input("Wollen Sie das Programm beenden? (J/N): ")
    print("")
    if c.upper() == "J":
        break


Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 12:24
von Sirius3
Bei der ersten Eingabe ist ja nur 1,2,3 oder 4 erlaubt, bei den zwei Zahlen nur Zahlen erlaubt. Wenn der Nutzer etwas anderes eingibt, dann passieren Fehler, die man abfangen sollte, oder es passiert gar nichts, was auf keinen Fall sein sollte.

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 12:24
von snafu
Hier ein etwas robusterer Ansatz, der auch Kommazahlen erlaubt, allerdings in dieser Version in englischer/internationaler Schreibweise:

Code: Alles auswählen

#!/usr/bin/env python3
from operator import add, mul, sub, truediv

OPERATIONEN = {
    "Addition": add,
    "Subtraktion": sub,
    "Multiplikation": mul,
    "Division": truediv
}

def erfrage_wert(abfrage, eingabetyp):
    while True:
        try:
            return eingabetyp(input(abfrage))
        except ValueError:
            print("FEHLER: Ungültige Eingabe")

def erfrage_wahl(menüpunkte):
    for nr, name in enumerate(menüpunkte, 1):
        print(f"({nr})", name)
    while True:
        index = erfrage_wert("Ihre Auswahl: ", int) - 1
        if not 0 <= index < len(menüpunkte):
            print("FEHLER: Menüpunkt nicht vorhanden")
        else:
            return index, list(menüpunkte)[index]

def erfrage_zahlen():
    a = erfrage_wert("Geben sie die erste Zahl ein: ", float)
    b = erfrage_wert("Geben sie die zweite Zahl ein: ", float)
    return a, b

def berechne(a, b, operation):
    ergebnis = operation(a, b)
    ganzzahl = int(ergebnis)
    if ergebnis == ganzzahl:
        return ganzzahl
    return ergebnis

def main():
    while True:
        index, name = erfrage_wahl(OPERATIONEN)
        print("***", name, "***")
        a, b = erfrage_zahlen()
        operation = list(OPERATIONEN.values())[index]
        ergebnis = berechne(a, b, operation)
        print("Das Ergebnis ist:", ergebnis)
        if input("Wollen Sie das Programm beenden (j/n)? ").lower() == "j":
            break

if __name__ == "__main__":
    try:
        main()
    except (KeyboardInterrupt, EOFError):
        pass

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 12:31
von snafu
Ich habe natürlich bewusst einen Fehler eingebaut, um zu zeigen, was passiert, wenn man hier float anstatt Decimal benutzt... *räuspert-sich* *keucht* *erstickt*

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 13:22
von snafu
Nun versteht er auch deutsche Kommazahlen:

Code: Alles auswählen

#!/usr/bin/env python3
from decimal import Decimal
from locale import delocalize, LC_NUMERIC, localize, setlocale
from operator import add, mul, sub, truediv

OPERATIONEN = {
    "Addition": add,
    "Subtraktion": sub,
    "Multiplikation": mul,
    "Division": truediv
}

def erfrage_wert(abfrage, eingabetyp):
    while True:
        try:
            return eingabetyp(input(abfrage))
        except ValueError:
            print("FEHLER: Ungültige Eingabe")

def erfrage_wahl(menüpunkte):
    for nr, name in enumerate(menüpunkte, 1):
        print(f"({nr})", name)
    while True:
        index = erfrage_wert("Ihre Auswahl: ", int) - 1
        if not 0 <= index < len(menüpunkte):
            print("FEHLER: Menüpunkt nicht vorhanden")
        else:
            return index, list(menüpunkte)[index]

def kommazahl(string):
    try:
        return Decimal(string)
    except InvalidOperation:
        return Decimal(delocalize(string))

def erfrage_zahlen():
    a = erfrage_wert("Geben sie die erste Zahl ein: ", kommazahl)
    b = erfrage_wert("Geben sie die zweite Zahl ein: ", kommazahl)
    return a, b

def berechne(a, b, operation):
    ergebnis = operation(a, b)
    ganzzahl = int(ergebnis)
    if ergebnis == ganzzahl:
        return ganzzahl
    return ergebnis

def main():
    setlocale(LC_NUMERIC, "")
    while True:
        index, name = erfrage_wahl(OPERATIONEN)
        print()
        print("***", name, "***")
        a, b = erfrage_zahlen()
        operation = list(OPERATIONEN.values())[index]
        ergebnis = str(berechne(a, b, operation))
        print("Das Ergebnis ist:", localize(ergebnis))
        print()
        if input("Wollen Sie das Programm beenden (j/n)? ").lower() == "j":
            break

if __name__ == "__main__":
    try:
        main()
    except (KeyboardInterrupt, EOFError):
        pass
Die Ergebnisse sind immer in der deutschen Schreibweise (sofern eine deutsche Systemsprache eingestellt wurde). Die Eingaben sind standardisiert oder deutsch möglich. Dazu habe ich mich entschieden, weil das Handling von deutschen Eingaben im localize-Modul komisch ist. So wird 1,0 als 10 interpretiert. Vermutlich gibt es da bessere externe Lösungen (z. b. babel), aber ich wollte es jetzt mal dabei belassen.

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 13:24
von Hans888
@Sanfu
Der Code ist für mich, Stand jetzt noch zu komplex, da zu viele Sachen enthalten sind was ich noch gar nicht kenne :( Bin blutiger Anfänger.

Am Schluss beim Programm Beenden, wenn man irgendwas eingibt beginnt das Programm von vorne, sollte es da nicht auch heißen ungültige Eingabe?

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 13:29
von snafu
Hans888 hat geschrieben: Sonntag 30. Juni 2024, 13:24 @Sanfu
Der Code ist für mich, Stand jetzt noch zu komplex, da zu viele Sachen enthalten sind was ich noch gar nicht kenne :( Bin blutiger Anfänger.
Dachte ich mir schon und wollte nur zeigen, wohin die Reise gehen könnte. Vielleicht kannst du dir jetzt oder in ein paar Wochen ja doch etwas abkupfern. ;)
Hans888 hat geschrieben: Sonntag 30. Juni 2024, 13:24 Am Schluss beim Programm Beenden, wenn man irgendwas eingibt beginnt das Programm von vorne, sollte es da nicht auch heißen ungültige Eingabe?
Könnte man natürlich einbauen. Wobei oft auch keine oder eine ungültige Eingabe als Standardwert interpretiert wird. An der Stelle wäre das Standardverhalten das Springen ins Menü. Ist aber nur meine Sichtweise. Zeig mir doch mal, wie man so eine Prüfung an der Stelle einbaut. :)

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 14:26
von Sirius3
Um mehr Sicherheit zu bekommen, testet man sein Programm.
Teste mal die Eingaben "A", "B", "J".

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 14:36
von snafu
Nochmal überarbeitet:

Code: Alles auswählen

#!/usr/bin/env python3
from decimal import Decimal, InvalidOperation
from operator import add, mul, sub, truediv

OPERATIONEN = {
    "Addition": add,
    "Subtraktion": sub,
    "Multiplikation": mul,
    "Division": truediv
}

EINGABEFEHLER = "FEHLER: Ungültige Eingabe"

def zeige_überschrift(text):
    print(f"\n{text.upper()}\n{'=' * len(text)}")

def erfrage_wert(abfrage, eingabetyp):
    while True:
        try:
            return eingabetyp(input(abfrage))
        except ValueError:
            print(EINGABEFEHLER)

def erfrage_wahl(menüpunkte):
    for nr, name in enumerate(menüpunkte, 1):
        print(f"({nr})", name)
    while True:
        index = erfrage_wert("Ihre Auswahl: ", int) - 1
        if not 0 <= index < len(menüpunkte):
            print("FEHLER: Menüpunkt nicht vorhanden")
        else:
            return index, list(menüpunkte)[index]

def kommazahl(string):
    try:
        return Decimal(string.replace(",", "."))
    except InvalidOperation:
        raise ValueError(string) from None

def erfrage_zahlen():
    a = erfrage_wert("Geben Sie die erste Zahl ein: ", kommazahl)
    b = erfrage_wert("Geben Sie die zweite Zahl ein: ", kommazahl)
    return a, b

def berechne(a, b, operation):
    ergebnis = operation(a, b)
    ganzzahl = int(ergebnis)
    if ergebnis == ganzzahl:
        return ganzzahl
    return ergebnis

def erfrage_ende(ja="j", nein="n"):
    abfrage = f"Wollen Sie das Programm beenden ({ja}/{nein})? "
    while (ende := erfrage_wert(abfrage, str.lower)) not in (ja, nein):
        print(EINGABEFEHLER)
    return ende == ja

def main():
    while True:
        zeige_überschrift("Hauptmenü")
        index, name = erfrage_wahl(OPERATIONEN)
        zeige_überschrift(name)
        a, b = erfrage_zahlen()
        operation = list(OPERATIONEN.values())[index]
        ergebnis = berechne(a, b, operation)
        print("Das Ergebnis ist:", str(ergebnis).replace(".", ","))
        if erfrage_ende():
            break

if __name__ == "__main__":
    try:
        main()
    except (KeyboardInterrupt, EOFError):
        pass
Die Internationalisierung von Zahlen finde ich - zumindest in der Standardbibliothek - etwas lächerlich. Daher habe ich ein stumpfes replace() eingebaut.

Re: Script neustarten

Verfasst: Sonntag 30. Juni 2024, 15:33
von Hans888
@Sirius
A, B klappen aber J funktioniert nicht.
Ok ich schau mal weiter