Wochentag ausgeben



  • 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