Tablice świąt ruchomych/kod
Z Wikipedii
Poniższy kod w języku programowania C++ tworzy w bieżącym katalogu:
- Plik spis.txt z kodem z którego utworzono artykuł Tablice świąt ruchomych
- Pliki 1600.txt...2100.txt z kalendarzami, takimi jak te, które kiedyś znajdowały się na końcu artykułów 1900...2004 (obecne zrobione są przez program Wikipedysta:Olafbot/OlafbotCalendar.java)
#include <stdio.h> #include <assert.h> static int dlugosci[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int czyPrzestepny(int rok) { return !(rok%4) && ((rok%100) || !(rok % 400)); } char *dzienSlownie(int przestepny,int dzien,int pelna) { static char *miesiace[13]={ "", "stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia" }; static char bufor[200]; for (int m=1;m<=12;m++) { int dlug=m==2 ? 28+przestepny : dlugosci[m]; if (dzien<=dlug) { if (pelna) sprintf(bufor,"%d %s",dzien,miesiace[m]); else sprintf(bufor,"%d",dzien); return bufor; } dzien-=dlug; } assert(0); return NULL; } void swieto(FILE *plik,FILE *spis,char *nazwa,int przestepny,int dzien,int pelnyOpis,int gwiazdka=0) { char *slownie=dzienSlownie(przestepny,dzien,1); fprintf(plik,"<tr><td>%s</td><td>%s</td></tr>\n", nazwa, slownie ); if (spis!=NULL) fprintf(spis,pelnyOpis ? "<td width=\"10%%\">%s%s</td>":"<td>%s%s</td>",slownie,gwiazdka ? "*" : ""); } void generujMiesiac(FILE *plik,int rok,int przestepny,int miesiac,int &tydzien) { static char *miesiace[13]={ "", "[[Styczeń]]", "[[Luty]]", "[[Marzec]]", "[[Kwiecień]]", "[[Maj]]", "[[Czerwiec]]", "[[Lipiec]]", "[[Sierpień]]", "[[Wrzesień]]", "[[Październik]]", "[[Listopad]]", "[[Grudzień]]" }; fprintf(plik,"<td><table border=\"1\"><caption>%s</caption><tr>\n" "<th width=\"16%%\" bgcolor=\"#D0D0FF\"></th>\n" "<th width=\"12%%\" bgcolor=\"#D0D0FF\">[[Poniedziałek|Pn]]</th>\n" "<th width=\"12%%\" bgcolor=\"#D0D0FF\">[[Wtorek|Wt]]</th>\n" "<th width=\"12%%\" bgcolor=\"#D0D0FF\">[[Środa|Śr]]</th>\n" "<th width=\"12%%\" bgcolor=\"#D0D0FF\">[[Czwartek|Cz]]</th>\n" "<th width=\"12%%\" bgcolor=\"#D0D0FF\">[[Piątek|Pt]]</th>\n" "<th width=\"12%%\" bgcolor=\"#D0D0FF\">[[Sobota|Sb]]</th>\n" "<th width=\"12%%\" bgcolor=\"#D0D0FF\">[[Niedziela|Nd]]</th>\n" "</tr>\n", miesiace[miesiac] ); int dzien=0; for (int m=1;m<miesiac;m++) dzien+=m==2 ? 28+przestepny : dlugosci[m]; int rok1=rok-1; int dzien3=rok1*365+(rok1/4)-(rok1/100)+(rok1/400)-1; int dzien2=dzien3+dzien; int dlug=miesiac==2 ? 28+przestepny : dlugosci[miesiac]; int dzienTyg=(dzien2+1)%7; int byl=0; if (miesiac!=1 && dzienTyg!=0) tydzien--; for (int d=1-dzienTyg;d<=dlug;d++) { if ((dzien2+d)%7==0) { if (byl) fprintf(plik,"</tr>\n"); fprintf(plik,"<tr><td bgcolor=\"#D0D0FF\">''%d''</td>",tydzien++); byl=1; } if (d>=1) fprintf(plik,"<td>%s</td>",dzienSlownie(przestepny,dzien+d,0)); else fprintf(plik,"<td></td>"); } fprintf(plik,"</tr>\n</table></td>\n"); } void generujRok(FILE *spis,int rok,int pelnyOpis) { char nazwaPliku[20]; sprintf(nazwaPliku,"%d.txt",rok); FILE *plik=fopen(nazwaPliku,"wt"); int przestepny=czyPrzestepny(rok); int w1=rok%19; int w2=rok/100; int w3=rok%100; int w4=w2/4; int w5=w2%4; int w6=(w2+8)/25; int w7=(w2-w6+1)/3; int w8=19*w1+w2-w4-w7+15-30*((19*w1+w2-w4-w7+15)/30); int w9=w3/4; int w10=w3%4; int w11=(32+2*w5+2*w9-w8-w10)%7; int w12=(w1+11*w8+22*w11)/451; int w13=(w8+w11-7*w12+114)/31; int w14=(w8+w11-7*w12+114)%31; int wielkanoc=-34+31*w13+w14+1+przestepny; fprintf(plik,"'''Kalendarz:'''\n\n"); fprintf(plik,"<table border=\"1\">\n"); fprintf(plik,"<tr><td>Liczba dni [[karnawał]]u</td><td>%d</td></tr>\n",wielkanoc-40); fprintf(spis,"<td align=\"center\"%s>%d</td>",pelnyOpis ? " width=\"10%%\"" : "",wielkanoc-40); swieto(plik,spis,"[[Tłusty czwartek]]",przestepny,wielkanoc-52,pelnyOpis); swieto(plik,NULL,"Ostatnia sobota [[karnawał]]u",przestepny,wielkanoc-50,pelnyOpis); swieto(plik,spis,"[[Ostatki]]",przestepny,wielkanoc-47,pelnyOpis); swieto(plik,spis,"[[Popielec]]",przestepny,wielkanoc-46,pelnyOpis); swieto(plik,spis,"[[Niedziela Palmowa]]",przestepny,wielkanoc-7,pelnyOpis); swieto(plik,NULL,"[[Wielki Czwartek]]",przestepny,wielkanoc-3,pelnyOpis); swieto(plik,NULL,"[[Wielki Piątek]]",przestepny,wielkanoc-2,pelnyOpis); swieto(plik,NULL,"[[Wielka Sobota]]",przestepny,wielkanoc-1,pelnyOpis); swieto(plik,spis,"[[Wielkanoc]]",przestepny,wielkanoc,pelnyOpis); swieto(plik,spis,"[[Wniebowstąpienie]]",przestepny,wielkanoc+(rok>=2004 ? 42 : 39),pelnyOpis,rok>=2004); swieto(plik,spis,"[[Zesłanie Ducha Świętego]]",przestepny,wielkanoc+49,pelnyOpis); swieto(plik,spis,"[[Boże Ciało]]",przestepny,wielkanoc+60,pelnyOpis); fprintf(plik,"</table>\n\n"); int tydzien=1; fprintf(plik,"<table border=\"0\"><tr>"); generujMiesiac(plik,rok,przestepny,1,tydzien); generujMiesiac(plik,rok,przestepny,2,tydzien); generujMiesiac(plik,rok,przestepny,3,tydzien); fprintf(plik,"</tr>\n<tr>"); generujMiesiac(plik,rok,przestepny,4,tydzien); generujMiesiac(plik,rok,przestepny,5,tydzien); generujMiesiac(plik,rok,przestepny,6,tydzien); fprintf(plik,"</tr>\n<tr>"); generujMiesiac(plik,rok,przestepny,7,tydzien); generujMiesiac(plik,rok,przestepny,8,tydzien); generujMiesiac(plik,rok,przestepny,9,tydzien); fprintf(plik,"</tr>\n<tr>"); generujMiesiac(plik,rok,przestepny,10,tydzien); generujMiesiac(plik,rok,przestepny,11,tydzien); generujMiesiac(plik,rok,przestepny,12,tydzien); fprintf(plik,"</tr></table>\n[[%d|Poprzedni rok]] [[%d|Następny rok]] [[%d|Sto lat wstecz]]",rok-1,rok+1,rok-100); fprintf(plik,rok<=1904 ? " [[%d|Sto lat do przodu]]\n\n" : "\n\n",rok+100); fclose(plik); } void main() { FILE *spis=fopen("spis.txt","wt"); for (int rok=2100;rok>=1600;rok--) { int pelny=rok%100==0 && rok>1600; if (pelny) { if (rok!=2100) fprintf(spis,"</table>\n"); fprintf(spis, "<table border=\"2\">\n" "<tr><th width=\"10%%\">Rok</th>\n" "<th width=\"10%%\">Liczba dni [[karnawał]]u</th>\n" "<th width=\"10%%\">[[Tłusty czwartek]]</th>\n" //"<th>Ostatnia sobota [[karnawał]]u</th>\n" "<th width=\"10%%\">[[Ostatki]]</th>\n" "<th width=\"10%%\">[[Popielec]]</th>\n" "<th width=\"10%%\">[[Niedziela Palmowa]]</th>\n" /*"<th>[[Wielki Czwartek]]</th>\n" "<th>[[Wielki Piątek]]</th>\n" "<th>[[Wielka Sobota]]</th>\n"*/ "<th width=\"10%%\">[[Wielkanoc]]</th>\n" "<th width=\"10%%\">[[Wniebowstąpienie|Wniebo-wstąpienie]]</th>\n" "<th width=\"10%%\">[[Zesłanie Ducha Świętego]]</th>\n" "<th width=\"10%%\">[[Boże Ciało]]</th></tr>\n"); } fprintf(spis,"<tr><td align=\"center\"%s>[[%d]]</td>",/*pelny ? " width=\"10%%\"" : */"",rok); generujRok(spis,rok,false/*pelny*/); fprintf(spis,"</tr>\n"); } fprintf(spis,"</table>\n"); fclose(spis); }