Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Tage eines Monats und Ermittlung eines Schaltjahrs

Empfohlene Antworten

Veröffentlicht

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

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.