Switch Case Schaltjahr Fehler?

doprakos

Newbie
Registriert
Nov. 2017
Beiträge
5
Guten Tag hab mich jetzt extra hier registriert :D unzdwar haben wir als Aufgabe ein Schaltjahr mit einer Switch case Anweisung zu bauen.

Folgendes ist mein Quellcode:

#include <iostream>
using namespace std;
int main()
{
char jahr;
int ausgabe;

cout<<"********SCHALTJAHR***********"<<endl;
cout<<"BITTE JAHR EINGEBEN!"<<endl;
cin >>jahr;
switch (jahr)
{
case (jahr%4==0):
cout<<"Schaltjahr"<<endl;
break;
case (jahr%400==0):
cout<<"Schaltjahr"<<endl;
case (jahr%100==0):
cout<<"kein schaltjahr"<<endl;

default:cout<<"Kein Schaltjahr";
break;
}
}


Der Fehler ist, dass er die case's nicht erkennt Allerdings soll er doch wenn die Eingabe durch dieses Szenario dieses Tun(hoffe man kann das ein wenig verstehen...)

Wäre Nett um Hilfe da ich im Internet nichts in diesen Fall geholfen hab. Eine Lösung wäre ebenfalls Nett das ich, dass Nachvollziehen kann.

Vielen Dank schonmal an alle.
 
Was meinst du mit "er erkennt sie nicht"?

Übrigens: Die case-Fälle sind alle hinfällig, weil immer der erste oder der default greifen wird. Denn wenn theoretisch die Fälle 400 % 0 und 100 % 0 greifen würden, wird vorher IMMER der erste Fall greifen, denn jede durch 100 oder 400 teilbare Zahl ist auch durch 4 teilbar.

Außerdem fehlt beim zweiten und dritten case das break.
 
Naja er zeigt mir immer ein Error beim ersten Case. Ich möchte halt das wenn die Zahl % 4 == 0 ist er dieses Case ausführt was aber nicht funktioniert.

Danke übrigens!
 
Ich bin mit C und C++ nicht besonders fit, aber wenn ich das richtig sehe, ist dein Jahr ist vom Typ "char", das ist ein String-Typ, mit dem kannst du nicht rechnen, den musst du erst in einen Zahlen-Typ casten.

Außerdem sind deine Bedingungen glaube ich falsch, schau mal hier: http://de.howto.wikia.com/wiki/Schaltjahre_erkennen

Deine Bedingungen sagen, dass es ein Schaltjahr ist, wenn das Jahr durch 4 teilbar ist, aber es ist nur dann ein Schaltjahr, wenn es:

- durch 4 teilbar ist, außer:
- das Jahr ist auch durch 100 teilbar, dann ist es kein Schaltjahr, außer:
- das Jahr ist auch durch 400 teilbar, dann wiederum ist es ein Schaltjahr.

Beispiel:

- 1996 war ein Schaltjahr, denn es ist durch 4 teilbar, aber nicht durch 100
- 1900 war kein Schaltjahr, denn es ist zwar durch 4 teilbar, aber auch durch 100 und nicht durch 400
- 2000 war ein Schaltjahr, denn es ist durch 4, 100 und 400 teilbar
 
Zuletzt bearbeitet:
habs jetzt umgebaut..

#include <iostream>
using namespace std;
int main()
{
char jahr;
int ausgabe;
cout<<"********SCHALTJAHR***********"<<endl;
cout<<"BITTE JAHR EINGEBEN!"<<endl;
cin >>jahr;
switch (jahr)
{
case (1):
jahr%4==0;
cout<<"Schaltjahr"<<endl;
break;
case (2):
jahr%400==0;
cout<<"Schaltjahr"<<endl;
break;
case (3):
jahr%100==0;
cout<<"Kein Schaltjahr"<<endl;
break;

default:cout<<"Kein Schaltjahr";
break;
}
}


Nun funktioniert der Quelltext allerdings gibt er IMMER kein schaltjahr aus.

Ein Jahr ist ein Schaltjahr, wenn die Jahreszahl restlos durch 4 teilbar ist.
Ein Jahr ist kein Schaltjahr, wenn es durch 4 und 100 restlos teilbar ist.
Ein Jahr ist ein Schaltjahr, wenn es sowohl durch 4, durch 100 und durch 400 teilbar ist.

Das sind die Regeln hab ich was falsch gemacht?
Ergänzung ()

Danke hab ich gemacht hat allerdings meinen Fehler noch nicht behoben.



Also ok der Fehler ist das ich es deklariert hab wenn 1,2 oder 3 eingegeben werden, wie mach ich das denn das er bezug auf die Rechnungen (siehe oben) nimmt?
 
Warum müsst ihr das auch mit switch machen, das ist dafür völlig ungeeignet...

die cases könnten so aussehen:

case ( jahr % 4 == 0 && jahr % 100 != 0 ):
// schaltjahr

case (jahr % 4 == 0 && jahr % 400 == 0):
// schaltjahr

default:
// kein Schaltjahr

Breaks und Ausgabe musst du selber einbauen. Das "&&" ist eine logische AND-Verknüpfung, ich weiß nicht mehr, ob die bei C / C++ genauso aussieht, musste mal schauen.

Und jetzt eine kleine Aufgabe für dich: Du erklärst mir, warum die Cases genau so aufgebaut sind bzw. warum genau diese Prüfungen drin sind. Z. B.: warum fehlt die Prüfung auf "% 100" im zweiten Case?

Edit: Mmmh, mir fällt gerade auf, dass das eher if-Fälle wären, diese Bedingungen müssten ja in das switch... Das ist doof. Bah, wie gesagt, switch ist meiner Meinung nach totaler Mist dafür.

Muss jetzt leider erstmal los.

Man könnte z. B. "switch(true)" nehmen (bzw. das entsprechende C-Äquivalent für "true", falls das dort anders sein sollte, vielleicht müsste man auch "switch(1)" nehmen). Aber hübsch ist das nicht...
 
Zuletzt bearbeitet:
Muss das ein switch case sein? Es gibt ja eigentlich nur zwei Fälle: Schaltjahr oder halt nicht.

Code:
Ein Jahr ist ein Schaltjahr, wenn die Jahreszahl restlos durch 4 teilbar ist.
Ein Jahr ist kein Schaltjahr, wenn es durch 4 und 100 restlos teilbar ist.
Ein Jahr ist ein Schaltjahr, wenn es sowohl durch 4, durch 100 und durch 400 teilbar ist.

Denke die Aufgabe ist eher die Logik darin zu verknüpfen:

In einer Zeile:
Code:
return ((Jahr%4==0 && Jahr%100!=0) || (Jahr%4 == 0 && Jahr%100 == 0 && Jahr%400 == 0))


Oder zb so:
Code:
bool schaltjahr(int Jahr)
if (Jahr%4 ==0)
{
    if (Jahr%100 ==0)
   {
        if (Jahr%400==0)
       {
             return true
       }
       return false
    }
    return true
}
return false
 
Zuletzt bearbeitet von einem Moderator:
Danke für die Antwort leider muss es ein Switch case sein.
Vielleicht kann ich es von deiner irgendwie ableiten.

Meiner sagt mir den fehler bei: case (jahr%4==0): (ERROR: jahr cannot appear in a constant-expression)


Mit if else hab ich es schon hinbekommen.
 
edit: zu viele Denkfehler
 
Zuletzt bearbeitet von einem Moderator:
doprakos schrieb:
Danke für die Antwort leider muss es ein Switch case sein.
Vielleicht kann ich es von deiner irgendwie ableiten.

Meiner sagt mir den fehler bei: case (jahr%4==0): (ERROR: jahr cannot appear in a constant-expression)


Mit if else hab ich es schon hinbekommen.


Ok. Dann einfach:

Case ((Jahr%4==0 && Jahr%100!=0)) || (Jahr%4 == 0 && Jahr%100 == 0 && Jahr%400 == 0)):
return true
default:
return false

Musst halt nur noch in deine Programmiersprache übersetzen.
 
doprakos schrieb:
Danke euch allen ich glaub ich habs verstanden versuche es mal umzusetzten^^

So geht es:
Code:
#include<stdio.h>

int main() 
{
    int year=2017;

    int leapYear = ((year%4==0 && year%100!=0) || (year%4 == 0 && year%100 == 0 && year%400 == 0));

    switch(leapYear) 
    {
	    case 1: printf("Es ist ein Schaltjahr.\n"); break;
	    default: printf("Es ist kein Schaltjahr.\n"); break;
    }
}
 
Dabei ist die Switch-Anweisung allerdings auch alles andere als sinnvoll :rolleyes: Aber die lässt sich eben nicht wirklich sinnvoll dafür verwenden.
 
Zumindest in C muss der Ausdruck nach case konstant sein, also man darf darin nicht herumrechnen. Aber gut möglich, dass das in C++ anders ist.
 

Ähnliche Themen

Zurück
Oben