Hallo,
nachdem ich vor kurzem in einer Doku gesehen habe, wie jemand blitzschnell den Wochentag eines beliebigen Datums errechnen kann habe ich mal genauer nachgeforscht wie das ganze funktioniert. Ich habe bei Wikipedia eine gute Anleitung fuer eine der verschiedenen moeglichen Methoden gefunden und mit dieser auch gleich mal ein paar Tage ausgerechnet: http://de.wikipedia.org/wiki/Wochentagsberechnung Die Ueberpruefung habe ich mit dem Kalender von http://www.ewigerkalender.de/ gemacht.
Da das ganze jedoch relativ aufwendig ist und ich sowieso ein paar freie Minuten hatte habe ich mir kurzerhand ein Hilfsprogramm gebastelt, dass die Bereitstellung von Zufallsdaten sowie die Ueberpruefung macht. Zusaetzlich gibts auch noch Statistiken ueber richtig/falsch sowie die Zeit fuer die Berechnungen.
Ich weiss nicht ob jemand anderes damit auch was anfangen kann, aber wenn jemand das ganze auch so interessant findet wie ich und es sich beibringen will kann das Hilfsprogramm durchaus interessant sein. Das ganze ist nicht besonders gut/schoen programmiert, aber ich bin ja auch kein Informatiker 😉
Hier ist der Quellcode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | // Copyright by Christoph Schwarz // // Ressources: http://de.wikipedia.org/wiki/Wochentagsberechnung // // #include <stdio.h> #include <stdio_ext.h> #include <stdlib.h> #include <time.h> struct date{ unsigned int day; unsigned int month; unsigned int year; unsigned int weekday; }; int main(int argc, char *argv[]){ time_t start, end, seedval; double timestat = 0.0; char buffer; int quit = 1; int fail = 0; int win = 0; struct date new; int MonthValues[] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5}; int decade, century, month; time(&seedval); printf("\n --- Day Calculator --- \ \n \ \n type Day or q to quit \ \n ...and have fun!!! \ \n "); srand(seedval); do{ new.year = (rand()%300)+1800; new.month = (rand()%12)+1; new.day = (rand()%28)+1; new.weekday = 0; printf("\n\n----------"); printf("\n%2i.%2i.%i",new.day, new.month, new.year); printf("\n----------\n"); time(&start); new.weekday = new.day; month = MonthValues[new.month-1]; decade = new.year%100; decade = (decade + (decade/4)); century = new.year/100; century = (3 - (century%4))*2; new.weekday = (new.day + month + decade + century); if(new.month < 3){ if((new.year % 4) == 0){ if((new.year % 100) != 0){ new.weekday -= 1; } else if((new.year % 100) == 0 && (new.year & 400) == 0){ new.weekday -= 1; } } } new.weekday = new.weekday % 7; buffer = getchar(); time(&end); __fpurge(stdin); if(buffer == 'q') quit = 0; else{ timestat += difftime(end,start); printf("Time to solve: %.1f s \n", difftime(end,start)); if(buffer == new.weekday + 48){ printf("Congratulations - you are right!"); win++; } else{ printf("Sorry - right answer is %i...", new.weekday); fail++; } } }while(quit); printf("\nEnd - your statistics: \nRight: %i \nWrong: %i \nRatio: %.2f %% \nAverage time: %.2f s \n", win, fail, ((double)win/(double)(fail+win))*100.0, (timestat/(double)(win+fail)) ); return 0; } |
Diesen Quellcode in einer Datei, z.B. main.c speichern und dann mit
1 | gcc -o main main.c |
compilieren. Die erzeuge Datei kann dann mit
1 | ./main |
aufgerufen werden.
Es wird jeweils ein Zufallsdatum erzeugt und angezeigt. Den Wochentag kann man ueber eine Zahl eingeben (0 = Sonntag, 1 = Montag, ..., 6 = Samstag). Moechte man das ganze beenden einfach q eingeben und Enter druecken. Dann bekommt man eine kurze Auswertung seiner Berechnungen.
Im Anhang ist noch ein Screenshot von dem Programm.
Viele Gruesse
Mixer