Sommer-/Winterzeit auslesen



  • Hallo und guten Morgen liebe Gemeinde.

    Ich wollte die Sommer-/Winterzeit über eine Frage per cin auslesen.

    Dazu habe ich folgenden Programmcode geschrieben:

    #include <iostream>
    #include <ctime>
    #include <cassert>
    #include <string>
    using namespace std;
    
    int main()
    {
      std::string Frage;
      time_t Uhrzeit;
      tm *pUhrzeit;
      Uhrzeit = time(0);
      pUhrzeit = localtime(&Uhrzeit)
    
      do
      {
        cout << "Was wollen Sie wissen?\n"
        getline(cin, Frage);
        cout << "\n";
    
        if(Frage=="Welche Jahreszeit haben wir?")
        {
          cout << "\n";
          cout << "\t" << pUhrzeit ->tm_isdst << "\n"; 
          cout << "\n";
        }
    
        if(Frage=="Wann beginnt die Sommerzeit?")
        {
          cout << "\n";
          cout << "\t" << pUhrzeit ->tm_isdst << "\n"; 
          cout << "\n";
        }
    
        if(Frage=="Exit")
        {
          cout << "\n";
          cout << "\tAbbruch durch Exit\n"; 
          cout << "\n";
        }
      }while(Frage!="Exit");
    
      return 0;
    }
    

    Wenn ich jedoch die Frage "Wann beginnt die Sommerzeit?" eingebe, kommt in der Ausgabe nur eine "0". Und wenn ich die Frage "Welche Jahrezeit haben wir?" eingebe, kommt gar nichts.

    Was habe ich falsch gemacht?

    Danke für die Antworten im Voraus.

    Gruß

    Max



  • silent_max schrieb:

    Was habe ich falsch gemacht?

    1. Du hast nicht debuggt und nachgesehen, was genau in dem eingelesenen String drinsteht.

    2. (etwas allgemeiner) Du hast nicht debuggt und den Programmfluss verfolgt.



  • silent_max, was hast du denn im ersten Fall für eine Ausgabe erwartet und warum?



  • krümelkacker schrieb:

    silent_max, was hast du denn im ersten Fall für eine Ausgabe erwartet und warum?

    Ich wollte im ersten Fall die Jahreszeit ausgeben. Ich dachte, dass der Rechner automatisch zwischen Sommer- und Winterzeit unterscheidet...

    Hier ist mal der gesamte Quellcode:

    //Datum: 11.12.2012
    //Thema: Eigene Übung 080 - Frage nach Uhrzeit und Datum
    
    #include <iostream>
    #include <ctime>
    #include <cassert>
    #include <string>
    using namespace std;
    
    static const char *wochentag_name(int index)
    {
    	assert(0<=index&&index<7);
    	static const char* namen[] = {
    					"Sonntag",
    					"Montag",
    					"Dienstag",
    					"Mittwoch",
    					"Donnerstag",
    					"Freitag", 
    					"Samstag"
    				};
    				return namen[index];
    };
    
    int main()
    {
    	std::string Frage;
    	time_t Uhrzeit;
    	tm *pUhrzeit;
    	Uhrzeit = time(0);
    	pUhrzeit = localtime (&Uhrzeit);
    
    	do
    	{
    		cout << "Was wollen Sie wissen?\n";
    		getline(cin, Frage);
    		cout << "\n";
    
    		if(Frage=="Wieviel Uhr ist es?")
    		{
    			cout << "\n";
    			cout << "\t" << pUhrzeit -> tm_hour << ':' << pUhrzeit -> tm_min   << ':' << pUhrzeit -> tm_sec << "\n"; //Uhrzeit
    			cout << "\n";
    		}
    
    		if(Frage=="Welches Datum haben wir heute?")
    		{
    			cout << "\n";
    			cout << "\t" << pUhrzeit -> tm_mday << '.' << pUhrzeit -> tm_mon+1 << '.' << pUhrzeit -> tm_year + 1900 << "\n"; //Datum
    			cout << "\n";
    		}
    
    		if(Frage=="Welchen Tag haben wir?")
    		{
    			cout << "\n";
    			cout << "\t" << wochentag_name(pUhrzeit->tm_wday) << "\n"; //Wochentag
    			cout << "\n";
    		}
    
    		if(Frage=="Welche Jahrezeit haben wir?")
    		{
    			cout << "\n";
    			cout << "\t" << pUhrzeit ->tm_isdst << "\n"; //Jahreszeit
    			cout << "\n";
    		}
    
    		if(Frage=="Wann beginnt die Sommerzeit?")
    		{
    			cout << "\n";
    			cout << "\t" << pUhrzeit ->tm_isdst << "\n"; //Sommerzeit
    			cout << "\n";
    		}
    
    		if(Frage=="Exit")
    		{
    			cout << "\n";
    			cout << "\tExit durch Abbruch!\n";
    			cout << "\n";
    		}
    	}while(Frage!="Exit");
    
    	return 0;
    }
    

    Gruß Max



  • silent_max schrieb:

    Ich dachte, dass der Rechner automatisch zwischen Sommer- und Winterzeit unterscheidet...

    Kann er auch.
    Nur lies mal nach, was für ein Typ das Element tm_isdst in der struct tm ist und was die Werte darin bedeuten.

    Und zur Erinnerung: Wir haben Normalzeit.

    Und schau dir mal die fast gleichen Wörtern Zeile 60 und 63 an.



  • silent_max schrieb:

    krümelkacker schrieb:

    silent_max, was hast du denn im ersten Fall für eine Ausgabe erwartet und warum?

    Ich wollte im ersten Fall die Jahreszeit ausgeben.

    Und wo steht die Jahreszeit drin, die ausgegeben werden soll?

    Ich wünsche mir von dir mehr Eigeninitiative.

    Dein Problem ist ähnlich wie das hier:

    cout << 5 << endl; // hier soll 4 ausgegeben werden, warum bekomme ich keine 4?
    


  • DirkB schrieb:

    Kann er auch.
    Nur lies mal nach, was für ein Typ das Element tm_isdst in der struct tm ist und was die Werte darin bedeuten.

    Und zur Erinnerung: Wir haben Normalzeit.

    Und schau dir mal die fast gleichen Wörtern Zeile 60 und 63 an.

    Stimmt, die Werte sind vom Typ Integer.

    Hm ...

    Kann man eine Variable vom Typ Integer in einen String umwandeln?? Wie meinst Du das mit "[...] Wir haben Normalzeit."??



  • silent_max schrieb:

    Kann man eine Variable vom Typ Integer in einen String umwandeln??

    das geht beispielsweise so:

    int i = 5;
    std::stringstream ss;
    ss << "Inhalt von 'i': " << i;
    
    cout << ss.str();
    


  • silent_max schrieb:

    Kann man eine Variable vom Typ Integer in einen String umwandeln??

    Meinst du so wie bei den Wochentagen?

    silent_max schrieb:

    Wie meinst Du das mit "[...] Wir haben Normalzeit."??

    Das die 0 richtig ist.
    Falls dich der Name stört: Es gibt nur Sommerzeit. Das was du als Winterzeit bezeichnest ist die Normalzeit.



  • Ich kann ja schlecht schreiben

    if(Frage=="Welche Jahrezeit haben wir?")
    {
    	char Winterzeit;
    	char Sommerzeit;
    	int tm_isdst = static_cast<char>(tm_isdst);
    	int (0) = static_cast<char>(Winterzeit);
    	int (>0) = static_cast<char>(Sommerzeit); 
    	cout << "\n";
    	cout << "\t" << pUhrzeit ->tm_isdst << "\n"; //Jahreszeit
    	cout << "\n";
    }
    

    Zumindest ich bekomme bei meinem Compiler folgende Meldungen:

    -> Bei dem zweiten int bekomme ich die Meldung ""Der Ausdruck muss ein änderbarer Ivalue sein".

    -> Bei dem dirtten int bekomme ich bei dem Größerzeichen die Meldung "Es wurde ein Ausdruck erwartet".

    Muss da nicht eine Fallunterscheidung zwischen 0 und >0 gemacht werden oder bin ich auf´m Holzweg?

    Gruß



  • So etwa ?

    cout << "\t" << (pUhrzeit ->tm_isdst) ? "Sommerzeit" : "Normalzeit" << "\n"; //Jahreszeit
    


  • Da kommt bei mir bei Normalzeit die Meldung

    Error: Der Ausdruck muss einen integralen Typ oder einen Enumerationstyp aufweisen
    


  • silent_max, du solltest ein bißchen mehr Eigeninitiative (beim Programmieren) zeigen...

    Hinweis: Klammerung



  • Th69 schrieb:

    silent_max, du solltest ein bißchen mehr Eigeninitiative (beim Programmieren) zeigen...

    Hinweis: Klammerung

    Wie denn, wenn ich die Syntax nicht weiß??

    Ich habe jetzt

    cout << "\t" << (pUhrzeit -> tmisdst)?(Sommerzeit):(Normalzeit) << "\n";
    

    geschrieben und dennoch kommt bei der Klammer von Normalzeit die Meldung

    Error: Der Ausdruck muss einen integralen Typ oder einen Enumerationstyp aufweisen
    

    Die Meldung kommt bei mir zudem bei "\n".

    Den Bedingungsoperator habe ich erst durch DirkB kennengelernt.

    Sorry


  • Mod



  • SeppJ schrieb:

    Initiative!

    Die Initiazivpräzedenz bei silent_max scheint zu sein:

    1. Im Forum machen lassen
    2. Im Forum fragen
    3. Von Kollegen machen lassen
    4. Kollegen fragen
    5. Nichts machen
    6. Im Internet suchen
    7. Im Unterricht aufpassen
    8. Sein C++-Buch lesen

    Notes:
    The silent_max itself doesn't specify precedence levels. They are derived from the behaviour.

    Dass er in seinem Buch nicht weit vorangeschritten ist, hat er selbst verraten

    Den Bedingungsoperator habe ich erst durch DirkB kennengelernt.



  • silent_max schrieb:

    Th69 schrieb:

    silent_max, du solltest ein bißchen mehr Eigeninitiative (beim Programmieren) zeigen...

    Wie denn, wenn ich die Syntax nicht weiß??

    Du bekommst doch Feedback vom Compiler, Linker oder von deinem Programm selbst (wenn es läuft). Da musst nur dein Hirn einschalten, nachdenken und ggf etwas recherchieren, z.B. die Fehlermeldung, die du siehst. Oder schau im C++ Buch nach. Oder verwende den Debugger um zu sehen, was dein Programm macht. Aktuell kommt das leider so rüber, als wenn du zu faul wärst, wenigstens zu versuchen, deine Probleme selbst zu lösen. Das grenzt sogar an Trollerei, das Verhalten.



  • silent_max schrieb:

    (Sommerzeit):(Normalzeit)
    

    Diese Klammern sind genauso überflüssig wie die Klammern im folgenden Ausdruck:

    (5)+(3)*2
    


  • Bitte versteht mich jetzt nicht falsch... aber komme ich wirklich als so faul rüber??

    Ich werde versuchen, diesen Eindruck so schnell wie möglich zu revidieren. Bitte entschuldigt an der Stelle, dass ich wie bisher unterwegs war. Zudem werde ich versuchen, nur noch die allerwichtigsten Fragen zu posten.

    Edit:

    Darf ich überhaupt noch etwas posten oder habe ich jetzt jeden verkrault?



  • silent_max schrieb:

    Bitte versteht mich jetzt nicht falsch... aber komme ich wirklich als so faul rüber??

    ganz ruhig. Es ist leider nicht erkennbar, dass du in irgendeiner Weise Fortschritte machst. Das in Zusammenhnag mti dem teilweise etwas rauen Umgangston hier führt dann zu den Reaktionen.

    Natürlich darfst du Fragen stellen. Es sollte nur erkennbar sein, dass du Eigeninitiative zeigst.


Anmelden zum Antworten