Zahl in Ziffern zerlegen und abspeichern.



  • @daniwe sagte in Zahl in Ziffern zerlegen und abspeichern.:

    @Wutz Vielen Dank, den Code habe ich gut verstanden!

    @Bushmaster @Wutz, entspannt Euch, Ihr habt mir geholfen, das Ziel ist erreicht. Also lasset Frieden herrschen đŸ€

    alles gut. hab den kerl jetzt geblockt. 🙂
    wer while schleifen hasst, von dem kann man auch sonst nichts erwarten.



  • @Wutz Da ist nichts UB.
    @Bushmaster HĂ€sslich ist es trotzdem.



  • HĂ€tte da noch eine Frage:

    Wenn bei einer For- Schleife etwas nicht definiert wird:

    Bsp von @Wutz

    for (i=0; ;i++)
    

    was steht zwischen den beiden ";"?

    Weiter:

    for(;i>-1;i--)
    

    Hier fehlt ja quasi der Startwert. Oder nutz die For-Schleife den Startwert, der bereits in der vorausgegangen Schleife definiert wurde? Normalerweise mĂŒsste die Definition des Startwertes doch mit den { } eingeschlossen sein oder?



  • In einem for-Statement

    for (init-statement; condition; expression) statement
    

    sind alle drei Teile init-statement, condition und expression optional. Fehlt condition so wird true angenommen. Eine klassische Endlosschleife ist

    for (;;)  // lies: for-ever
        ;  // ein leeres controlled statement
    

    die equivalent zu

    while (true)
        ;  // ein leeres controlled statement
    

    ist.

    Gibt es kein init-statement dann gibt es kein init-statement. Gibt es keine expression dann gibt es keine expression.

    @daniwe sagte in Zahl in Ziffern zerlegen und abspeichern.:

    Oder nutz die For-Schleife den Startwert, der bereits in der vorausgegangen Schleife definiert wurde? Normalerweise mĂŒsste die Definition des Startwertes doch mit den { } eingeschlossen sein oder?

    Du hast noch eine etwas seltsame Vorstellung was dieses for-dingsti ist. Da ist nichts spezielles. Du wĂŒrdest dich ja auch nicht fragen:

    // ...
    
    int i;
    {
        i = 42;
    }
    {
        i = 47;  // "nutzt" dieser block dasselbe i wie der vorige block ...
    }
    
    // ...
    

    ... es gibt nur ein i.


    // ps fun-time:

    for (1337; 0xf02; 1002);  // leetest for-l00p evar
    

    ist genauso eine Endlosschleife. 1337 eben. ^^



  • @Swordfish Ich hab nicht nur eine komische Vorstellung von der for-Schleife, sondern garkeine! 😄

    Ich weiß schon, warum ich Maschinenbauer bin und kein Informatiker :-P.

    Also, die Endlosschleife ist mir ein Begriff, soweit ich weiß wird diese dann mit dem "break" Befehl gestoppt.

    So wie du es geschrieben hast verstehe ich nun:

    for (frei ; frei ; frei ) ist das gleiche wie while(true)

    ODER war es so gemeint, das

    for (init-statement; frei ; expression) das gleiche ist wie while (true)?

    Wie sieht es mit den anderen FĂ€llen aus?

    1. for (frei; condition; expression)

    bei welchem wert startet die Schleife? Ich meine, es muss ja ein Anfangswert angenommen werden.

    1. for (init-statement; condition; frei)

    Wie erhöht sich das i beim nÀchsten Durchlauf, es ist ja nichts definiert?

    SORRY, vllt stehe ich auf dem Schlauch, aber es ist auch schon spÀt.



  • @Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:

    HĂ€sslich ist es trotzdem.

    naja, ist halt so auf die schnelle entstanden.
    vielleicht poste ich nachher eine version ganz ohne schleifen. denn bekommt das while-hasser-mÀnnchen einen herzinfarkt.



  • @daniwe

    for (init-statement; condition; expression) statement
    

    ist Àquivalent zu

    {
    	init-statement
    	while (condition) {
    		statement
    		expression;
    	}
    }
    

    Da muss es keine "Schleifenvariable" geben. Da muss sich nichts erhöhen. Wenn da kein Statement ist das irgendeine Variable inkrementiert dann wird auch nirgends eine Variable inkrementiert. Klarer?

    init-statement, condition und expression sind optional. UnabhĂ€ngig voneinander. Gibt es keine condition, dann wird dafĂŒr true angenommen, unabhĂ€ngig von init-statement und expression. Und

    @Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:

    Gibt es kein init-statement dann gibt es kein init-statement. Gibt es keine expression dann gibt es keine expression.

    @Wutz sagte in Zahl in Ziffern zerlegen und abspeichern.:

    @daniwe

    #include <stdio.h>
    
    int main()
    {
        int i, new = 1234;
        int array[1000];
        
        for (i = 0; /* true */; i++)  // i bekommt den wert 0 zugewiesen, die for-Schleife laeuft solange true
                                      // und das Statement i++ wird nach jedem Schleifendurchlauf ausgefuehrt.
        {
        	array[i] = new % 10;
        	if (new /= 10)
        	    continue;
        	else
        	    break;
        }
        for (; i > -1; i--)  // i hat den Wert den es eben vor Schleifeneintritt hatte. Da steht nirgends
                             // dasz sich dieser Wert bei Schleifeneintritt aendert.
                             // i-- wird nach jedem Schleifendurchlauf ausgefuehrt.
            printf("%d", array[i]);
        return 0;
    }
    


  • @Swordfish AHHH jetzt JAAAA! 😄



  • @Swordfish Super erklĂ€rt, danke.

    Gibt es eigentlich eine Möglichkeit, mit einem Funktionsaufruf, die ZiffernlÀnge einer Zahl zu bestimmen?

    Ich stelle mir sowas vor:

    int ziffer = 12345
    
    int n= tollerziffernlÀngenrechner ( ziffer) 
    

    ....Wahrscheinlich gibt es sowas nicht, gel?



  • Proof: How many digits does a number have? ⌊log10 n⌋ +1

    math.h

    floor()
    log10()

    ~> floor(log10(n)) + 1 ... aber was da fĂŒr n = 0 herauskommt?

    double num_digits = floor(log10(n)) + 1;
    num_digits = isinf(num_digits) ? 0 : num_digits;
    

    ? Ach, ich kenn mich mit diesem Mathezeugs nicht aus. Ach mist, und dann noch negative n.



  • @Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:

    Proof: How many digits does a number have? ⌊log10 n⌋ +1

    math.h

    floor()
    log10()

    ~> floor(log10(n)) + 1 ... aber was da fĂŒr n = 0 herauskommt?

    
        int n=1235;
    
        int anzahl;
    
        anzahl= log10(n) + 1;
    
    

    Funktioniert fĂŒr meine Zwecke super, mit den SpezialfĂ€llen n=0, n<0 habe ich zum GlĂŒck nichts zu tun.

    @Swordfish Vielen Dank, you made my day!



  • @Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:

    Ach mist, und dann noch negative n.

    #include <math.h>
    
    unsigned get_num_digits(int n)
    {
    	double digits = floor(log10(abs(n))) + 1;
    	return isinf(digits) ? 0 : digits;
    }
    


  • @Bushmaster sagte in Zahl in Ziffern zerlegen und abspeichern.:

    vielleicht poste ich nachher eine version ganz ohne schleifen. denn bekommt das while-hasser-mÀnnchen einen herzinfarkt.

    Nicht jeder Thread ist ein Schwanzvergleich.

    char* ultimate_expl0der(char *dst, long long number, unsigned base)
    {
    	number = number < 0 ? -number : number;
    	long long next_number = number / base;
    	char *tmp = next_number ? 1 + ultimate_expl0der(dst, next_number, base) : dst;
    	int digit = number % base;
    	*tmp = digit < 10 ? '0' + digit : 'a' + digit - 10;
    	return tmp;
    }
    


  • @daniwe sagte in Zahl in Ziffern zerlegen und abspeichern.:

    int ziffer = 12345
    
    int n= tollerziffernlÀngenrechner ( ziffer) 
    

    ....Wahrscheinlich gibt es sowas nicht, gel?

    Nennt sich Rekursion und gehört nicht in KinderhÀnde/produktiven Code.

    int f(int x)
    {
       return !!x+(x?f(x/10):0);
    }
    
    int main()
    {
       int x = 12345;
       int n = f(x?x:1);
       return 0;
    }
    

    Die nichtrekursive Variante funktioniert ab C99:

    int main()
    {
       int x = 12345;
       int n = snprintf(0,0,"%d",abs(x));
       return 0;
    }
    


  • Mir war einmal eine Person bekannt, die war Fan von Walker Texas Ranger und Chuck Norris. Leider war die Person auch gewalttĂ€tig.



  • Siehe auch Slides 17&18 hier, Funktion "digits10":
    https://de.slideshare.net/andreialexandrescu1/three-optimization-tips-for-c

    @titan99_: verstehe nicht, was du uns damit sagen willst.



  • @wob sagte in Zahl in Ziffern zerlegen und abspeichern.:

    @titan99_: verstehe nicht, was du uns damit sagen willst.

    Ist mir einfach in den Sinn gekommen, weil ich zuerst nicht dachte, dass die Person gewalttÀtig sein könnte.



  • This post is deleted!


  • @Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:

    for (i = 0; /* true */; i++)  // i bekommt den wert 0 zugewiesen, die for-Schleife laeuft solange true
                                  // und das Statement i++ wird nach jedem Schleifendurchlauf ausgefuehrt.
    {
    	array[i] = new % 10;
    	if (new /= 10)
    	    continue;
    	else
    	    break;
    }
    

    das lĂ€sst sich nochmal verkĂŒrzen, als Demo zum Verstehen des Codes aber nicht mehr so gut:

    for (i = 0; /* true */; i++)  
    {
       array[i] = new % 10;
       if (!(new /= 10))
          break;
    }
    

    und nochmal:

    for (i = 0; array[i] = new % 10, new /= 10 ; i++);
    


  • Hi Zamm',

    ich wĂŒhle den Thread nochmal auf, da ich noch ĂŒber etwas gestolpert bin, was ich so hingenommen habe, ohne es wirklich zu verstehen.

    Zur Erinnerung: Es ging sich darum eine Zahl "new" in die einzelnen Ziffern zu zerlegen.

    array[i] = new % 10;
    	if (new /= 10)
    	    continue;
    	else
    	    break;
    

    das:

    if (new /= 10)
    

    bedeutet ja eigentlich:

    if (new= new/10)
    

    in wie fern ist diese Bedingung erfĂŒllt, wenn new 1234 ist? Warum hört die If Schleife dann auf, wenn die letzte Ziffer erreich ist?

    GrĂŒĂŸe


Log in to reply