Zum Inhalt springen

Tage eines Monats und Ermittlung eines Schaltjahrs


Empfohlene Beiträge

Geschrieben

Hallo,

ich will ein Programm schreiben welches durch Eingabe des Monats und Jahr die Anzahl der Tage ermittelt und dabei auch erkennt ob es sich um ein Schaltjahr handelt oder nicht.

Für die Umsetzung verwende ich folgenden Code aus dem Buch "C Programmieren von Anfang an":


#include <stdio.h>


main () {

     int jahr, monat, tage

     printf("\n\tK a l e n d e r\n ");

     printf("\nBitte Jahr eingeben: ");

     scanf("%i", &jahr);

     printf("\Bitte Monat 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

               breake;

              case 2*2:

              case 6:

              case 9:  case 11:

                  tage=30

                  breake;

              default:

                  tage=31;

         }

         printf("\n%i hat der Monat %i %i Tage" , jahr

                   ,monat,tage);

     }

     else

        printf("\nFalsche Datumsangaben!");

}    

Den Ablauf des Programms konnte ich soweit nachvollziehen, jedoch verstehe ich die Berechnung des Schaltjahres nicht
 if (!((jahr%100)%4) && (jahr%100) || !(jahr%400))

Es handelt sich hier um eine Verschachtelung von UND, ODER und NICHT Operatoren. Wenn ich nun für das Jahr "2012" einsetze dann bekomme ich folgende Aussagen:

falsch UND falsch ODER richtig

Wenn ich nun die Aussagen mit vergleiche komme ich auf "falsch ODER richtig" was somit "richtig" ergibt.

Da die Bedingung WAHR ist, hat der Monat Februar 29 Tage.

Wenn ich nun aber das ganze mit dem Jahr "2011" durchführe bekomme ich wieder eine Wahre Bedingung, jedoch war das Jahr 2011 kein Schaltjahr und somit hätte ich doch eine Falsche Bedingtung haben müssen und somit der Februar nur 28 Tage.

Da ich selbst noch blutiger Anfänger bin und im Buch der Code schlecht erklärt wird weiss ich nicht wo mein Fehler ist.

Vielleicht kann mir jemand von euch auf die Sprünge helfen.

ich bedanke mich schon mal im vorraus

.tomtom

Geschrieben
Wenn ich nun aber das ganze mit dem Jahr "2011" durchführe bekomme ich wieder eine Wahre Bedingung
Das stimmt nicht.

!((2011%100)%4) && (2011%100) || !(2011%400)

= !(11%4) && (11) || !(11)

= falsch und wahr oder falsch

= falsch oder falsch

= falsch

Geschrieben

Danke für die schnelle Antwort.

Ein Fehler in meinem Gedankengang ist mir aufgefallen, ich hab nicht daran gedacht dass das % eine Divisionsrest Berechnung ausführt. ich war immer bei einer Division, aber ich versteh das noch immer nicht. Ich weiss nicht ob es daran liegt das ich seit zwölf Jahren aus der Schule raus bin oder ob ich einfach nur zu blöd bin.

Im Buch steht folgendes:

Die Formulierung nutz aus, dass C den Wert 0 als falsch und alles andere als wahr interpretiert. Wenn sich also die letzten zwei Stellen der Jahreszahl (jahr%100) durch 4 teilen lassen (!(jahr%100)%4) UND das Jahr sich nicht durch hundert teilen läßt ODER es durch 400 teilbar ist (!(jahr%400), dann wird die Bedingung wahr.

Ich interpretiere es so:

!(2011%100)

=2000/100=20 Rest 11

!(11%4)

=8/4=2 Rest 3

11 ist also nicht durch 4 teilbar und somit ist die Bedingung falsch, da durch, das aber das Ausrufezeichen davor steht wird sie doch zu wahr, oder irre ich mich da jetzt.

(2011%100)

=2000/100=20 Rest 11

Die bedingung ist wahr

!(2011%400)

=2000/400=5 Rest 11

Die Bedingung ist falsch also wird sie aufgrund des ! zu wahr. Und somit habe ich doch

alles wahr.

Geschrieben

Ich danke Dir für deine Hilfe, ich weiss jetzt zumindest wie du auf "falsch" kommst. Ob ich es jedoch verstanden habe, weiss ich noch nicht so genau.

Wenn ich das jetzt am Jahr 2008 teste, sieht es bei mir wie folgt aus:

!(2008%100)%4) && (2008%100) || !(2008%400) tage=29;

(2008%100)%4) = !falsch weil der Rest 8 durch 4 teilbar ist

(2008%100) = richtig

(2008%400) = !richtig

Im Vergleich würde es dann so aussehen;

richtig && richtig || falsch

d.h. Die Bedingung ist richtig und somit ist case 2: 29 Tage

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...