C++: Wochentag bestimmen?

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).

Woher ich das weiß:Hobby – Hobby, Studium, gebe Nachhilfe
Ezra23 
Fragesteller
 30.06.2019, 00:42

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

0
PWolff  30.06.2019, 00:46
@Ezra23

Lass mal den Inhalt der Variablen Wochentag mit ausgeben. Waa steht dort, wenn keine Ausgabe erscheint?

0

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....

  1. Benutze gleich die Monatszahlen (Juni = 6) und ändere dein switch dahingehend
  2. 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.

Woher ich das weiß:Studium / Ausbildung – Mathematik-Studium

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.