Anzahl der Stellen einer Zahl? (ohne String-Klasse)
-
Hallo zusammen!
Wir müssen als Aufgabe in C++ die Klasse String selber programmieren. Leider hapert's bei mir jetzt an der append-Funktion.
Wie kann ich die Anzahl Stellen einer int-Zahl bzw. einer double-Zahl herausfinden? Oder gibt es eventuell eine einfachere Möglichkeit, dass ich gleich die ganze int-Zahl in ein char bekomme? Leider dürfen wir eben keine Funktionen aus der Klasse string verwenden...:(Wäre super, wenn jemand was wüsste!
Vielen Dank und Gruss, Mike
-
Hi,
wie kommen die Daten denn rein? Als char oder als int oder double?
Gruss
EB
-
wie waers, wenn du in einer schleife die zahl durch 10.000, dann durch 1000, dann durch 10 teilst, und wenn das ergebnis <10 ist, dann haste die gesuchte anzahl der stellen???!!!
Esco
-
Die Daten kommen als int (bei der Funktion
append(int value)
) bzw. als double (bei der Funktion
append(double value)
) herein.
Das mit der Schleife und dem Dividieren habe ich mir auch schon überlegt, aber wie weiss ich, wo ich anfangen muss? bei 10'000 oder bei 100'000? Und wie sieht das beim double aus??
Danke für eure Hilfe!
Gruss Mike
-
für ints:
unsigned long getDigits(int iNumber) { if(iNumber<0) // nur positive iNumbers verarbeiten iNumber *= -1; // sonst passend biegen for(unsigned long d = 1; iNumber >= 10; iNumber /= 10) // so lange durch 10 dividieren bis es nicht mehr geht, d++; // mitzählen und return d; // zurückgeben }
kind regards
Swordfish[edit]
ähm... da ich Deine Kenntnisse nicht einschätzen kann:x += y; // x = x + y; x -= y; // x = x - y; x *= y; // x = x * y; x /= y; // x = x / y;
-
hmm das geht zwar sit glaub aber nicht so gut
es heisst auch
int und nicht unsigned int
was wenn man -123 eingibt? -123 ist eine int zahl und hat 3 stellen im dezimalsystem. wie willst es dann bei double machen?
-123.456
Ohne jetzt grossartig nachzudenken würd ich sagen, das du die zahl im Binärform ansehen musst und dann "verarbeiten".
-
newkid_ schrieb:
hmm das geht zwar sit glaub aber nicht so gut
es heisst auch
int und nicht unsigned intmeinst mich?
-
Hi,
ich würde es so machen:
const char* String::append(int n) { char cb[32]; sprintf(cb, "%d", n); return append(cb); } const char* String::append(double f) { char cb[64]; sprintf(cb, "%f", f); return append(cb); } const char* String::append(char* str) { // string zusammenfügen und zurückgeben return NULL; }
Das verwendet zwar das etwas verpönte sprintf macht aber hier durchaus Sinn.
Die Format-Parameter bei sprintf lassen noch einiges an Spielraum zu (s.MSDN).Gruss
EB
-
Hallo zusammen!
So, endlich funktioniert es!
void CString::append(int val) { //Wenn es ein Minuszeichen hat, dann fuegen wir das mal an und machen den Wert positiv if (val < 0){ append('-'); val*=-1; } //Anzahl der Stellen herausfinden int totalDigits = 1 + (int)(log((double)val)/log((double)10)); char *buffer = new char[totalDigits]; _itoa(val,buffer,10); for (int i = 0; i < totalDigits; i++) { append(buffer[i]); } //delete [] buffer; buffer = 0; delete [] buffer; }
Meine Funktion für double sieht folgendermassen aus:
void CString::append(double val) { //Wenn es ein Minuszeichen hat, dann fuegen wir das mal an und machen den Wert positiv if (val<0){ append('-'); val*=-1; } //Abgerundeter Wert int ValueBeforDeciPoint = floor(val); append(ValueBeforDeciPoint); append('.'); val-=ValueBeforDeciPoint; int help; do{ val*=10; help=int(floor(val)); append(help); val-=help; }while((val>0.0000001)&&(val<0.999999)); }
Bei der while-Schleife bin ich noch nicht zufrieden.
Hätte da jemand einen Vorschlag, wie ich das beser machen könnte??
Herzlichen Dank für eure Hilfe!
Gruss Mike
-
Wenn du mich fragst, ist deine int-Funktion Overkill. Warum der Logarithmus und die dynamische Speicherreservierung? Warum nicht einfach ein lokales Array von 12 chars (oder eben mehr, bei 64Bit-int)?
Übrigens, dadurch, dass du buffer vor dem delete auf 0 setzt, hast du da ein astreines Speicherleck.
-
Hallo,
ich verstehe auch nicht ganz, was du da machst? Vieeeeel zu kompliziert.
Schau dir nochmal meinen Post an, das Funktioniert mit Vorzeichen und
ohne dynamischen Speicher.Oder lieber doch kompliziert wenn es auch einfach geht?
Gruss
EB