Verstehe Fehler in meinem programm nicht
-
Bin noch ein Anfänger in Programmiersprachen und bin gerade dabei C zu lernen...Bin in meinem Lehrbuch auf eine Aufgabe gestoßen, die ich größtenteil gelößt habe. Leider hat sich ein Fehler in das Programm eingeschlichen, den ich nicht finden kann. Syntax ist korrekt und eigentlich sollte das Programm sauber arbeiten, jedoch gibt mir das Programm, jenachdem was ich eingebe die letzte Ausgabe nicht aus:
#include <stdio.h> main() { int year, month, day, days_febr, days_count=0; printf("Bitte geben Sie die Jahreszahl ein\n"); scanf("%i",&year); printf("\nDer wievielte Monat?\n"); scanf("%i", &month); printf("Um den wievielten Tag des Moants handelt es sich?\n"); scanf("%i", &day); if (year%4 == 0)/*Schaltjahr?*/ { if (year%100==0) { if (year%400==0) { printf("Dieses Jahr ist ein Schaltjahr"); days_febr=29; return 0; } printf("Dieses Jahr ist kein Schaltjahr"); days_febr=28; return 0; } printf("Dieses Jahr ist ein Schaltjahr"); days_febr=29; return 0; } else { printf("Dieses Jahr ist kein Schaltjahr"); days_febr=28; } for(int x=1;x<month;x++)/*Counting the days till the chosen month*/ { if(x==1||x==3||x==5||x==7||x==8||x==10||x==12) /*months with 31 days*/ { days_count=days_count+31; } else if (x==4||x==6||x==9||x==11) /*months with 30 days*/ { days_count=days_count+30; } else { days_count=days_count+days_febr; } } days_count=days_count+day; printf("\nDies ist Tag %i des Jahres", days_count); }
Aufgabe des Programms:
-Nutzer gibt Datum ein
-Überprüfung auf Schaltjahr -> jenachdem hat dadurch der Februar 29 oder 28 Tage
-Frage: der wievielte Tag ist der vom nutzer eingegebene?
->Ausgabe
-
Martin L schrieb:
... ist korrekt und eigentlich sollte das Programm sauber arbeiten, jedoch gibt mir das Programm, jenachdem was ich eingebe die letzte Ausgabe nicht aus...
Schöne Geschichte. Was willst du wissen?
-
Ich hab's mal ausgeführt:
Bitte geben Sie die Jahreszahl ein 3345 Der wievielte Monat? 65 Um den wievielten Tag des Moants handelt es sich? 46 Dieses Jahr ist kein Schaltjahr Dies ist Tag 1867 des Jahres
Welche Ausgabe hättest du jetzt stattdessen erwartet? Oder anders gesagt: Was ist überhaupt der Fehler?
-
Wo mein Fehler liegt. Ich finde den Fehler einfach nicht.
Je nachdem welches Datum ich eingebe wird die letzte Ausgabe nicht mehr ausgegeben... Die unterste printf
printf("\nDies ist Tag %i des Jahres", days_count);
-
Wenn ich zum Beispiel den 02.02.2000 eingebe klappt es nicht
-
Martin L schrieb:
Wenn ich zum Beispiel den 02.02.2000 eingebe klappt es nicht
Das ist wohl richtig, denn 2000%4 == 0 erfüllt deine Bedingung im if-Zweig genauso wie 2000%100==0 und 2000%400==0. Die Returns greifen somit und beenden dein Programm.
Das würde alles so passen, wenn du den oberen Teil in eine Funktion auslagern würdest
-
Achso.... das heißt die Returns beenden mein Programm... ok... dachte die beenden nur den if-Block. Wie kann ich es denn erreichen, dass die restlichen If-Blöcke nicht mehr ausgeführt werden (Also die oberen in der Verschachtelung) ohne den Teil auszulagern?
-
bin genauso Anfänger wie du...aber beendet sowas nicht auch
break;
falls ich mich irre, bitte ich um Aufklärung
danke schön
-
Indem du die Verschachtelung auflöst.
Ein Ansatz wäre zum Beispiel die Möglichkeit von else if:if(year%400==0) { printf("Dieses Jahr ist ein Schaltjahr"); days_febr=29; } else if(year%100==0) { printf("Dieses Jahr ist kein Schaltjahr"); days_febr=28; } else if(year%4 == 0) { printf("Dieses Jahr ist ein Schaltjahr"); days_febr=29; } else { printf("Dieses Jahr ist kein Schaltjahr"); days_febr=28; }
derUnwissende/ohneLogin schrieb:
bin genauso Anfänger wie du...aber beendet sowas nicht auch
break;
falls ich mich irre, bitte ich um Aufklärung
danke schön
break dient als Abbruchmöglichkeit für Schleifen oder bei switch-case. Bei reinen if-Bedingungen ohne die vorher genannten Kontrollstrukturen ist break undgültig.
-
Ok Manchmal sind die einfachsten Wege die besten. Hatte übersehen, dass die ersten Bedingungen automatisch gegeben sind, wenn die inneren stimmen.
Das vereinfacht das ganze natürlich...
Danke Euch von ganzem Herzen... Weiter so
!
-
Ich fine diese If anweisung ein bisschen elleganter:
if ( ( (jahr%4==0) && (jahr%100!=0) ) || (jahr%400==0) ) { /* Schaltjahr */ } else { /* kein Schaltjahr */ }