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. Beicxyz
liegen die Definitionen im Namensraumstd
.
-
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. Vonput
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