Datentypen-Problem (2)



  • #include <iostream.h>
    #include <conio.h>
    
    //Tage-in-Sekunden-Umrechner
    
    // bei 31 Tagen ist das Ergebnis normalerweise 2678400 s
    // bei float, double, long double werden die Sekunden in Gleitkommadarstellung angezeigt
    // bei char, unsigned char sind 31 Tage aber 4406400 s
    
    int main()
    { int tage;
      cout << "Wieviele Tage wollen sie umrechnen lassen: ";
      cin >> tage;
      cout << "\nDas ergibt dann in Sekunden: " << tage*60*60*24 << " s";
      getch();
      return 0;
    }
    

    Wenn ich nun dem int-Typ "tage" einen char-Typ zuweise, erhalte ich statt 2678400s -> 4406400 s. Hab's auch schon oben beschrieben.
    Wenn ich nun "cout << Wieviel ..." und "cin >> tage" auskommentiere, kommt immer das gleiche Ergebnis raus. (also das richtige Ergebnis)
    Woran liegt das ?
    Kann mich mal jemand aufklären.



  • Ich würde sagen, wenn du cout und cin auskommentierst kommt garnix raus 😮



  • Zickedi: Schmeiß die conio.h raus, die ist nicht Teil von Standard-C++.

    Und ersetze <iostream.h> durch

    #include <iostream>
    using namespace std;
    

    Wenn Du char verwendest kann doch übrigens gar nicht das richtige Ergebnis herauskommen da Du ja dann nicht den eingelesenen Wert weiterverarbeitest sondern nur den ASCII-Wert einer einzelnen Ziffer.



  • Ich muss mit dem C++ Builder arbeiten. Also da is nix mit ANSI, das ist leider Borland.

    Wenn ich cin und cout auskommentiere, stimmt das Ergenis immer auch bei char.

    Es ändert sich nur, wenn ich alles so lasse und char anwende. Dann erhalte ich ein anderes Ergebnis. (s. Quelltext)



  • Zickedi schrieb:

    Ich muss mit dem C++ Builder arbeiten. Also da is nix mit ANSI, das ist leider Borland.

    Auch Borland unterstützt den C++ Standard.

    Es ändert sich nur, wenn ich alles so lasse und char anwende. Dann erhalte ich ein anderes Ergebnis. (s. Quelltext)

    ein char ist 1 Byte groß. Das bedeutet, dass maximal 256 verschiedene Werte hinein passen.

    und 60*60*24 ist meiner Meinung nach ein bisschen mehr als 256 - es kommt zu einem Überlauf und das Ergebnis ist undefiniert.



  • Das ist alles klar.

    Wenn ich die 31 Tage festlege (31*24*60*60), also keine Abfrage nach den Tagen mache, gibt er mir auch mit "char" den richtigen Sekundenwert raus.
    Bei einer Abfrage nach wievielen Tagen gibt er mir bei char einen anderen Wert aus.

    Und bei beiden Quelltexten ist das Produkt weit höher als 256. Nur bei einem geht's, beim anderen nicht.
    Vielleicht ist das jetzt etwas klarer geworden.



  • Zickedi schrieb:

    Wenn ich die 31 Tage festlege (31*24*60*60), also keine Abfrage nach den Tagen mache, gibt er mir auch mit "char" den richtigen Sekundenwert raus.

    Klar, Dein Problem ist ja dass Du die Abfrage verbockt hast, hier bricht Dir die Verwendung des falschen Datentyps (char) das Genick.

    Bei einer Abfrage nach wievielen Tagen gibt er mir bei char einen anderen Wert aus.

    Lies die Beiträge oben nochmal!

    Und bei beiden Quelltexten ist das Produkt weit höher als 256. Nur bei einem geht's, beim anderen nicht.

    Weil Du (siehe oben) beim einen char verwendest und beim anderen nicht.

    Vielleicht ist das jetzt etwas klarer geworden.

    Nein, sorry.



  • Ich glaub ich habs jetzt verstanden!

    char tage;
    cin>>tage;

    Liest nur einen Buchstaben ein, wenn jemand also 31 eingibt, steht in Tage '3', was natuerlich Bloedsinn ist. Denn 1. ist '3' ungleich 31 und zweitens ist '3' ein Buchstabe mit einem ASCII Wert von ungleich '3'

    War das das problem?



  • Shade: Ich denke schon, habe ich das gleiche nicht ganz oben schon geschrieben? 😕



  • Äh, blick's grad nicht mehr.

    Also,

    in der Aufgabe hieß es, dass man ein bisschen mit den Datentypen ausprobieren soll. Hab ich gemacht + eine weiter Abfrage mit den Tagen eingebaut.
    Eigentlich sollte man nur 31 Tage berechnen lassen.

    Bei den festgelegten 31 Tagen kam bei jedem Datentyp das gleiche Ergebnis heraus. (1. Programm)

    Nur bei meinem 2. Programm mit Abfrage nach den Tagen kam dann bei char ein anderes Ergebnis, nach Eingabe von 31, heraus.

    Und das hat mich halt gewundert.

    Beim 1. Programm wird der char gleich mit 31 deklariert,
    beim 2. Programm erst nach Eingabe des Users mit cin.

    Sorry, wenn ich nerve, aber gerade am Anfang sind halt viele Fragen offen.
    Bitte also nochmal erklären, wieso er unterschiedliche Ergebnisse bei char ausgibt ? bei beiden "char's" steht ja im Endeffekt die 31 oder 3 drin (oder wird versucht)
    Macht es also einen Unterschied wenn ich den char nur deklariere als 31 oder wenn ich ihn mit cin eingeben lasse ?



  • nman schrieb:

    Shade: Ich denke schon, habe ich das gleiche nicht ganz oben schon geschrieben? 😕

    :o sorry. Das habe ich ueberlesen 😞

    sorry!



  • Zickedi schrieb:

    bei beiden "char's" steht ja im Endeffekt die 31 oder 3 drin (oder wird versucht)

    Nein, in einem char kann immer nur ein Zeichen stehen und das ist hierbei dann auch nicht 3 sondern '3' das heißt wenn Du mit dem Char weiterrechnest rechnest Du mit dem ASCII-Code von 3 weiter (static_cast<int>('3') was auf meinem System 51 entspricht).

    Macht es also einen Unterschied wenn ich den char nur deklariere als 31 oder wenn ich ihn mit cin eingeben lasse ?

    Nein, keinen wesentlichen.


Log in to reply