Próbowałem swoich sił w jednym z zadań które kiedys pojawiło sie na maturze i gdześ mam błąd.
Zły wynik wychodzi dla lat z kalendarza gregoriańskiego czyli błąd powinien być gdzieś pod:
// Dla naszych lat:D............................................................
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 rozwiązanie(pierwsze daty-dzień miesiąca):
- w roku 1900 – 1 pkt ( 1.02.1900 - czwartek)
- w roku 1857 – 1 pkt ( 5.02.1857 – czwartek)
- w roku 1760 – 1 pkt ( 2.02.1760 - sobota)
- w roku 1624 – 1 pkt ( 2.02.1624 - piątek)
- w roku 1582 – 1 pkt ( 5.02.1582 - poniedziałek)
- w roku 1500 – 1 pkt ( 2.02.1500 - niedziela)
#include <iostream>
using namespace std;
int tyg(string n)
{int k;
if (n=="pon")k=1;else
if (n=="wt")k=2;else
if (n=="sr")k=3;else
if (n=="czw")k=4;else
if (n=="piat")k=5;else
if (n=="sob")k=6;else
if (n=="nied")k=7;else
k=8;
return k;
}
int main()
{ pocz:
string a;
cout<<"podaj dz. tygodnia:";
cin>>a;
int t,x,k; //dzien twój, dzien pomocniczy, przest.
t=tyg(a); //dzien w liczbie
if (t==8) {cout<<"\nZle podales dzien tygoodznia\n"; goto pocz;};
int rok;
cout<<"podaj rok:";
cin>>rok;
if (rok<1500 || rok>2005) {cout<<"\nZle podales rok\n"; goto pocz;};
//2 mozliwosc = 2 różne kalendarze //246 dni / 109 dni do lutego
if (rok<1583)
{
x=4; // 4 - czwartek
for(int i=0 ; i!=245 ; ++i)
{
--x;
if (x==0) x=7; //zmiana tygodznia
}
if (rok<1582)
{
for(int i=1582 ; i!=rok ; --i)
{
if (i-1%4 == 0) k=1; else k=0; //czy rok jest przestepny
//odejmowanie do lutego**************************************
if (k==0) //
{ //
for(int j=0 ; j!=365 ; ++j) //
{ //
--x; //
if (x==0) x=7; // //zmiana tygodznia
} //
} //
else //
{ //
for(int j=0 ; j!=366 ; ++j) //
{ //
--x; //
if (x==0) x=7; // //zmiana tygodznia
} //
} //
//odejmowanie do lutego**************************************
}
}
if (rok%4 == 0) k=1; else k=0;
if(k==0)
{
for (int d=1; d<=28 ; ++d)
{
if (x==8) x=1;
if (x==t) cout<<d<<"\n";
x++;
}
}
else
{
for (int d=1; d<=29 ; ++d)
{
if (x==8) x=1;
if (x==t) cout<<d<<"\n";
x++;
}
}
}
// Dla naszych lat:D............................................................
else
{
x=5;
for(int i=0 ; i!=109 ; ++i)
{
++x;
if (x==8) x=1; //zmiana tygodznia
}
if (rok>1584)
{
for(int i=1584 ; i!=rok ; ++i)
{
if (i%4 == 0 && !((i%100==0) && (i%400!=0))) k=1; else k=0; //czy rok jest przestepny
//dodawanie do lutego****************************************
if (k==0) //
{ //
for(int j=0 ; j!=365 ; ++j) //
{ //
++x; //
if (x==8) x=1; // //zmiana tygodznia
} //
} //
else //
{ //
for(int j=0 ; j!=366 ; ++j) //
{ //
++x; //
if (x==8) x=1; // //zmiana tygodznia
} //
} //
//dodawanie do lutego****************************************
}
}
if (rok%4 == 0 && !((rok%100==0) && (rok%400!=0))) k=1; else k=0;
if(k==0)
{for (int d=1; d<=28 ; ++d)
{
if (x==8) x=1;
if (x==t) cout<<d<<"\n";
x++;
}
}
else
{for (int d=1; d<=29 ; ++d)
{
if (x==8) x=1;
if (x==t) cout<<d<<"\n";
x++;
}
}
}
system("pause");
}
Przeszukałem program wielokrotnie i próbowałem różne zmiany ale nic nie wyszło.
Z góry dzięki za pomoc