Ich soll ein C-Programm schreiben, wie viele Tage ein Monat hat, Wie siehts für Februar aus: if (jahr%400==0 || jahr%4==0 && jahr%400!=0) ... 29 else... 28?

4 Antworten

Nee, das sieht nicht gut aus. 

1900 war meine ich kein Schaltjahr, aber das rechts vom Oder würde true ergeben. Die Zahl ist durch 4 teilbar und nicht durch 400.

Woher ich das weiß:Berufserfahrung – Programmierer
Suboptimierer  17.10.2016, 18:24

...&&jahr%100!=0 müsste es glaube ich heißen.

Ich würde außerdem die Klammern setzen, damit du dich nicht immer wieder neu erinnern musst, wie die Rangfolge ist.

1

Zum Beispiel So:

void Schaltjahr(int jhr, int (*sp))
{
/*
* Wenn Jahreszahl ohne Rest durch Vier teilbar ist,
* ist die Jahreszahl ein Schaltjahr.
* Ausnahme1:
* Wenn die Jahreszahl durch 100 teilbar ist, dann
* liegt kein Schaltjahr vor(sp=0).
* Ausnahme von der Ausnahme1:
* Wenn die Jahreszahl durch 400 teilbar ist, liegt doch
* ein Schaltjahr vor(sp=1).
* Beispiel: Das Jahr 1900 ist zwar durch 100, aber nicht durch
* 400 teilbar, also kein Schaltjahr)
*/
int dsp, s1, s2, s3;
dsp = 0;
s1 = jhr % 4;
s2 = jhr % 400;
s3 = jhr % 100;
if ((s1 == 0) || (s2 == 0))
{
dsp = 1;
monlen[1] = 29;
}
if ((s2 != 0) && (s3 == 0))
{
dsp = 0;
monlen[1] = 28;
}

(*sp) = dsp;
}

Fast. Ein Jahr ist ein Schaltjahr, wenn es durch 400 Teilbar ist ODER wenn es durch 4, aber nicht durch 100 teilbar. Das ist die minimale Bedingung und abgesehen von einer Zahl hast du sie schon korrekt notiert.

Randnotiz: Bitte quetsche nicht die ganze Frage in den Titel. Das macht es schwerer zu lesen.

Vielen Dank

...

case 2:
   printf("Geben Sie das Jahr ein: ");
   scanf("%i", &jahr);
   if  (  jahr%400 == 0  ||  jahr%4 == 0  &&  jahr%100 = 0)  {
      printf("...hat 29 Tage");
   }
   else {
      printf("...hat 28 Tage");
   }
break;

...

Funktioniert so einwandfrei.

ceevee  17.10.2016, 19:24

Das ist aber falsch. Zum einen müsste die letzte Bedingung "jahr % 100 == 0" lauten (zwei mal "="), zum anderen würde diese Abfrage behaupten, dass das Jahr 2100 ein Schaltjahr ist. Und das ist verkehrt.

0