tScheme Zahl in Wort konvertieren

daZza92

Neuling
Thread Starter
Mitglied seit
08.11.2011
Beiträge
3
Moin,

haben in der Uni mit tScheme angefangen und müssen nun eine Aufgabe lösen... Irgendwie kriege ich es aber nicht nicht.
Das Programm soll z.B. "1" in "eins" übersetzten. Das ganze muss für alle Zahlen bis 10 ^9 funktionieren.

Mein Ansatz wäre ein Array oder eine Liste zu erstellen (kann Scheme sowas? :d) und dort dann die Zahlen neu zu definieren. Nur das kanns ja eigentlich nicht sein, weil ich ja nicht eine Milliarde Zahlen per Hand neu definieren kann, dann bin ich ja nächstes Jahr noch nicht fertig :d

Und am Ende würde ich dann versuchen die Eingabe irgendwie mit der Liste abzugleichen und dann die einzelnen Komponenten zu übersetzen, also das dann zb 1111 zu EINTAUSEND EINHUNDERT ELF wird, also im Grunde 3 Definitionen aus der Liste aneinander geganden werden.

Vielleicht kann mir ja jemand helfen, oder mir zumindest einen Ansatz geben der funktioniert :)

Gruß
daZza
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Der letzte Ansatz ist der richtige. Du brauchst eine Liste mit den Zahlen von 1 bis 9. Daraus kannst du bereits einiges zusammensetzen.

FÜNFtausenVIERhundertDREIundVIERzig

Es gibt noch ein paar Außnahmen. 0, 11, 12, 2X, 6X, 7X. Das dürften eigentlich alle Außnahmen gewesen sein.
 
Zuletzt bearbeitet:
Hi daZza92,

kannst du mir die Lösung sagen? Bei mir klappt das irgendwie nicht :/
 
Ich hab die leider selber nicht... Mein Ansatz ist ja scheinbar richtig, nur kriege ich es nicht gecoded. Ich schätze, dass es auch ganz gut wäre rekursiv zu arbeiten, nur ich stehe wirklich auf dem Schlauch was einen Coding Ansatz angeht.

Ich weiß nicht so recht wie ich rausfinde mit welcher Zahl ich es zu tun habe... Man muss denk ich mal die Zahl erstmal in einen String umwandeln (tScheme hat dich Datentypen wiie Integer und String oder?) Dann müsste man m.M.n. erstmal rausfinden, aus wie vielen Zahlen die Zahl besteht (gibt es sowas wie eine Methode .lenght()?). Bei 12345 wären das dann z.B. 5. Man müsste für alle Fälle definiert habe, wie der "Start" der Zahl in Wort Umwandlung dann von statten geht, bzw. wie viele Stellen der Zahl ich mir im ersten Schritt angucke und welche "Endung" hinter die Zahl kommt (hundert, tausend, ...). Bei 5 stelligen Zahlen müsste man sich dann ja die ersten beiden angucken und daraus das erste Teilwort machen, "zwölf". 5 stellig bedeutet auch, dass die Endung tausend dran muss, also "zwölftausend". Nun müsste man es irgendwie hinkriegen den String um die ersten beiden Ziffern zu kürzen bzw. den Eingabestring "12345" durch den Substring "345" zu überschreiben. Dann kann man wieder von vorne anfangen und setzt sich so das Wort nach und nach zusammen.

In Java würde ich das glaube ich recht schnell hinkriegen. Nur tScheme macht mir echt zu schaffen... Zum einen weil ich kaum weiß was es überhaupt kann und zum anderen, weil man die ganzen Sachen so scheiße eingeben müss (Präfixnotation oder so).

Falls also jemand nen Code dafür hat würde ich mir den echt gerne mal anschauen um den zu verstehen. Für den Anfang würde mir vielleicht auch ein erstes Ansatz in tScheme reichen. Wenn dann der Groschen fällt, kriege ich den Rest auch alleine hin.

Edit: Ist es denn mit Listen in tScheme möglich, dass man darin bestimmte Elemente als andere definiert? Und wenn ja wie? Wenn nicht, welche Alternative gibt es dann? Ich muss ja z.B. machen 1 --> eins
 
Zuletzt bearbeitet:
Ich habs mal kurz in C# gemacht.
Allerdings iterativ, ich denke dass kann man noch sehr viel verbessern durch Rekursion.

Zuerst die Zahl in 3er-Blöcke aufteilen.
Dann die 3er-Blöcke in Worte auflösen.
Dann die Präfixe anhängen (tausend millionen milliarden).

Bsp:
12346
-> 12 / 346
-> Zwölf / DREIhundertVIERundSechzig
-> Zwölf TAUSEND / dreihundertvierundsechzig

dann alles zusammenfügen -> zwölftausend dreihundertvierundsechzig -> ausgabe

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program // Eingabe einlesen, ausgabe, neue Eingabe einlesen
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Zahl eingeben:");
            
            string eingabe = Console.ReadLine();
            do
            {
                zahl a = new zahl();
                string b = a.z(eingabe);
                Console.WriteLine(b+"\n");

                eingabe = Console.ReadLine();
            } while (!string.IsNullOrEmpty(eingabe));
        }
    }
    
    
    class zahl // hier wird umgewandelt
    {
        public static string[] zahlen; // Alle Namen für die Zahlen (1,2...11,12,16,17)
        public static string[] zehner; // Alle Namen für Zehner-Stellen (10,20,30...90)
        public static string[] potenzen; // 10^3, 10^6, 10^9.....
        public static string eingabe;
        public static string ausgabe;
        public static string ze; // Zehner + Einer Stelle in Worten -> 256 -> sechsundfünfzig
        public static string h; // hunderterstelle in Worten -> 256 -> zweihundert

        public zahl() // erst mal alles zurücksetzen
        {
            zahlen = new string[19];
            zehner = new string[10];
            potenzen = new string[10];
            eingabe = "";
            ausgabe = "";
            ze = "";
            h = "";
        }

        public string z(string zahl)
        {
            zahlen[0] = "ein";
            zahlen[1] = "eins";
            zahlen[2] = "zwei";
            zahlen[3] = "drei";
            zahlen[4] = "vier";
            zahlen[5] = "fünf";
            zahlen[6] = "sechs";
            zahlen[7] = "sieben";
            zahlen[8] = "acht";
            zahlen[9] = "neun";
            zahlen[11] = "elf"; // notwendig, da sich dies nicht aus den Zahlen zusammensetzen lässt.
            zahlen[12] = "zwölf";
            zahlen[16] = "sechzehn";
            zahlen[17] = "siebzehn";

            zehner[0] = "zig"; // standard: zahl + zig -> vierzig, fünfzig usw....
            zehner[1] = "zehn"; // lässt sich nicht aus zahl+zig zusammensetzen
            zehner[2] = "zwanzig"; // "zweizig" gibt es halt nicht ;)
            zehner[3] = "dreißig"; // .....
            zehner[6] = "sechzig";
            zehner[7] = "siebzig";

            potenzen[0] = "hundert"; // zahl + hundert für hunderterstelle 
            potenzen[1] = "tausend"; // potenzen: 10^3,10^6....
            potenzen[2] = "millionen";
            potenzen[3] = "milliarden";
            potenzen[4] = "billionen";
            potenzen[5] = "billiarden";
            potenzen[5] = "trillionen";
            potenzen[5] = "trilliarden";
            potenzen[5] = "quadrillionen";
            potenzen[5] = "quadrilliarden";

            
            eingabe = zahl;

            float temp = eingabe.Length / 3; // in wieviele 3er Blöcke muss die eingabe zerlegt werden ?
            int getrenntlength = Convert.ToInt32(temp) + 1; // 123456 -> 2 * 3er blöcke
            char[][] getrennt = new char[(getrenntlength)][]; // hier werden 3er-Blöcke gespeichert
            string[] getr = new string[getrenntlength]; // hier jeder 3er Block in Text umgewandelt

            for (int i = 0; i < getrenntlength; i++) // eingabe in 3er Blöcke trennen
            {
                getrennt[i] = new char[3];

                if ((eingabe.Length - 1) - i * 3 >= 0)
                {
                    getrennt[i][0] = eingabe[(eingabe.Length - 1) - i * 3];
                }
                else
                {
                    getrennt[i][0] = new char();
                }
                if ((eingabe.Length - 1) - i * 3 - 1 >= 0)
                {
                    getrennt[i][1] = eingabe[(eingabe.Length - 1) - i * 3 - 1];
                }
                else
                {
                    getrennt[i][1] = new char();
                }
                if ((eingabe.Length - 1) - i * 3 - 2 >= 0)
                {
                    getrennt[i][2] = eingabe[(eingabe.Length - 1) - i * 3 - 2];
                }
                else
                {
                    getrennt[i][2] = new char();
                }
            }

            int j = 0; // Variable für Potenzen: wie vielter 3er Block wird gerade bearbeitet ? 1. -> 10^´3, 2.->10^6 .....
            foreach (char[] chararr in getrennt)
            {
                h = ""; // hunderter stelle in worten
                ze = ""; // zehner + einer stelle in worten

                if (!char.IsNumber(chararr[0])) // wenn es einer stelle nicht gibt ist eigentlich was schief gelaufen beim zerlegen :D
                {
                    continue;
                }

                if (char.IsNumber(chararr[2])) // wenn hunderterstelle existiert, wandle diese in worte um
                {
                    //int hundert = Convert.ToInt32(chararr[2]);

                    int hundert = Int32.Parse(chararr[2].ToString()); // zahl ermitteln auf 100er stelle

                    if(hundert != 0) // wenn nich 0, z.B. 10.050 -> hier wäre beim 1. Block (050) 100er stelle = 0
                    {                        
                        if (hundert == 1) // EIN hundert , nicht EINS hundert
                        {
                            h = zahlen[0];
                        }
                        else
                        {
                            h = zahlen[hundert]; // zahl
                        }
                        h = h + potenzen[0]; // "hundert" an Zahl anhängen -> zwei,drei... HUNDERT.....
                    } else {
                        h = ""; // nullhundert sagt eben niemand 
                    }
                }

                int ein = Int32.Parse(chararr[0].ToString()); // einerstelle

                if (char.IsNumber(chararr[1])) // wenn 10er stelle im Block existiert -> 1024 -> hier gibt es in Block 2 (1 tausend) keine 10er stelle, nur einer.
                {
                    int zehn = Int32.Parse(chararr[1].ToString());                    

                    if (ein == 0 && zehn == 0) // 100,200,300...900 -> nur einhundert, nicht: einhundert null und nullzig
                    {
                        ze = "";
                    }
                    else
                    {
                        if (ein == 0) // 110,120,230,450.... vierhundert fünfzig, nicht: vierhundert null und fünfzig
                        {
                            if (zehn == 1)
                            {
                                ze = zehner[1]; // 10
                            } else if(zehn == 2) {
                                ze = zehner[2]; // 20
                            }
                            else if (zehn == 6)
                            {
                                ze = zehner[6]; // 60
                            }
                            else if (zehn == 7)
                            {
                                ze = zehner[8]; // 80
                            }
                            else
                            {
                                ze = zahlen[zehn] + zehner[0]; // 30,40,50,70,90
                            }
                        } else if(zehn == 0) 
                        {
                            ze = zahlen[ein]; // 105,106,107.... einhundert fünf, nicht einhundert fünf und nullzig
                        }
                        else if (zehn == 1) // 10..19
                        {
                            if (ein == 1)
                            {
                                ze = zahlen[11];
                            }
                            else if (ein == 2)
                            {
                                ze = zahlen[12];
                            }
                            else if (ein == 6)
                            {
                                ze = zahlen[16];
                            }
                            else if (ein == 7)
                            {
                                ze = zahlen[17];
                            }
                            else
                            {
                                ze = zahlen[ein] + zehner[1];
                            }
                        }
                        else if (zehn == 2) // 20..29
                        {
                            if (ein == 1)
                            {
                                ze = zahlen[0] + "und" + zehner[2];
                            }
                            else
                            {
                                ze = zahlen[ein] + "und" + zehner[2];
                            }
                        }
                        else if (zehn == 3) // 30..39
                        {
                            if (ein == 1)
                            {
                                ze = zahlen[0] + "und" + zehner[3];
                            }
                            else
                            {
                                ze = zahlen[ein] + "und" + zehner[3];
                            }
                        }
                        else if (zehn == 6) // 60..69
                        {
                            if (ein == 1)
                            {
                                ze = zahlen[0] + "und" + zehner[6];
                            }
                            else
                            {
                                ze = zahlen[ein] + "und" + zehner[6];
                            }
                        }
                        else if (zehn == 7) // 70..79
                        {
                            if (ein == 1)
                            {
                                ze = zahlen[0] + "und" + zehner[7];
                            }
                            else
                            {
                                ze = zahlen[ein] + "und" + zehner[7];
                            }
                        }
                        else // alle Zehner-Stellen, die sich aus Zahl + Zehnername darstellen lassen
                        {
                            if (ein == 1)
                            {
                                ze = zahlen[0] + "und" + zahlen[zehn] + zehner[0];
                                //     EIN und fünfzig, nicht EINS und fünfzig
                            }
                            else
                            {
                                ze = zahlen[ein] + "und" + zahlen[zehn] + zehner[0];
                                //      1..9        und    4,5,8,9           zig
                            }
                        }
                    }                    
                } // wenn 10er stelle nicht existiert, nur einerstelle auswerten
                else
                {
                    if (ein != 0)
                    {
                        ze = zahlen[ein]; // 1..9
                    } else if(j==0) {
                        ze = "Null"; // wenn j=0 -> erster Block und hier 10er stelle nicht existiert dann wurde nur 0 eingegeben -> Null als ausgabe
                    }
                }

                if (j > 0) // 10^3, 10^6, 10^3 .... anfügen
                {
                    getr[j] = h + "-" + ze + " " + potenzen[j];
                }
                else
                {
                    getr[j] = h + "-" + " " + ze; // wenn erster Block nichts anfügen
                }
                j++;
            }

            foreach (string g in getr) // Blöcke zusammenfügen
            {
                ausgabe = g +"\n"+ ausgabe;
            }

            return ausgabe; // ausgeben
        }
    }
}
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh