Witam przegladałem sobie matury z informatyki w internecie i trafiłem na rozwiazanie zadania Kalendarz z 2006 roku ale nie potrafie zrozumieć działania programu z tymi odliczeniami,działaniami itp.
Treść zadania:
Według kalendarza juliańskiego wprowadzonego przez Juliusza Cezara od roku 45 p.n.e., każdy rok nieprzestępny trwał 365 dni, a rok przestępny przypadający dokładnie co 4 lata trwał 366 dni.
Ustalenia te spowodowały, że na każde 128 lat pojawiała się różnica jednego dnia pomiędzy tym kalendarzem a kalendarzem astronomicznym. Aby zlikwidować narastający błąd, w roku 1582 zastąpiono kalendarz juliański kalendarzem gregoriańskim. Nowy kalendarz obowiązuje od 4 października 1582 roku, kiedy po czwartku
4 października 1582 nastąpił piątek 15 października 1582 r.
Latami przestępnymi w kalendarzu juliańskim były wszystkie te lata, które dzieliły się bez reszty przez 4.
Według kalendarza gregoriańskiego latami przestępnymi są te, które dzielą się bez reszty przez 4, z wyjątkiem tych, które dzielą się bez reszty przez 100, a nie dzielą się bez reszty przez 400.
a) Napisz program, który uwzględniając powyższy opis, wyświetli wszystkie daty wypadające w podanym
z klawiatury dniu tygodnia w lutym wskazanego roku.
Rok powinien być liczbą naturalną z przedziału <1500, 2005>.
Przykładowe okno dialogowo-wynikowe:
podaj dzień tygodnia: wtorek
podaj rok: 2000
Odp:
01.02.2000
08.02.2000
15.02.2000
22.02.2000
29.02.2000
Dane wejściowe:
• dzień tygodnia „podany z klawiatury” jako tekst (pisany bez polskich liter i spacji);
• rok „podany z klawiatury”.
Program powinien wyświetlić komunikat o błędnie wprowadzonym dniu tygodnia oraz błędnie wprowadzonym roku.
#include <iostream>
#include <conio.h>
using namespace std;
int miesiace[]={31,28,31,30,31,30,31,31,30,31,30,31};
void julianski(int rok, int dzien)
{
int odlicz=1582, miesiac=9, dM=5, dT=4;
while(odlicz!=rok-1)
{
if(dT==0)
dT=6;
else
dT--;
if(odlicz%4==0&&miesiac==2)
{
if(dM==1)
{
dM=29;
miesiac=1;
}
else
dM--;
}
else
{
if(dM==1)
{
if(miesiac==0)
{
odlicz--;
miesiac=11;
}
else
miesiac--;
dM=miesiace[miesiac];
}
else
dM--;
}
if(odlicz==rok&&miesiac==1&&dT==dzien)
cout<<dM<<".02."<<rok<<endl;
}
}
void gregorianski(int rok, int dzien)
{
int odlicz=1582, miesiac=9, dM=14, dT=3;
while(odlicz!=rok+1)
{
dT=(dT+1)%7;
if(odlicz%4==0&&odlicz!=1700&&odlicz!=1800&&odlicz!=1900&&miesiac==1)
{
if(miesiac==1)
{
if(dM==29)
{
dM=1;
miesiac=2;
}
else
dM++;
}
}
else
{
if(dM==miesiace[miesiac])
{
dM=1;
if(miesiac==11)
{
odlicz++;
miesiac=0;
}
else
miesiac++;
}
else
dM++;
}
if(odlicz==rok&&miesiac==1&&dT==dzien)
cout<<dM<<".02."<<rok<<endl;
}
}
int main()
{
int rok1, d=0;
char podaj[20];
int rok;
int dt=10;
cout <<"Program wyswietlajacy wszystkie daty wypadajace w podanym z klawiatury" <<endl << "dniu tygodnia w lutym wskazanego roku" <<endl;
poczatek:
cout<<"Podaj dzien: ";
cin>>podaj;
cout<<"Podaj rok: ";
cin>>rok;
if(podaj[0]=='p' && podaj[1]=='i' && podaj[2]=='a' && podaj[3]=='t' && podaj[4]=='e' && podaj[5]=='k')
dt=4;
if(podaj[0]=='P' && podaj[1]=='I' && podaj[2]=='A' && podaj[3]=='T' && podaj[4]=='E' && podaj[5]=='K')
dt=4;
if(podaj[0]=='s' && podaj[1]=='o' && podaj[2]=='b' && podaj[3]=='o' && podaj[4]=='t' && podaj[5]=='a')
dt=5;
if(podaj[0]=='S' && podaj[1]=='O' && podaj[2]=='B' && podaj[3]=='O' && podaj[4]=='T' && podaj[5]=='A')
dt=5;
if(podaj[0]=='n' && podaj[1]=='i' && podaj[2]=='e' && podaj[3]=='d' && podaj[4]=='z' && podaj[5]=='i' && podaj[6]=='e' && podaj[7]=='l' && podaj[8]=='a')
dt=6;
if(podaj[0]=='N' && podaj[1]=='I' && podaj[2]=='E' && podaj[3]=='D' && podaj[4]=='Z' && podaj[5]=='I' && podaj[6]=='E' && podaj[7]=='L' && podaj[8]=='A')
dt=6;
if(podaj[0]=='p' && podaj[1]=='o' && podaj[2]=='n' && podaj[3]=='i' && podaj[4]=='e' && podaj[5]=='d' && podaj[6]=='z' && podaj[7]=='i' && podaj[8]=='a' && podaj[9]=='l' && podaj[10]=='e' && podaj[11]=='k')
dt=0;
if(podaj[0]=='P' && podaj[1]=='O' && podaj[2]=='N' && podaj[3]=='I' && podaj[4]=='E' && podaj[5]=='D' && podaj[6]=='Z' && podaj[7]=='I' && podaj[8]=='A' && podaj[9]=='L' && podaj[10]=='E' && podaj[11]=='K')
dt=0;
if(podaj[0]=='w' && podaj[1]=='t' && podaj[2]=='o' && podaj[3]=='r' && podaj[4]=='e' && podaj[5]=='k')
dt=1;
if(podaj[0]=='W' && podaj[1]=='T' && podaj[2]=='O' && podaj[3]=='R' && podaj[4]=='E' && podaj[5]=='K')
dt=1;
if(podaj[0]=='s' && podaj[1]=='r' && podaj[2]=='o' && podaj[3]=='d' && podaj[4]=='a')
dt=2;
if(podaj[0]=='S' && podaj[1]=='R' && podaj[2]=='O' && podaj[3]=='D' && podaj[4]=='A')
dt=2;
if(podaj[0]=='c' && podaj[1]=='z' && podaj[2]=='w' && podaj[3]=='a' && podaj[4]=='r' && podaj[5]=='t' && podaj[6]=='e' && podaj[7]=='k')
dt=3;
if(podaj[0]=='C' && podaj[1]=='Z' && podaj[2]=='W' && podaj[3]=='A' && podaj[4]=='R' && podaj[5]=='T' && podaj[6]=='E' && podaj[7]=='K')
dt=3;
if(dt==10)
{
cout <<"Zle podales dzien tygodnia"<<endl;
goto poczatek;
}
if(rok >=1500 && rok<=1582)
julianski(rok, dt);
else
if(rok>=1582 && rok <=2005)
gregorianski(rok, dt);
else
{
cout << "Podaj rok z zakresu <1500, 2005>"<<endl;
goto poczatek;
}
getch();
return 0;
}
Jesli by ktoś mógł opisać jego dokładne działanie(krok po kroku) lub załozenia byłbym wdzięczny.