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 int

    meinst 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


Anmelden zum Antworten