Zahl in Ziffern zerlegen und abspeichern.
-
@Bushmaster
Wenn du hier länger dabei wärst und Ahnung von C-Programmierung hättest, wüsstest du, dass ich mich nie auf das Niveau von Stümpern wie dir herablasse und für ihren durchschaubaren Versuch, ihren Stümpercode zu korrigieren, ihnen auch noch die UBs aus dem Standard und dem Code raussuche.
-
@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
-
@Wutz sagte in Zahl in Ziffern zerlegen und abspeichern.:
Wenn du hier länger dabei wärst und Ahnung von C-Programmierung hättest, wüsstest du, das ich mich nie auf das Niveau von Stümpern wie dir herablasse und für ihren durchschaubaren Versuch, ihren Stümpercode zu korrigieren, ihnen auch noch die UBs aus dem Standard und dem Code raussuche.
du willst also nur stänkern? tztztz ....
-
@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; }
-
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!