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
-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; }
-
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