[C++]Zadania z kalendarzem, matura z informatyki – rozwiązanie

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;
 }