Tage eines Monats zählen



  • Hallo 🙂

    Habe folgendes Problem.

    Hab ein Programm geschrieben, das mir die Tage eines Monats zählt.
    Ich kann den Monat und das Jahr selber eingeben.
    Nur werden mir beim 1,3,5,7,8,10,12 Monat falsche Tage ausgegeben.

    Beim 2,4,6,9,11 Monat wird mir ein richtiges resultat geliefert.

    Code:

    #include <stdio.h>
    
    /*********************************************/
    /* Author mu								 */
    /* Datum  28.01.2008						 */
    /* 											 */
    /* Datei  SwitchBeispiel.c					 */
    /* Ermittelt Tagesanzahl eines Monats		 */
    /*********************************************/
    
    int main()
    {
    	int jahr, tage, monat;
    
    	printf("Tagesanzahl im Monat berechnen\n");
    	printf("\nJahr eingeben: ");
    	scanf("%i", &jahr);
    	printf("\nMonat eingeben: ");
    	scanf("%i", &monat);
    
    	if(monat >= 1 && monat <= 12 && jahr > 1582)
    	{
    		switch(monat)
    		{
    		case 2:
    			if(!((jahr % 100) % 4) && (jahr % 100) || !(jahr%400))
    				tage = 29;
    			else
    				tage = 28;
    			break;
    		case 2*2:
    		case 6:
    		case 9: case 11:
    			tage = 30;
    			break;
    		default:
    			tage = 31;
    		}
    		printf("\n%i hat der Monat %i %i Tage", jahr,monat,tage);
    	}
    	else
    	{
    		printf("\nFalsche Datumsangaben!");
    	}
    
    	return 0;
    }
    

    Bin über jede antwort dankbar



  • Bei mir liefert dein Programm (fast)immer das richtige Ergebnis.

    Du hast einen Fehler in der Schaltjahrberechnung gemacht. Wenn du
    die Klammern richtig setzt, funktioniert es auch.

    if ((!(jahr % 4)  && (jahr % 100)) || !(jahr % 400))
    

    Beachte das Klammerpaar ((!(jahr % 4 ... 100)) ...

    Übrigens:

    ((jahr % 100) % 4) == (jahr % 4)
    

    Aber warum das jetzt bei dir nicht funktioniert, weiß ich nicht.

    Gruß mcr



  • hmm, habs eben genaustens überprüft, wie es halt in meinem buch steht.

    und da stehts so

    if(!((jahr%100)%4) && (jahr%100) || !(jahr%400))
    

    strange oO



  • kPt schrieb:

    if(!((jahr%100)%4) && (jahr%100) || !(jahr%400))
    

    So ist es dann dem Compiler überlassen, die Reihenfolge festzulegen.
    Der gcc gibt sogar eine Warning, dass die Reihenfolge nicht eindeutig ist:

    a.c:26: Warnung: Klammern um && innerhalb von || empfohlen
    

    Die Frage ist, wie ist das zu interpretieren:

    !a && b || !c
    

    Es gilt:

    (!a && b) || !c   !=  !a && (b || !c)
    

    Warum in deinem Buch jetzt

    !((jahr%100)%4)
    

    steht, weiß ich
    nicht, aber es ist das selbe wie

    !(jahr%4)
    

    Gruß mcr



  • Stimmen denn deine Ergebnisse immer noch nicht?



  • dachte eigentlich immer, dass && stärker bindet als || oder? aber keine ahnung, mag auch anders sein



  • Vorden schrieb:

    dachte eigentlich immer, dass && stärker bindet als || oder? aber keine ahnung, mag auch anders sein

    Ich glaube, so sollte es auch sein, aber ich weiß es nicht genau.

    Was ich aber sagen kann: bei mir berechnet der Code, mit der einen
    geänderten Zeile, stets das richtige Ergebnis.

    Gruß mcr



  • && und and binden stärker als || und or.



  • bgdnoy schrieb:

    && und and binden stärker als || und or.

    ich sign das mal spontan 🙂

    kanns an meiner entwicklungsumgebung liegen?
    benutze eclipse cdt?
    bekomme nähmlich ne warnung, jedoch steht nicht was für eine.

    programm läuft immer noch nicht richtig. arr..



  • Funktioniert nun einwandfrei

    If-Abfrage im Buch ist falsch, oder sonst ein Fehler.
    Mit

    if ((!(jahr % 4)  && (jahr % 100)) || !(jahr % 400))
    

    funktioniert es.
    obwohl im buch steht

    if (!((jahr % 4)  && (jahr % 100)) || !(jahr % 400))
    

    danke für eure hilfe



  • Hallo Leute,
    So geht das ganze etwas übersichtlicher, diese switch case Verschachtelung ist ja wirlich nichts fürs Auge:

    1 int days_of_month(int month, int year){
      2   // Monat:           1   2   3   4   5   6   7   8   9  10  11  12
      3   char months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
      4   return month == 2 && is_leap_year(year) ? 29 : month[i];
      5 }
    


  • Naja, was fürs Auge ist sie sicher nicht.

    Aber dafür doch mal besonders kreativ

    kPT schrieb:

    case 2*2:
    		case 6:
    		case 9: case 11:
    			tage = 30;
    			break;
    

    🕶



  • toller gast, da gast verg schrieb:

    Hallo Leute,
    So geht das ganze etwas übersichtlicher, diese switch case Verschachtelung ist ja wirlich nichts fürs Auge:

    1 int days_of_month(int month, int year){
      2   // Monat:           1   2   3   4   5   6   7   8   9  10  11  12
      3   char months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
      4   return month == 2 && is_leap_year(year) ? 29 : month[i];
      5 }
    

    <error detected>
    month[i]

    <starting auto reparation routine>
    ... SUCCESS

    <showing reparation result>
    month[i] replaced by months[month]


Anmelden zum Antworten