Kleine Verständnisfragen



  • Hallo,
    ich habe ein paar kleine Fragen zu c++:

    a. Lässt sich nur der INT Datentyp mit Werten überspannen (OVERFLOW) oder auch Double/Float etc.?

    b. const int INT_OVERFLOW= -1 --> dabei wird der Wert auf -1 gesetzt. Wieso?

    c. statt if(ganz_zahl == ergebnis), sollte man doch lieber if (ganz_zahl(ergebnis)) verwenden, um die max. Toleranz zu nutzen, oder?

    d. if (ergebnis == 0. && Wert < 0) - wieso sollte man hier einen explizierten Typecast verwenden? Der compiler würde doch auch so einen Float/Double Wert drauß machen, oder?

    e. Was ist ein Ordinaltyp?

    f. Ein Prototyp ist doch eine Deklaration für eine Function, richtig?

    g. Habe gehört, dass Functions mit Rückgabewert nicht als Prozedure verwendet werden dürfen. Wieso dies ?

    Vielen Dank im Voraus.
    Lg
    Tanja



  • a. Das geht afaik nicht bei float/double
    b. Weil nur 'int' signed ist, also du Werte mit Vorzeichen speichern kannst
    c. Nein, das zweite ist falsch
    d. Dann sieht man besser was passiert im Code, aber ein == Vergleich mit float/double sollte man aber nicht machen
    e. Keine Ahnung ich wuerd auf built-in-Type tippen.
    f. Ja
    g. Versteh die Frage nicht, Beispiel?



  • Hallo

    g. Habe gehört, dass Functions mit Rückgabewert nicht als Prozedure verwendet werden dürfen. Wieso dies ?

    In C/C++ gibt es keinen Unterschied zwiaschen Funktionen und Prozeduren wie in Pascal.
    Es gibt nur Funktionen mit und ohne Rückgabetyp. Aber der Rückgabewert muß nicht im konkreten Aufruf verwendet werden.

    bis bald
    akari



  • Danke, müsste nun nur noch wissen, was ein Ordinaltyp in c++ ist.



  • Hallo

    Ein Ordinaltyp ist ein Aufzählunstyp, wo jeder einzelner Wert genau einen Vorgänger und Nachfolger hat. Daraus ergibt sich eine strenge Ordnung, deshalb Ordinal. In C++ sind das int, char, short und enum. Nicht aber zum Beispiel float.

    bis bald
    akari



  • Danke, kann mir jemand noch diesen Satz erklären:

    ergebnis = (double (fakultaet(int (ergebnis))));

    ? Was heißt dies?
    Danke.



  • columbo1979 schrieb:

    a. Lässt sich nur der INT Datentyp mit Werten überspannen (OVERFLOW) oder auch Double/Float etc.?

    Wenn ein Gleitkommawert zu groß wird, erhältst du #.INF, ein Ganzzahlwert macht am unteren Ende der Skala weiter (z.B. "char x = 127; x++;" ergibt -128).

    ergebnis = (double (fakultaet(int (ergebnis))));

    Der Inhalt von 'ergebnis' wird nach int umgewandelt, an die Funktion 'fakultaet' übergeben und deren Rückgabewert wieder zu einem double zurückverwandelt. Aber eigentlich reicht auch ergebnis = fakultaet(ergebnis); aus - um die ganzen Typumwandlungen sollte sich der Compiler kümmern.



  • Vielen Dank.
    Lg
    Tanja



  • main.cpp

    Wert = ((fakultaet(ergebnis)));
    

    math.h
    Variante a / double
    double fakultaet(double n);

    Variante b / int
    int fakultaet(int n);
    const int INT_OVERFLOW = -1;

    math.cpp
    double fakultaet(double n) // Variante a
    int fakultaet(int fakult) // Varinate b

    Dazu ein paar kleine Fragen:
    a. Welche Version wird im main.cpp aufgerufen? Die int variante oder die double?
    b. Wie kann ich festsetzen, dass dafür die funktion double genutzt wird? nicht int.
    c. Bei INT kann ich ja recht leicht feststellen, ob ein Überlauf stattgefunden hat. nur wie kann ich dies bei "double" feststellen? (mantissenüberlauf)

    Danke. Lg Tanja



  • Welche Version der Funktion benutzt wird, hängt vom Typ des Parameters ab. Bei

    ergebnis = (double (fakultaet(int (ergebnis))));
    

    wird die int fakultaet(int n) aufgerufen, da ergebnis nach int gecastet wird. Willst du die double-Version der Fakultätsfunktion aufrufen:

    bla = fakultaet(double (ergebnis));
    

    oder vorher sicherstellen, dass ergebnis vom Typ double ist:

    double ergebnis = 42.2;
    bla = fakultaet(ergebnis);
    


  • columbo1979 schrieb:

    a. Welche Version wird im main.cpp aufgerufen? Die int variante oder die double?

    Das hängt vom Typ der Variablen 'ergebnis' ab - der Compiler nimmt die Version, für die er weniger Typumwandlungen benötigt.

    b. Wie kann ich festsetzen, dass dafür die funktion double genutzt wird? nicht int.

    Indem du notfalls eine explizite Typumwandlung einbaust.

    c. Bei INT kann ich ja recht leicht feststellen, ob ein Überlauf stattgefunden hat. nur wie kann ich dies bei "double" feststellen? (mantissenüberlauf)

    Sogar noch einfacher als bei int - wenn der Wert zu groß wird, um dargestellt zu werden, springt er auf numeric_limits<double>::inf() um. (bei einem int müsstest du bei jeder Operation überprüfen, ob du in den negativen Bereich gesprungen bist)


Log in to reply