Zahlen als Worte schreiben

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
1220
User
Beiträge: 4
Registriert: Dienstag 8. Mai 2018, 17:09

Dienstag 8. Mai 2018, 17:13

Guten Tag liebe Freunde,
ich habe folgende Aufgabenstellung mit einem Kumpel bearbeitet und wir Laien kommen echt nicht weiter:

Die Zahlen 1, 2, 3, ... können als ein Wort geschrieben werden, also eins, zwei, drei, ... und werden als "Einwortzahlen" bezeichnet (dieses Wort ist frei erfunden).

Nicht-Einwortzahlen sind Zahlen, die nur Wortbestandteile haben, die eine Einwortzahl sind oder das Wort "und" enthalten, z.B. 13 = dreizehn = "drei" + "zehn" oder 21 = einundzwanzig = "ein" + "und" + "zwanzig".

Erstellen Sie folgende Funktionen:
"def codieren" übernimmt als Parameter eine (1) Einwortzahl (=String) und liefert als Ergbnis die Zahl als Integerwert zurück.
"def decodieren" übernimmt als Parameter eine (1) Integerzahl und liefert als Ergbnis die Zahl als Einwortzahl (=String) zurück.
"def PlusMinus" übernimmer als Parameter einen (1) String und liefter als Ergbnis einen String mit einem Einwortzahl zurück. Folgendes gilt es zu berücksichtigen:
Der Eingabestring besteht aus mindestens einem Einwortzahl.
Wenn der Eingabestring aus mehr als einem Einwortzahl besteht, sind diese durch die Wörter "plus" oder "minus" getrennt. Diese repräsentieren Addition und Subtraktion.
Der Ausgabestring besteht aus exakt einer Einwortzahl, welche den Eingabestring oder das Ergbnis der Berechnung des Eingabestrings widerspiegelt.
Es müssen nur Berechnungen berücksichtig werden, welche ausschließlich aus Einwortzahlen in der Eingabe und Ausgabe bestehen.
Umlaute müssen in Ein- und Ausgabe vermieden werden, also immer fuenf, etc. schreiben und erwarten.
Verwenden Sie die beiden Eingangs definierten Funktionen in dieser Funktion, damit der Code übersichtlich bleibt.

defcodieren und defdecodieren waren kein Hindernis, allerdings scheitern wir nach mehreren Stunden Rumprobieren an PlusMinus
Hat da jemand einen Tipp?

LG 1220 :D
LG 1220 :arrow:
m1LLo
User
Beiträge: 6
Registriert: Dienstag 8. Mai 2018, 15:51

Dienstag 8. Mai 2018, 17:22

Dann gibt uns mal bitte den Code welchen ihr bis jetzt fertig habt. Dann kann man auch besser helfen.
1220
User
Beiträge: 4
Registriert: Dienstag 8. Mai 2018, 17:09

Dienstag 8. Mai 2018, 18:29

Ich weiß, dass es bisschen umständlich ist, habt bitte Erbarmen :K
def codieren(Ezahl):
if Ezahl == "null":
Ezahl=0
elif Ezahl =="ein":
Ezahl=1
elif Ezahl =="zwei":
Ezahl=2
elif Ezahl =="drei":
Ezahl=3
elif Ezahl =="vier":
Ezahl=4
elif Ezahl =="fuenf":
Ezahl=5
elif Ezahl =="sechs":
Ezahl=6
elif Ezahl =="sieben":
Ezahl=7
elif Ezahl =="acht":
Ezahl=8
elif Ezahl =="neun":
Ezahl=9
elif Ezahl =="plus":
Ezahl ="+"
elif Ezahl =="minus":
Ezahl ="-"
elif Ezahl =="zehn":
Ezahl=10
elif Ezahl =="zwanzig":
Ezahl=20
elif Ezahl =="dreissig":
Ezahl=30
elif Ezahl =="vierzig":
Ezahl=40
elif Ezahl =="fuenfzig":
Ezahl=50
elif Ezahl =="sechzig":
Ezahl=60
elif Ezahl =="siebzig":
Ezahl=70
elif Ezahl =="achzig":
Ezahl=80
elif Ezahl =="neunzig":
Ezahl=90
elif Ezahl =="hundert":
Ezahl=100

return (Ezahl)

print codieren("hundert")



def decodieren(Izahl):
Izahl=int(Izahl)
if Izahl == 0:
Izahl="null"
elif Izahl == 1:
Izahl="eins"
elif Izahl == 2:
Izahl="zwei"
elif Izahl == 3:
Izahl="drei"
elif Izahl == 4:
Izahl="vier"
elif Izahl == 5:
Izahl="fuenf"
elif Izahl == 6:
Izahl="sechs"
elif Izahl == 7:
Izahl="sieben"
elif Izahl == 8:
Izahl="acht"
elif Izahl == 9:
Izahl="neun"
elif Izahl == "+":
Izahl ="plus"
elif Izahl == "-":
Izahl = "minus"
elif Izahl == 10:
Izahl="zehn"
elif Izahl == 20:
Izahl="zwanzig"
elif Izahl == 30:
Izahl="dreissig"
elif Izahl == 40:
Izahl="vierzig"
elif Izahl == 50:
Izahl="fuenfzig"
elif Izahl == 60:
Izahl="sechzig"
elif Izahl == 70:
Izahl="siebzig"
elif Izahl == 80:
Izahl="achzig"
elif Izahl == 90:
Izahl="neunzig"
elif Izahl == 100:
Izahl="hundert"


return Izahl

print decodieren("9")
LG 1220 :arrow:
addi
User
Beiträge: 28
Registriert: Donnerstag 29. März 2018, 22:54

Dienstag 8. Mai 2018, 18:52

Ich hätte es mit Listen probiert.

Wie folgt:

Code: Alles auswählen

def codieren(zahl):
    listezahl = [1,2,3,4]
    listebuch = ["eins","zwei", "drei", "vier"]
    #überprüft ob die eingegebene Zahl in der Liste ist
    if zahl in listezahl:
        #ermittelt die Position der Zahl
        pos = listzahl.index(zahl)
        #ruft dann die gleiche Position aus der anderen Liste auf
        print(listebuch[pos])

#optional es reicht codieren(input(">")) aus

try:
    codieren(int(input(">")))
except:
    print("Gebe bitte eine Zahl ein!")
Zuletzt geändert von addi am Dienstag 8. Mai 2018, 18:55, insgesamt 1-mal geändert.
1220
User
Beiträge: 4
Registriert: Dienstag 8. Mai 2018, 17:09

Dienstag 8. Mai 2018, 18:57

Super danke dir!
Allerdings muss ich wie oben verlangt, durch Plus und Minus trennen und genau daran verzweifle ich :|
LG 1220 :arrow:
Benutzeravatar
pixewakb
User
Beiträge: 1228
Registriert: Sonntag 24. April 2011, 19:43

Dienstag 8. Mai 2018, 21:02

Da gibt es schon eine fertige Lösung für Zahl zu Wort, bitte schaut mal hier:

https://github.com/savoirfairelinux/num2words

Ich meine, dass die Umsetzung für die Sprache Deutsch nicht ganz optimal war, d. h. da muss es variable Möglichkeiten gegeben haben und je nach Verwendungszweck (Ausschreiben der Zahlen oder Ausschreiben der Zahlen z. B. für eine Überweisung oder eine Rechnung) noch mal überarbeitet werden musste. Müsstet ihr mal schauen, ob euch das hilft.

Das war ihr da mit Plus und Minus beschreibt, würde ich wahrscheinlich mittels Liste auflösen, in die die Anweisung (drei plus vier) eingefügt wird. Dann würde ich wahrscheinlich die Liste durchlaufen und die Operationen schrittweise umsetzen (möglicherweise mit dem Setzen einer flag).
Benutzeravatar
snafu
User
Beiträge: 5836
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 9. Mai 2018, 00:12

Code: Alles auswählen

WOERTER = 'null eins zwei drei vier fuenf sechs sieben acht neun'.split()

def codieren(wort):
    return WOERTER.index(wort)

def decodieren(zahl):
    return WOERTER[zahl]

def PlusMinus(woerter):
    ergebnis = 0
    operation = 'plus'
    for wort in woerter.split():
        if wort in ('plus', 'minus'):
            operation = wort
        else:
            zahl = codieren(wort)
            if operation == 'plus':
                ergebnis += zahl
            if operation == 'minus':
                ergebnis -= zahl
    return decodieren(ergebnis)
[codebox=pycon file=Unbenannt.txt]>>> PlusMinus('fuenf plus drei minus zwei')
'sechs'[/code]
Sirius3
User
Beiträge: 10008
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 9. Mai 2018, 08:09

@snafu: danke, dass Du Hausaufgaben für andere Leute machst :twisted: .

@1220: die dritte Aufgabe baut auf Aufgabe 1 und 2 auf und erweitert diese. In Aufgabe 1 und 2 brauchst Du also nichts mit plus oder minus zu machen. `PlusMinus` besteht dann aus den Schritten, (1) Eingabestring in Wörter aufspalten, (2) Zahlwörter in Zahlen umwandeln oder +/- Operation ausführen, (3) Ergebniszahl wieder in Wort umwandeln.
1220
User
Beiträge: 4
Registriert: Dienstag 8. Mai 2018, 17:09

Mittwoch 9. Mai 2018, 10:09

@snafu schonmal danke, ein Tipp hätte natürlich gereicht, weil ich die Aufgabe gerne selber gelöst hätte haha.
Deshalb auch danke an @sirius3 ! Ich werde es jetzt trotzdem noch mal mit dem Wissen selber versuchen.
LG 1220 :arrow:
Antworten