zadanie maturalne

0

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.

0

Założenia masz opisane w zadaniu.
Nie wiem czy zdajesz sobie sprawy że dokładny opis tego co podałeś zajmie coś w okolicy godziny.
Natomiast napisanie tego od początku zajmie maks 10 minut.
W związku z czym pisz którego słowa nie rozumiesz.

0

Nie rozumiem w jaki sposób zrobił te funkcje gregoriański i juliański. Nie potrafie zrozumieć ich zasady działania i nie widze tego czego autor miał na myśli pisząc je

1

Ale co to jest w ogóle za kod? Bo wygląda koszmarnie. Za to że ktoś nie umie porównać stringa za pomocą == i nie umie używać mapy powinni od razy oblewać na maturze.
Ciekawe co autor kodu by zrobił gdyby potencjalnych słów na wejściu było 1000 i każde mogło mieć to 1000 znaków. Chciałbym to zobaczyć.
Oblałbym też od razu za użycie goto zamiast pętli.

0

Chyba że da się go uprościć żeby był bardziej zrozumiały

1

O nie, te if spowodowało, że zaczęła boleć mnie głowa.

:-D

Wywal ten kod. Natychmiast. Zapomnij, że on istniał. Przemyśl to i napisz to samemu od nowa, ale najpierw naucz się języka. Jeżeli chciałeś tylko zrozumieć ten kod, to wziąłeś sobie bardzo zły przykład.

0

Hm a widziałeś http://pl.wikipedia.org/wiki/Kalendarz_wieczny? Tamten algorytm może się przydać, sprawdzasz na jaki dzień przypadł pierwszy lutego, na tej podstawie wyznaczasz którego był określony dzień tygodnia i potem "jedziesz" dodając do daty tydzień do 28 albo 29 zależnie od tego czy rok przestępny czy też nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1