Kody źródłowe/Tablice świąt ruchomych

Z Wikibooks, biblioteki wolnych podręczników.
Tablice świąt ruchomych • Kod źródłowy
Tablice świąt ruchomych
Kod źródłowy
Poniższy kod w języku programowania C++ tworzy w bieżącym katalogu:
#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;
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);

int wielkanoc=-33+w13+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);
}


Public Domain
Ten tekst nie podlega pod prawa autorskie. Jest zatem własnością publiczną, ponieważ jego autor udostępnił go na licencji public domain.