Ich brauche Hilfe bei mein C/AL Code?

1 Antwort

Nachdem von Dir nie irgendwelche Reaktionen kommen, wollte ich eigentlich warten, was brAIny dazu sagt. Wäre bestimmt lustig, aber jetzt fällt mir auf, dass sie die Sauklaue ja gar nicht lesen kann. Wie schade!

Okay, und weil Du die Aufgabe einfach so hin klatschst, nehme ich an, dass Du noch gar nichts hast, nicht einmal einen Plan.

Tipp 1: Im Deutschen werden Zahlen in Tausendergruppen mit Suffix ausgesprochen. Da empfiehlt sich, erst mal mit einer Gruppe (0 bis 999) anzufangen. Das lässt sich später relativ leicht auf Tausender, Millionen usw. verallgemeinern. Kniffliger wird es nur bei "neunzehnhundert" & Co. Das würde ich für den Anfang komplett ignorieren.

Tipp 2: Es gibt unglaublich viele sprachliche Ausnahmen, aber die Aufgabe lässt offen, was bei falschen Eingaben geschehen soll. Es steht Dir also frei, "einshunderteinsundzig" als 111, 42 oder Fehler auszugeben. Mach es so, dass der Code möglichst einfach bleibt.

Für eine Tausendergruppe würde ich etwa so anfangen:

char const * const *einer = { "ein", zwei", ... "neun" };
char const * const *zehner = ( "zehn", "zwanzig", ... "neunzig" };

Eine Gruppe hat dann die Form

  • [ [ einer ] "hundert" ] [ "und" ] [ einer ] [ "und" ] [ zehner ]
  • "null" | "eins" | "elf" | "zwölf"

Die eckigen Klammern bedeuten hier "optional". Beachte, dass diese Form schon viele ungültige Eingaben zulässt, aber was soll's!

Jetzt sehe ich zwei mögliche Strategien:

  1. Du kannst die Eingabe an den Schlüsselwörtern ("hundert", "und") zerlegen und die Fragmente in den Arrays einer und zehner suchen. Jeder Wert entspricht dann der Position im Array +1. Aus diesen Werten kann man dann die Zahl berechnen.
  2. Du kannst eine Funktion schreiben, die den Anfang der Eingabe mit einer Liste von Werten vergleicht und bei einem Treffer abhakt. So kannst Du die Eingabe mehr oder weniger in einem Rutsch durchlaufen.

Die meisten würden wohl den Weg 1 einschlagen, aber ich hasse es, unnötige Kopien von Substrings zu machen und dann nach Memoryleaks zu suchen. Ich jongliere da lieber mit Pointern. Also in etwa so:

int match ( char const **eingabe, char const * test )
{
    if (0==strncasecmp(*eingabe, test, strlen(test)))
    {
        *eingabe += strlen(test);
        return 1;
    }
    else
        return 0; // kein Treffer
}

Damit ist man eigentlich schon zur Hälfte fertig :-)


ralphdieter  24.03.2023, 09:06

Ich sehe gerade, das die Syntax Fälle wie "zweihundertzwölf" nicht erfasst. Dazu muss man man das Array einer bis "zwölf" weiterführen.

0
Lukas29122005 
Fragesteller
 24.03.2023, 10:07

Danke erstmal für die ganze Mühe. Aber hast du es C/AL geschrieben den Code ?

0
ralphdieter  24.03.2023, 10:41
@Lukas29122005

Siehst Du doch: Meine Codeschnipsel sind in C, so wie Du es in den Tags angegeben hast. Aber egal, es geht ja erstmal nur darum, das Verfahren zu beschreiben.

0
Lukas29122005 
Fragesteller
 24.03.2023, 10:09

Jagut aber nur eine Hälfte bringt mir wenig

0
ralphdieter  24.03.2023, 10:54
@Lukas29122005

Wenn Du eine fertige Lösung zum kopieren brauchst, bring die Aufgabe in maschinenlesbare Form und füttere ChatGPT damit. Ich habe mal angefangen und bin positiv überrascht worden:

Ich brauche eine C/AL CodeUnit, die deutsche Zahlwörter erkennt und deren Zahlenwert ausgibt. Beispiel: Eingabe="tausenddreihundertelf" ⇒ Ausgabe=1311
––––––––––––––––––
Ich verstehe, was Sie suchen. Leider ist es schwierig, eine solche CodeUnit in C/AL zu schreiben, da es keine integrierte Funktionalität zur Konvertierung von Zahlwörtern in Zahlen gibt. Sie müssten also einen Algorithmus schreiben, der jeden Teil des Zahlwortes analysiert und den entsprechenden Zahlenwert ermittelt.
Wenn Sie jedoch eine andere Programmiersprache verwenden können, gibt es viele Bibliotheken und Frameworks, die Ihnen bei dieser Aufgabe helfen können. Zum Beispiel gibt es in Python das Modul "word2number", das eine solche Konvertierung durchführen kann. Wenn Sie jedoch unbedingt C/AL verwenden müssen, könnte ich versuchen, Ihnen bei der Entwicklung eines Algorithmus zu helfen.

Soll wohl heißen: „Wer schlau ist, nimmt Python“ :-)

0