Zahl in String umwandeln (in C)



  • Hallo,

    Ich hoffe ihr könnt mir helfen. Eine meiner Maturafragen behandelt C - Programmierung. Mir fehlt nur mehr die Umwandlung folgender Zahlen in einen String:

    1.) 1234 --> "1 Tausend 234"

    2.) 125 --> "125"

    3.) 2000 --> "2 Tausend"

    Bitte schickt mir den Code an falchy98@htl-kaindorf.ac.at oder ab dj.falki@gmx.at. Natürlich könnt ihr ihn auch hier posten.

    Ich bedanke mich schon im voraus für eure Hilfe.

    mfg falki



  • Du weißt ja sicherlich, dass es hier keine Komplettlösungen gibt 🙄

    Die Funkution müsste man schon teilweise selber schreiben, indem man immer per zahl % 1000 die letzten 3 stellen holt und dann zahl / 1000 teilt. Dann klann man jeweils 3 Stellen ausgeben und dann eventuelle ein Wort wie "Tausend" oder "Millionen". Das machst du halt, bis du die ganze Zahl ausgegeben hast 🙂



  • Bitte schickt mir den Code an falchy98@htl-kaindorf.ac.at oder ab dj.falki@gmx.at. Natürlich könnt ihr ihn auch hier posten.

    wenn du so fragst, klar aber nicht um sonst... das ist ein forum und kein rotes kreutz.
    zeig was du bis jetzt fertig hast und wir korigieren das bzw. geben dir einen schub in die richtige richtung...



  • Vorschlag: du guckst, ob die Tausend überschritten ist,
    dann nimmst du die Zahl durch 1000 und modulo 1000 und schon hast du die Ziffern vor bzw. nach der Tausenderstelle. Hier eine All-in-one-Lösung...

    printf("%d%s%d\n", zahl/1000, (zahl>=1000) ? " Tausend " : "\b", zahl%1000);
    

    Ist nicht getestet, dürfte aber gehen. Das "\b" ist dazu da, dass es keine 0 ausgibt, wenn die Zahl kleiner Tausend ist.

    Schönen Abend noch 🙂



  • Mir hat das Problem einfach keine Ruhe gelassen und ich habe mal etwas gecodet, was wenigstens bis zu paar Trillionen hochzählt (falls du das benötigst ;)) und
    in einen entsprechenden String umwandelt. Mehr als Trillionen sind auch nicht drin, da dann der Wertebereich eines unsinged long long int überschritten wird.
    Trotzdem erscheint mir die Lösung als nicht sehr elegant, hat da jemand eine andere Ansatzweise/Verbesserungsmöglichkeiten parat?!

    #include <stdio.h>
    #include <string.h>
    
    /* die Tausenderstellen in Worten; da oftmals der Plural nicht durch bloßes Anhängen */
    /* von -en zu bilden ist, initialisieren wir ein extra char*-Array */
    char *singular[]={"", "Tausend", "Million", "Milliarde", "Billion", "Billiarde", "Trillion"};
    char *plural[]={"", "Tausend", "Millionen", "Milliarden", "Billionen", "Billiarden", "Trillionen"};
    
    int main(void){
        unsigned long long int zahl, hilfzahl, teiler=1;
        int zaehler=0;
        char stringzahl[1000];
        strcpy(stringzahl, "");
    
        printf("Zahl eingeben: ");
        scanf("%lld", &zahl);
    
        hilfzahl=zahl;
    
        /* zunächst einmal die Tausenderstellen zählen */
        while(hilfzahl>=1000 && zaehler<=7){
            ++zaehler;
            teiler*=1000;
            hilfzahl/=1000;
        }
    
        /* nun folgt die Speicherung in dem String, wobei geloopt wird, bis der Teiler kleiner 1 */
        do{
            /* wenn die nächste Tausenderstelle keine 0 ist */
            if(zahl/teiler>0)
                /* speichere in stringzahl...               */
                /* Formatargumente: stringzahl ist der bisherige String */
                /* zahl/teiler ist die nächste Tausenderstelle      */
                /* plural wird gewählt, wenn die Tausenderstelle > 1 &&  */
                /* wenn die Einerstelle noch nicht erreicht ist     */
                sprintf(stringzahl, "%s%lld %s  ", stringzahl,
                zahl/teiler, (zahl/teiler>1 && teiler/1000>1) ? plural[zaehler] : singular[zaehler]);
            /* eine Tausenderstelle weniger */
            --zaehler;
            /* zahl erhält die Restzahl und teiler wird um eine Tausenderstelle verringert */
            zahl%=teiler;
            teiler/=1000;
        }while(teiler>=1);
    
        /* jetzt können wir den String auch mnal ausgeben */
        printf("%s\n", stringzahl);
    
        return 0;
    }
    

Anmelden zum Antworten