W poprzedniej części pokazałem mniej więcej jak to wszystko można zrobić oddzielnie, warunek po warunku, których chcą od nas w zadaniu. Jako że jest to zadanie maturalne wkradnie się tu trochę pisma technicznego, które dla osób nie mających dotąd okazji się spotkać z C++/Cpp może okazać się dość niezrozumiałe. W nawiasach podam jak najlepsze w miarę mam nadzieję przejrzyste wyjaśnienia.
Gdybyśmy użyli tablic, które podałem wcześniej zostałaby okaleczona wręcz informatyka, nasza reputacja no i zdrowie egzaminatora, który by zobaczył naszą pracę. Nie oznacza to, że sposób porównania za pomocą if jest zły, no bo w końcu działa:
if(podaj[0]=='p' && podaj[1]=='i' && podaj[2]=='a' && podaj[3]=='t' && podaj[4]=='e' && podaj[5]=='k') dt=4;
Problem jest wtedy, gdy ciągi C-string ( które to mieliśmy w tablicach) mógłby mieć 1000 liter, a samych wyrazów mogłoby być 1000. Wtedy byłaby to patologia delikatnie ujmując. Dlatego też w trybie przyspieszonym przeskakujemy do biblioteki String i uprościmy sobie życie.
Tak odskakując od tematu – jeżeli zamierzasz zdawać maturę z informatyki i priorytetem jest C++ to musisz to pojąć. W lekturze, z której ja korzystam do nauki C++/Cpp biblioteka String jest ujęta w podstawie.
Teraz zamiast hasła char będziemy wpisywać string. Poprawna deklaracja będzie wyglądała następująco:
string napis; napis = "tekst"; cout<< napis;
Teraz przedstawię gotowy kod do zadania. W celu usprawnienia działania dodałem pętle
do while
, aby nasz użytkownik dostał szansę otrzymania poprawy błędnie wprowadzonej daty lub dnia.
#include <iostream>
#include <string>
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;
string podaj;
int rok;
int dt=10;
cout <<"Program wyswietlajacy wszystkie daty wypadajace w podanym z klawiaturyn dniu tygodnia w lutym wskazanego roku" <<endl;
poczatek:
cout<<"Podaj dzien: ";
cin>>podaj;
if (podaj!=poniedzialek || podaj!=wtorek || podaj!=sroda || podaj!=czwartek || podaj!=piatek || podaj!=sobota || podaj!=niedziela)
{
do cout<<"Zle wprowadzona nazwa dnia tygodnia! Jeszcze raz";
cin>>podaj;
while(podaj!=poniedzialek || podaj!=wtorek || podaj!=sroda || podaj!=czwartek || podaj!=piatek || podaj!=sobota || podaj!=niedziela);
}
cout<<"Podaj rok: ";
cin>>rok;
if(rok<=1500 || rok>=2006)
{
do cout<<"Zle wprowadzony rok! Wprowadz liczbe z przedzialu <1500,2006>";
cin>>rok;
while (rok<=1500 || rok>=2006);
}
if(podaj==poniedzialek)
dt=4;
if(podaj==wtorek)
dt=5;
if(podaj==sroda)
dt=6;
if(podaj==czwartek)
dt=0;
if(podaj==piatek)
dt=1;
if(podaj==sobota)
dt=2;
if(podaj==niedziela)
dt=3;
return 0;
}