Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Anzahl der Stellen einer Zahl? (ohne String-Klasse)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
01.05.2005, 01:05 Uhr
Pablo
Supertux
(Operator)


schade, hattest du keine Chance ein Photo von ihm geschossen? Wie sah er denn aus? Wie viele Haare hatte er? -1?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
01.05.2005, 02:31 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Wie sah er denn aus?


Hatte ein bisschen was von Pinocchio...
Auf seiner Nase war eine Null tätowiert und die Nase selbst schien irgendwie die ganze Zeit am wachsen zu sein in Richtung minus unendlich zeigend.
Irgendwie schien er verägert über seinen Bruder die Exponentialfunktion... Vor lauter Faulheit sei dieser ihm objektiv gesehen zu wenig surjektiv und er müsse den Blödsinn ausbaden...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
01.05.2005, 11:25 Uhr
~Mike-xp
Gast


Hallo zusammen!

Jep, ich weiss, log's von negativen Zahlen == schrott! Aber ich überprüfe bereits einige Codezeilen weiter oben, ob die Zahl negativ ist und wenn ja, dann mach ich sie positiv


C++:
if (val < 0){
     val *= -1;
}



Damit sollte das doch eigentlich i.O. sein?

Für die double-Zahl hätte ich eine Idee, wäre toll, wenn ihr mir kurz ein feedback geben könntet:


C++:
Pseudocode!!!
double meinWertDenIchAnhaegenMuss = 123.456;
(1)
int hilfsvariable = meinWertDenIchAnhaegenMuss;
append(hilfsvariable);

append('.');

meinWertDenIchAnhaegenMuss -= hilfsvariable;

append((int)meinWertDenIchAnhaegenMuss);



Gibt es eine Möglichkeit, damit bei (1) nicht gerundet wird, sondern wirklich nur der vordere Teil in den int geschrieben wird?

Ich hoffe, ihr kommt draus, was ich meine

Danke und Gruss
Mike
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
01.05.2005, 11:54 Uhr
Pablo
Supertux
(Operator)


wieso nicht abs benutzen? Das ist doch einfacher. Außerdem wenn du -3 umwandeln willst, dann brauchst du 2 statt ein Zeichen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
01.05.2005, 19:37 Uhr
Mike-xp



Hallo zusammen!

So, endlich funktioniert es!


C++:
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:


C++:
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
01.05.2005, 20:53 Uhr
Pablo
Supertux
(Operator)


wenn du schon eine eigene string Klasse schreibst, dann bleibe auch ISO C++, so dass man sie auch unter anderen Systemen benutzten kann. _itoa gehört nicht zum Standard. Außerdem solltest du nach jedem new überprüfen, dass es nicht NULL wird, sonst gibt's Ärger.

Ich hab es wiederholt und nun sage ich es nochmal:

Der Aufruf append(-134) geht in die Hose, weil man "134" statt "-13" bekommt, Grund: du reservierst ein Zeichen zu wenig. 2. das ist unter Umständen kein 0-terminierendes char* (du reserviert den Speicher für \0 auch nicht).

Wozu diese Geschichte?


C++:
if (val < 0){
        append('-');
        val*=-1;
    }



benutze abs()!

mach so:


C++:
int CString::append(int val) /* kein void, es kann auch in die Hose gehen und der Programmier
                                                muss darauf vorbereitet sein */

{
    //Anzahl der Stellen herausfinden
    int totalDigits = (val < 0 ? 1 : 0) + 1 + (int)(log((double) abs(val))/log((double)10));

    char *buffer = new char[totalDigits + 1];

    if(!buffer) return 0;

    sprintf(buffer, "%d", val);

    for (int i = 0; i <= totalDigits; ++i) /* \0 muss angehängt werden */
        append(buffer[i]);

    delete [] buffer;

    return 1;
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 01.05.2005 um 21:04 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
01.05.2005, 22:29 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich würde evtl den log 10 dann noch als konstante einbaun, das beschleunigt etwas da es dann nur einmal berechnet wird
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: