Zahl in Ziffern zerlegen und abspeichern.
-
@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
-Statementfor (init-statement; condition; expression) statement
sind alle drei Teile init-statement, condition und expression optional. Fehlt condition so wird
true
angenommen. Eine klassische Endlosschleife istfor (;;) // 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?
- for (frei; condition; expression)
bei welchem wert startet die Schleife? Ich meine, es muss ja ein Anfangswert angenommen werden.
- 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.
-
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.:
#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
~>
floor(log10(n)) + 1
... aber was da fürn = 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
~>
floor(log10(n)) + 1
... aber was da fürn = 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; }
-
Dieser Beitrag wurde gelöscht!
-
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.
-
Dieser Beitrag wurde gelöscht!
-
Dieser Beitrag wurde gelöscht!
-
@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
-
@daniwe Irgendwann gibt
new / 10
=0
und0
istfalse
(alles andere ungleich0
isttrue
). beachte daß es sich um eine Ganzzahldivision handelt.