Ziffern hinter dem Komma extrahieren

OP #2132268
Lesenswert?

Mahlzeit community ;-)

Kann mir jemand sagen wie ich die Ziffern hinter dem Komma auslesen 
kann?
Hintergrund ist, ich wollte mir eine Fkt. schreiben welche mir die 
Stellen einer Zahl zählt

Ich dachte mir folgendes:
zum Beispiel 123. Ich "teile" durch 10.
Wären dann 12,3. Dann will ich aber nur die die 3 aus dem ergebnis 
weiterverarbeiten und zwar in der hinsicht dass ich sie mit der 
eigentlichen Zahl vergleiche. Stimmen beide nicht überein, teile ich 
beim nächsten schleifendurchgang durch 100. Wären hinterm komma 23 usw.
beim letzten Durchgang würde der Zustand 123=123 eintreten und die 
schleife beendet werden.
Ja, und bei jedem schleifendurchgang dann eben noch einen zähler 
mitlaufen lassen dessen wert zurückgegeben wird.

Das ganze in C.

Mein Problem ist im Grunde genommen nur das, dass ich nicht weiss wie 
ich aus einer Kommazahl die "Zahl" hinter dem Komma extrahiere.

Hoffe ihr versteht was ich hier geschrieben habe, kommt mir irgendwie 
verwirrend vor ;-)

Danke
Gast #2132358
Lesenswert?

Problematisch am Eröffnungsbeitrag ist, dass die eigentliche 
Fragestellung ("Anzahl der Stellen einer Zahl ermitteln") und der 
vermeintliche Lösungsansatz ("Ziffern hinter dem Komma extrahieren") 
vermischt werden. Dadurch sind die Antworten direkt in Richtung 
Modulorechnung gegangen, was hier nicht unbedingt eine "sinnvolle" 
Lösung darstellt.

"Mathematisch korrekt" ermittelt man die Anzahl der Stellen einer Zahl 
nämlich mit der Logarithmusfunktion:
1
unsigned stellen(int i)
2
{
3
 if (i == 0)
4
   return 1;
5
 else
6
   return log10(abs(i)) + 1;
7
}

Den algorithmischen Ansatz von DirkB kann man natürlich auch verfolgen, 
dann muss man sich aber schon mehr Gedanken machen (der Algorithmus von 
DirkB hat gleich mehrere Fehler).
#2132359
Lesenswert?

Rush ... schrieb:
> Hintergrund ist, ich wollte mir eine Fkt. schreiben welche mir die
> Stellen einer Zahl zählt

hmm, das geht auch ganz anders:
1
char mystring[20];
2
int meinezahl = 12345;
3
int laenge;
4

5
sprintf(mystring, "%d", meinezahl);
6

7
laenge = strlen(mystring);
;) mf

PS: falls die Zahl negativ sein kann, noch das hier vor sprintf(); rein 
werfen:
1
meinezahl = (meinezahl < 0) ? 0 - meinezahl : meinezahl;

PPS: Ich hab meinen Informatik Profs in den Praktikumsaufgaben immer 
möglichst abstruse Lösungen abgegeben. Kommentar der Profs dazu war 
meist: "Na, wenigstens sehe ich, dass Sie nicht wie die restlichen 90% 
des Kurses einfach alles aus meinen Musterlösungen herauskopieren."
OP #2132372
Lesenswert?

Die sache mit dem Log funktioniert auch nicht. Da wird garnichts 
ausgegeben, nicht einmal eine Null.

Ich hänge die paar zeilen einfach mal dran:
1
#include <stdio.h>
2
#include <stdlib.h>
3

4
unsigned int mod(unsigned int zahl)
5
{
6
 unsigned int i = zahl;
7
 if (i == 0)
8
   return 1;
9
 else
10
   return log10(abs(i)) + 1;
11

12
}
13

14
int main(int argc, char *argv[])
15
{
16
    unsigned int bla = 123;
17
    printf("%u" + mod(bla));
18
   
19
    system("PAUSE");  
20
    return 0;
21
}
Gast #2132388
Lesenswert?

Rush ... schrieb:
> Die sache mit dem Log funktioniert auch nicht. Da wird garnichts
> ausgegeben, nicht einmal eine Null.

Dein Code ist, mit Verlaub, auch völlige Grütze. Vielleicht solltest du 
erstmal ein gutes C-Buch durcharbeiten. Darin sollte dann z.B. erklärt 
werden, wie man die printf-Funktion korrekt benutzt.

Du kannst nicht erwarten, dass wir dir hier deine Hausaufgaben machen. 
Ein bisschen Eigeninitiative darf wohl schon von dir gefordert werden.
#2132481
Lesenswert?

Rush ... schrieb:

> Aber auch nach dem Einbinden passiert rein garnichts :-(

Das wundert mich ehrlich gesagt aber auch nicht wirklich

    printf("%u" + mod(bla));

Tja. Das funktioniert nun mal nicht so.

> Schließlich mache ich mir meine Gedanken darüber

Gedanken machen ist guuuuut. Aber ehe du dir Gedanken machst, kommt noch 
ein Schritt davor. Und der lautet: Erlernen der absoluten Basics. Und 
dazu kann man sich auch Gedanken machen, nämlich wenn man darüber 
nachdenkt, was man gerade in seinem C-Buch gelesen hat. Unterschätz das 
nicht!
Gast #2133456
Lesenswert?

Die Fragestellung ist leicht zweideutig, ich dachte zuerst auch, Rush 
wollte die einzelnen Stellen extrahieren. Das mache ich immer so 
(endlich mal eine Anwendung für den Komma-Operator):

c='0'-1;while(c++,(t-=10000)>=0);putch(c);
c='9'+1;while(c--,(t+= 1000)< 0);putch(c);
c=47;while(c++,(t-=  100)>=0);putch(c);
c=58;while(c--,(t+=   10)< 0);putch(c);
putch(c+48);

Rush will aber die Länge der Zahl haben. Das würde ich mit einer binären 
Suche erledigen, weil am schnellsten:
Nehmen wir an, es ist ein u16_t:

if(i>99){if(i>999){if(i>9999)l=5;else l=4;}else l=3;}
else if(i>9)i=2; else i=1;


ungetestet!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren