C++: Wochentag bestimmen?
Hi alle zusammen,
ich habe heute einen Code geschrieben, in dem ich den Wochentag bestimmen will. Das Problem ist, ich weiß nicht, wie ich mit dem Ergebnis dann den Tag auswähle. Ich habe mit if und auch mit switch-Anweisungen herumgespielt, es aber nicht hinbekommen.
Hier der Code:
#include "pch.h"
#include <iostream>
using namespace std;
int day;
int monatstag;
int Wochentag;
int Jahr;
int er1;
int er2;
int er3;
char Monat;
int Monat2;
int main()
{
cout << "Bitte geben sie dann Tag ein" << endl;
cin >> day;
cout << "Bitte geben sie ein Jahr ein" << endl;
cin >> Jahr;
// Jahrescode
er1 = Jahr / 4;
er2 = Jahr + er1;
er3 = er2 % 7;
cout << "Bitte gebe sie denn Monat ein\n";
cin >> Monat;
// Monat
switch (Monat) {
case('Jan'): {
Monat2 = 6;
}
break;
case('Feb'): {
Monat2 = 2;
}
break;
case('Mär'): {
Monat2 = 2;
}
break;
case('Apr'): {
Monat2 = 5;
}
break;
case('Mai'): {
Monat2 = 0;
}
break;
case('Jun'): {
Monat2 = 3;
}
break;
case('Juli'): {
Monat2 = 5;
}
break;
case('Aug'): {
Monat2 = 1;
}
break;
case('Sep'): {
Monat2 = 4;
}
break;
case('Okt'): {
Monat2 = 6;
}
break;
case('Nov'): {
Monat2 = 2;
}
break;
case('Dez'): {
Monat2 = 4;
}
break;
}
// WochentagFormel
Wochentag = day + Monat2 + er3;
if (Wochentag == 1) {
cout << "Es ist ein Montag";
}
else if (Wochentag == 2) {
cout << "Es ist ein Dienstag";
}
else if (Wochentag == 3) {
cout << "Es ist ein Mittwoch";
}
else if (Wochentag == 4) {
cout << "Es ist ein Donnerstag";
}
else if (Wochentag == 5) {
cout << "Es ist ein Freitag";
}
else if (Wochentag == 6) {
cout << "Es ist ein Samstag";
}
else if (Wochentag == 7, 0) {
cout << "Es ist ein Sonntag";
}
return 0;
}
Also, ich habe das Ergebnis vom Wochentag, also die Zahl und jetzt will ich, dass das Programm den Tag dann sagt. Ich weiß halt nicht, wie.
Danke schon im Voraus.
3 Antworten
Mir scheint, du hast bei
Wochentag = day + Monat2 + er3;
das modulo 7 vergessen. Ich würde
Wochentag = (day + Monat2 + er3) % 7;
erwarten.
Außerdem ist
if (Wochentag == 7, 0)
sinnlos. Entweder verwendet man eine Array.contains()-Methode oder ein ODER:
if (Wochentag == 7 || Wochentag ==0)
wobei man den ersten Ausdruck auch auslassen kann - der Modulo-Operator gibt nie den "Modul" zurück, sondern nur Zahlen, die kleiner sind (bei positivem Zähler).
Dein Problem ist vor allem, dass dein Monat (char) immer nur einen Buchstaben speichert.
Sprich...
char Monat;
cin >> Monat;
//Eingabe: Juni
cout << Monat;
//Ausgabe: J
Das kannst du verhindern, indem du deiner char Variablen schon im Vornherein sagst, wie viele Buchstaben sie speichern soll. Bspw. so....
char Monat[4];
cin >> Monat;
//Eingabe: Juni
cout << Monat;
//Ausgabe: Juni
Das wiederum mag aber deine switch-Funktion nicht, denn soweit ich weiß, verhält sich char array-ähnlich. Switch kann also nicht alle Zellen "unkonvertieren".
Dein Problem ist also, dass Monat2 in switch nie einen Wert annimmt. Du bekommst einen "Müll-Wert". So heißen die Werte uninitialisierter Variablen. Dieser kann entweder zufällig sein, oder ist jener aus dem Cache/Speicher.
Da du für Monat2 nie deinen erhofften Wert erhälst, sondern irgendeinen Fantasiewert, ist dann das restliche Programm freilich nicht mehr stimmig.
---------------------------------------------------------------------------------------------
Ob es eine Lösung gibt, die mit char machbar ist? Wahrscheinlich. Aber ich benutze char fast nie, deshalb kenne ich keine.
Was ich dir vorschlagen würde....
- Benutze gleich die Monatszahlen (Juni = 6) und ändere dein switch dahingehend
- Arbeite mit strings
string Monat;
cin >> Monat;
switch (str2int(Monat))
{
case str2int("Jan"):
....
break;
case str2int("Feb"):
....
break;
}
Wäre zumindest ein Ansatz. Was du auf jeden Fall tun musst: Finde einen Weg, deine string/char variable vollständig in eine integer zu verwandeln. Switch funktioniert nur mit int.
PS: Glatt vergessen, dass es in C++ keine eingebaute str2int Funktion gibt. Benutze dafür diese Funktion...
constexpr unsigned int str2int(const char* str, int h = 0)
{
return !str[h] ? 5381 : (str2int(str, h+1) * 33) ^ str[h];
}
Ich hoffe, dass du jetzt zumindest weißt, wo die Baustelle liegt.
Zunächst etwas Grundsätzliches: Deine Rechtschreibung ist in einem wirklich bedenklichen Zustand. Daran solltest du unbedingt arbeiten. 😐
Bei deinem switch-case kommt das Gefühl auf, als wolltest du es extra unleserlich gestalten. Die vielen Klammern sind völlig unnötig.
switch (month) {
case "Jan":
month2 = 6;
break;
/* ... */
}
Deine Bezeichner stellen außerdem einen Sprach- und Klein-Groß-Mix dar, dabei wäre mehr Stringenz besser für die Lesbarkeit. Variablennamen beginnen nach Konvention stets mit einem Kleinbuchstaben. Sie sollten immer einen aussagekräftigen Namen haben (er3 erfüllt diese Anforderung bspw. nicht).
Statt dem großen if-else if am Ende könntest du alle Wochentage in ein String-Array packen. Der Wochentag könnte dann als Index herhalten.
Wenn bei deiner derzeitigen Lösung keine Ausgabe erfolgt, wird der Wert von Wochentag wohl einfach nicht in der Wertemenge liegen, die du für deine Prüfungen heranziehst.
Modulo 7 hab ixh schon oben bei Jahrescode berechnen angewendet, und danke für denn denk anstoss bei dem If, mein problem ist aber noch immer das das bei if nicht das macht was ich will und auch mal nichts ausgibt