Q:
Schreiben Sie ein Programm, um den Wochentag an einem bestimmten Datum zu bestimmen.
Fragen Sie zunächst das Datum mit
"Jahr: "
"Monat: "
"Tag: "
ab. Überprüfen Sie dessen Korrektheit (Tag und Monat im gültigen Bereich; Jahr ≥ 0) und brechen Sie bei einer fehlerhaften Eingabe sofort mit der Meldung
"Falsche Eingabe."
ab. War das eingegebene Datum in Ordnung, geben Sie den Wochentag mit
"Der xx.xx.xxxx ist ein yyyyyyy."
aus. Dabei ist xx.xx.xxxx das eingegebene Datum, beispielsweise in der Form 13.1.736, und yyyyyyy der Wochentag, z.B. Donnerstag. Geben Sie Tag, Monat und Jahr mit %d aus, d.h. als Dezimalzahl ohne vorgegebene Stellenbreite (1.1.0 und nicht 01.01.0000). Anführungszeichen sollen nicht mit ausgegeben werden.
Hinweise zur Lösung:
- Berechnen Sie zur Lösung der Aufgabe die Anzahl der Tage, die seit dem 1.1.00 vergangen sind.
- Denken Sie an die Besonderheit des Monats Februar. Er hat üblicherweise 28 Tage, in Schaltjahren aber 29.
- Ein Nichtschaltjahr hat 365 Tage, ein Schaltjahr 366 Tage.
- Wie bei allen anderen Aufgaben kann auch hier die Ausgabe von Zwischenwerten bei der Fehlersuche sehr hilfreich sein. Dazu können Sie ihr Programm zunächst ohne Moodle mit einem normalen Texteditor entwickeln und mit gcc übersetzen. Geben Sie die Anzahl der Tage aus, die seit dem 1.1.00 vergangen sind, eventuell auch noch weitere Werte. Tun Sie das aber nur am Anfang (um Fehler schneller mit Hilfe des Terminals zu finden) und entfernen Sie diese Ausgabe wieder, ehe Sie Ihre Lösung in Moodle kopieren und prüfen lassen.
- Sie werden als Teilproblem die Anzahl an Tagen in einem Monat ermitteln müssen. Dies ist natürlich über eine switch-Anweisung möglich. Um Ihnen die Arbeit zu erleichtern, können Sie aber auch ein Feld, z.B. tim (Tage im Monat) benutzen. In diesem speichern Sie zu jedem Monat die Anzahl der Tage des Monats (z.B. tim[4] = 30 für den April) ab.
- Selbiges gilt für den Namen eines Wochentags: Auch hier können Sie eine switch-Anweisung sparen, indem Sie ein Feld (z.B. w) für die Wochentags-Namen verwenden. Wenn i die Nummer des Wochentags ist (0, ..., 6) und w das Wochentags-Array, dann entspricht w[i] dem Namen des Wochentags. Dabei kann z.B. 0 der Sonntag, 1 der Montag, ... und 6 der Samstag sein. Sie können aber auch eine andere (sinnvolle) Zuordnungen wählen.
Hinweise zur Bestimmung des Schaltjahres:
- Ein Jahr, dessen Jahreszahl durch 4 teilbar ist, ist ein Schaltjahr ...
- ..., außer wenn die Jahreszahl durch 100 teilbar ist.
- Ist die Jahreszahl durch 400 teilbar, dann ist das entsprechende Jahr aber trotzdem ein Schaltjahr. (Beispielsweise ist 1900 kein Schaltjahr, 2000 ist aber ein Schaltjahr).
- Das (fiktive) Jahr 0 war kein Schaltjahr und der 01.01.00 war ein Sonntag.
Sie können bei der Eingabe des Jahres in der main-Funktion das Schaltjahr anhand dieser Regeln bestimmen und das Ergebnis in einer Variable, z.B. istSchaltjahr ablegen und diese Variable dann im weiteren Programm-Verlauf verwenden.
Alternativ, falls Sie etwas Neues ausprobieren möchten, können Sie diese Regeln in einer Funktion istSchaltjahr() zusammenfassen. (Funktionen werden erst im nächsten Arbeitsblatt besprochen.) Verwenden Sie für die Funktion das nachfolgend angegebene Grundgerüst und ersetzen Sie dabei XXX durch einen Ausdruck, der
- 0 zurückgibt, falls das als Parameter j übergebene Jahr kein Schaltjahr war bzw.
- 1 zurückgibt, falls es sich bei dem als Parameter j übergebenen Jahr um ein Schaltjahr handelt.
int istSchaltjahr(int j)
{
return XXX;
}
Diesen Code können Sie dann in ihrer Lösung zwischen der #include-Anweisung und der main-Funktion (also global) einfügen. In der main-Funktion können Sie dann die Funktion mit istSchaltjahr(j) aufrufen, wobei j das zu überprüfende Jahr darstellt. Im Falle eines Schaltjahres liefert die Funktion dann 1, sonst 0.
A:
#include<stdio.h>
int istSchaltjahr(int j)
{
return ((j!=0)&&((j%4)==0)&&(((j%100)!=0)||((j%400)==0)));
}
int main()
{
int j ,m ,t, tt, i;
int tim[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char *w[]={"Samstag","Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"};
printf("Jahr: ");
scanf("%d",&j);
if(j<0)
{
printf("Falsche Eingabe.\n" );
return 0;
}
printf("Monat: ");
scanf("%d",&m);
if(m<1||m>12)
{
printf("Falsche Eingabe.\n" );
return 0;
}
printf("Tag: ");
scanf("%d",&t);
if(t<1||t>tim[m] + (m==2 && istSchaltjahr(j)))
{
printf("Falsche Eingabe.\n" );
return 0;
}
tt=365*j;
tt+=((j-1)/4 - (j-1)/100 + (j-1)/400);
for(i=1;i<m;i++)
tt+=(tim[i]+(i==2&& istSchaltjahr(j)));
tt += t;
printf("Der %d.%d.%d ist ein %s.\n",t,m,j,w[tt%7]);
}