Wochentag ausgeben



  • Hallo liebe Gemeinde.

    Inzwischen habe ich es geschaft, die aktuelle Uhrzeit und das aktuelle Datum auszugeben. Bloß möchte ich noch dazu den aktuellen Tag ausgeben.

    Folgenden Programmcode habe ich geschrieben:

    #include <iostream>
    #include <time.h>
    #include <ctime>
    using namespace std;
    
    int main()
    {
      time_t;
      tm *pUhrzeit;
      Uhrzeit = 0;
      pUhrzeit = localtime(&Uhrzeit);
    
      do
      {
        cout << "Was wollen Sie wissen?\n";
        cout << "(1) Uhrzeit\n";
        cout << "(2) Datum\n";
        cout << "(3) Wochentag\n";
        cout << "(0) Abbruch!\n";
    
        switch (number)
        {
          case 1:   
            cout << pUhrzeit -> tm_hour << ':' << pUhrzeit -> tm_min << "\n";
            break;
    
          case 2:
            cout << pUhrzeit -> tm_mday << '.' << pUhrzeit -> tm_mon +1 << '.' << pUhrzeit -> tm_year+1900 << "\n";
            break;
    
          case 3:
            cout << pUhrzeit -> tm_wday << "\n";
            break;
    
          case 0:
            cout << "Exit durch Abbruch!\n";
            break;
        } 
      }while(number!=0);
    
      return 0;
    }
    

    Wenn ich mich aber jetzt für den Fall 3, also für den Wochentag entscheide, kommt für Montag eine 1 und nicht "Montag".

    Ich habe schon versucht, durch enum die Wochentage aufzuzählen und auszugeben. Nach #include <iostream>

    enum Wochentag {Sonntag=0, Montag=1, Dienstag=2, Mittwoch=3, Donnerstag=4, Freitag=5, Samstag=6}
    

    Und in case 3:

    cout << pUhreit -> tm_wday << Wochentag << "\n";
    

    Aber da kommt bei mir die Fehlermeldung:

    Error: Der Typname ist nicht zulässig
    

    Welchen Denkfehler habe ich??

    Vielen Dank für die Antworten im Voraus.

    Gruß

    Max

    P.S.: In "Der C++ Programmierer" steht auf S. 881, was alles die Header <ctime>
    beinhaltet. Bei "int tm_wday" steht "Wochentag seit Sonntag 0...6". Aber ich will nicht 0 ... 6 ausgeben sondern Sonntag ... Samstag. Wie geht das??



  • du müsstest dir die zuordnung mappen

    schreib dir eine funktion die einen int entgegen nimmt und daraus resultierend den wochentag zurück gibt:

    std::string mapWochentagAufZahl(int tag)
    {
        if ( tag == 0 )
            return "Sonntag";
        else if ( tag == 1 )
            return "Montag";
        // ...
        return "";
    }
    

    die schönste methode ists nicht. ich selbst würde mir eine std::map basteln(oder wenigstenseinen vector/array)

    std::string wochentage[] = {"Sonntag", "Montag", "Dienstag", ...};
    
    cout << wochentage[0] << endl;
    


  • Skym0sh0 schrieb:

    std::string wochentage[] = {"Sonntag", "Montag", "Dienstag", ...};
    

    Hier würde ich sogar ausnahmsweise const char* nehmen.



  • enum Wochentag
    {
    	Montag,
    	Dienstag,
    	Mittwoch,
    	Donnerstag,
    	Freitag,
    	Samstag,
    	Sonntag
    };
    
    int main()
    {
    	std::map<Wochentag,std::string> wochentage;
    	wochentage[Montag]     = "Montag";
    	wochentage[Dienstag]   = "Dienstag";
    	wochentage[Mittwoch]   = "Mittwoch";
    	wochentage[Donnerstag] = "Donnerstag";
    	wochentage[Freitag]    = "Freitag";
    	wochentage[Samstag]    = "Samstag";
    	wochentage[Sonntag]    = "Sonntag";
    
    	cout << "Heute ist " << wochentage[Montag];
    }
    

    Aber ja, so eine map finde ich eigentlich auch schöner.



  • silent_max schrieb:

    cout << pUhrzeit -> tm_wday << "\n";
            break;
    

    Wenn ich mich aber jetzt für den Fall 3, also für den Wochentag entscheide, kommt für Montag eine 1 und nicht "Montag".

    tm_wday ist ja auch eine int-Variable.

    silent_max schrieb:

    Ich habe schon versucht, durch enum die Wochentage aufzuzählen und auszugeben. Nach #include <iostream>

    enum Wochentag {Sonntag=0, Montag=1, Dienstag=2, Mittwoch=3, Donnerstag=4, Freitag=5, Samstag=6}
    

    Und in case 3:

    cout << pUhreit -> tm_wday << Wochentag << "\n";
    

    Aber da kommt bei mir die Fehlermeldung:

    Error: Der Typname ist nicht zulässig
    

    Welchen Denkfehler habe ich??

    Wochentag ist kein Ausdruck sondern ein Typ. An der Stelle muss aber ein Ausdruck stehen.

    silent_max schrieb:

    P.S.: In "Der C++ Programmierer" steht auf S. 881, was alles die Header <ctime>
    beinhaltet. Bei "int tm_wday" steht "Wochentag seit Sonntag 0...6". Aber ich will nicht 0 ... 6 ausgeben sondern Sonntag ... Samstag. Wie geht das??

    Du könntest diese Zahl als Index für ein Array von Zeichenketten verwenden.

    const char* wochentag_name(int index)
    {
      assert(0<=index && index<7);
      static const char* const namen[] = {
        "Sonntag",
        "Montag",
        "Dienstag",
        "Mittwoch",
        "Donnerstag",
        "Freitag",
        "Samstag"
      };
      return namen[index];
    }
    
    :::
    
    cout << wochentag_name(pUhrzeit->tm_wday) << '\n';
    


  • Was ist denn "assert" für ein Befehl??

    Bei mir ist sowohl "assert" als auch im main() bei

    cout << wochentag_index(pUhrzeit->tm_wday) << "\n"
    

    wochentag_index rot interringelt....



  • Hä, wochentag_index hat krümelkacker doch gar nicht geschrieben.



  • out schrieb:

    Hä, wochentag_index hat krümelkacker doch gar nicht geschrieben.

    Sorry ... habe ich total überlesen...

    Für "assert" muss ich ja

    #include <assert.h>
    

    schreiben...



  • silent_max schrieb:

    Für "assert" muss ich ja

    #include <assert.h>
    

    Ne, #include <cassert>



  • out schrieb:

    silent_max schrieb:

    Für "assert" muss ich ja

    #include <assert.h>
    

    Ne, #include <cassert>

    Wo ist der Unterschied zwischen

    #include<assert.h>
    

    und

    #include<cassert>
    

    ??

    Gruß

    Max

    Edit: Ich habe <assert.h> mit eingebunden und es hat funktioniert...



  • Bei xyz.h liegen die Definitionen im globalen Namensraum. Bei cxyz liegen die Definitionen im Namensraum std .



  • silent_max schrieb:

    Wo ist der Unterschied zwischen

    #include<assert.h>
    

    ...

    Kein Header der C++ Standardbibliothek hat eine Dateiendung, der Header mit der Dateiendung .h ist ein C-Header, das andere ein C++ Header (in diesem Fall genauer gesagt: ein C-Kompatibilitätsheader für C++).

    So wie man unter C++ auch nicht <time.h> sondern <ctime> verwenden sollte.



  • Ok...



  • asc schrieb:

    Kein Header der C++ Standardbibliothek hat eine Dateiendung, der Header mit der Dateiendung .h ist ein C-Header, das andere ein C++ Header (in diesem Fall genauer gesagt: ein C-Kompatibilitätsheader für C++).

    So wie man unter C++ auch nicht <time.h> sondern <ctime> verwenden sollte.

    Eine standardkonforme Standardbibliothek muss auch time.h bereitstellen.

    For compatibility with the C standard library and the C Unicode TR, the C++ standard library provides
    the 25 C headers, as shown in Table 154.

    [...]

    [ Example: The header <cstdlib> assuredly provides its declarations and definitions within the namespace
    std. It may also provide these names within the global namespace. The header <stdlib.h> assuredly
    provides the same declarations and definitions within the global namespace, much as in the C Standard. It
    may also provide these names within the namespace std. — end example ]

    Es geht hier im Forum das Gerücht umher, dass es die .h-Varianten nicht gäbe.



  • silent_max schrieb:

    P.S.: In "Der C++ Programmierer" steht auf S. 881, was alles die Header <ctime>
    beinhaltet. Bei "int tm_wday" steht "Wochentag seit Sonntag 0...6". Aber ich will nicht 0 ... 6 ausgeben sondern Sonntag ... Samstag. Wie geht das??

    Hallo Max,

    In der C++-Bibliothek gibt es eine Facette namens time_put. Diese ist für die Ausgabe von Zeit und Datum zuständig.
    Die eigentliche formatierte Ausgabe erledigt die Methode time_put::put. Von put gibt es zwei Varianten die neben den Parametern, den die meisten Facetten besitzen, die Parameter std::tm und eine Formatangabe besitzen.
    Die genaue Beschreibung der Formatangabe - bzw. was da alles wie ausgegeben werden kann - findest Du unter strftime.

    Demo:

    #include <iostream>
    #include <locale>               // std::time_put<>
    #include <ctime>                // std::tm usw.
    
    int main()
    {
        using namespace std;
        cout.imbue( locale("german") ); // Datum&Wochentag bitte in deutsch
    
        time_t jetzt_ = time( nullptr ); // aktulle Zeit
        tm dateTime = *localtime( &jetzt_ ); // Zeit in struct tm konvertieren
    
        const char pattern[] = "%H:%M %x %A"; // Stunde:Minute=%H:%M Datum=%x Wochentag=%A
        const char* patternEnd = pattern + (sizeof(pattern)/sizeof(pattern[0])) - 1;
        typedef time_put< char > TimePut;
        use_facet< TimePut >( cout.getloc() )
            .put( TimePut::iter_type( cout ), cout, cout.fill(), &dateTime, pattern, patternEnd );
        cout << endl;
    
        return 0;
    }
    

    Ausgabe (z.B.):

    20:13 10.12.2012 Montag
    

    Das kann man auch alles schön verpacken, so wie es hier mit dem Manipulator now (2.Listing) schon gezeigt wurde.
    :xmas2: Werner


Anmelden zum Antworten