Monatslänge/ Schaltjahr (C++-Aufgaben zu "Bedingte Anweisungen")

Neue Frage »

Auf diesen Beitrag antworten »
Dragon_Fighter Monatslänge/ Schaltjahr (C++-Aufgaben zu "Bedingte Anweisungen")

Meine Frage:
Hey!

(1) Schreiben Sie ein Programm monatslaenge, das den Anwender auffordert, eine ganze Zahl zwischen 1 und 12 einzugeben, und das dann angibt, wie viele Tage der entsprechende Monat hat.
Hierbei soll die Zahl 1 für Januar mit 31 Tagen, die Zahl 2 für Februar mit 28 Tagen usw. stehen.
Falls eine Zahl eingelesen wird, die keinem Monat entspricht, soll eine entsprechende Fehlermeldung ausgegeben werden.

(2) Schreiben Sie ein Programm Schaltjahr, das eine Jaheszahl einliest und bestimmt, ob die eingegebene Jahreszahl zu einem Schaltjahr gehört.

Hinweis: Zunächst sind alle durch 4 teilbaren Jahreszahlen Schaltjahre. Ausgenommen sind lediglich die Sekulärkjahre XX00, die nicht durch 400 teilbar sind: So war weder 1800 noch 1900 ein Schaltjahr, aber 2000 schon.

Meine Ideen:
Hier meine Versuche:

Zu (i) mit switch:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
#include <iostream>
using namespace std;

int main() {

int a;

cout << "Bitte geben Sie eine ganze Zahl zwischen 1 und 12 ein (1 und 12 inklusive)." << endl;

cin >> a;

switch(a) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
cout << "Der Monat " << a << " hat 31 Tage." << endl;
break;
case 2:
cout << "Der Monat " << a << " hat 28 Tage." << endl;
break;
case 4: case 6: case 9: case 11:
cout << "Der Monat " << a << " hat 30 Tage." << endl;
break;
default:
cout << "Sie haben keine ganze Zahl zwischen 1 (inklusive) und 12 (inklusive) eingegeben!" << endl;

}

}


Bei mir funktioniert das.

Zu (ii):

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#include <iostream>
using namespace std;

int main() {

int jahr;

cout << "Bitte geben Sie eine Jahreszahl ein." << endl;
cin >> jahr;

if( ((jahr % 4 == 0) && (jahr % 100 != 0)) || ((jahr % 100 == 0) && (jahr % 400 == 0)) ) {

  cout << "Das Jahr " << jahr << " war/ ist ein Schaltjahr." << endl;
}

else {
  cout << "Das Jahr " << jahr << " war/ ist kein Schaltjahr." << endl;
}

}


Auch das ist m.E. so in Ordnung.


Dennoch hätte ich gerne zu (i) und (ii) Eure Meinung, da ich noch Anfänger bin und mich daher nicht so auf meine Meinung verlassen möchte.


Sehr viele Grüße

Dragon_Fighter
 
Auf diesen Beitrag antworten »
eulerscheZahl

Das sieht doch beides ganz vernünftig aus!
1. Könnte man auch mit einem array machen (falls ihr die schon behaldelt habt)

2.:
code:
1:
((jahr % 100 == 0) && (jahr % 400 == 0))

das ist redundant: wenn ein Jahr Vielfaches von 400 ist, so ist es auch Vielfaches von 100, das jahr%100 kannst du dir also sparen.
code:
1:
if( ((jahr % 4 == 0) && (jahr % 100 != 0)) || (jahr % 400 == 0) )
Auf diesen Beitrag antworten »
Dragon_Fighter

Hallo!

Danke,

das mit dem Array muss ich noch nach hinten schieben, das hatten wir noch nicht behandelt.

Und zu der zweiten Anmerkung von Dir: Da habe ich wohl Tomaten vor den Augen gehabt.

Aber vielleicht lasse ich die auch stehen, weil es (für mich) dann inhaltlich klarer ist.
Auf diesen Beitrag antworten »
Airblader*

Ich würde beim switch/case nicht alles ausgeben, sondern nur die Anzahl der Tage in eine Variable schreiben und diese dann zur Ausgabe nutzen. Das macht den Code lesbarer, flexibler und reduziert Code-Duplikation.
 
Auf diesen Beitrag antworten »
Airblader

So, jetzt wo ich daheim bin, kann ich auch besser sagen, was ich meinte:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
cin >> monat;

int tage;
switch( monat ) {
    case 2:
        tage = 28;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        tage = 30;
        break;
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        tage = 31;
        break;
    default:
        cout << "Ungültige Eingabe" << endl;
        return 0;
}

cout << "Der Monat " << monat << " hat " << tage << " Tage." << endl;


Allerdings ist ein switch/case hier sowieso schon eher unpraktisch, aber sicherlich die beste Variante, wenn man noch keine besseren Methoden kennt.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »