Академический Документы
Профессиональный Документы
Культура Документы
Moldova
Subgrupa numarul 2
RAPORT
Lucrarea de laborator nr.3
la Programare Orientata pe Obiecte
A efectuat:
st. gr. AI-161 Lescinschi Denis
A verificat:
lector univ. M.Oovschi
Chiinu 2017
3. S se creeze clasa Date data, care conine cmpurile: ziua, luna, anul. S se
defineasc operatorii "+" i "-" ca metode ale clasei, iar operatorii "++" i "--" n
ambele variante(prefix i postfix) ca funcii prietene. Operatorul "+" trebuie s
permit realizarea operaiilor numai cu variabilele de tip predefinit int (x=y+5). De
prevzut prelucrarea corect a anilor biseci.
Codul programului :
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct date
{
int Year,Month,Day;
date(){}
date(int dd, int mm, int yy):Day(dd),Month(mm),Year(yy){}
bool Less(const date &d1,const date &d2) // true and false
{
return Less(d1,d2,""); // ture d1 d2.
}
//p - ,
bool Less(const date &d1,const date &d2,char *p)
{
size_t end=strlen(p);
if (d1.Day < d2.Day && !find(p,p+end,'d'))return true;
if (d1.Year < d2.Year && !find(p,p+end,'y'))return true;
if (d1.Month < d2.Month &&!find(p,p+end,'m'))return true;
return false;
}
//
int operator-(date d2)
{
date d1(*this); //
// d2 d1 ,
// d1 d2.
if (Less(d2,d1))swap(d1,d2);
//
int diff=0;
//
int from=d1.Month, to=d2.Month;
//
int diffyear=abs(d2.Year - d1.Year);
// ,
if (diffyear==0)
date d(*this);
d.Year+=int(days/365);
int diff=0;
for (int i=Month;i < 13;i++)
{
switch(i)
{
case 1:diff+=31; break;
case 2:diff+=28; break;
case 3:diff+=31; break;
case 4:diff+=30; break;
case 5:diff+=31; break;
case 6:diff+=30; break;
case 7:diff+=31; break;
case 8:diff+=31; break;
case 9:diff+=30; break;
case 10:diff+=31; break;
case 11:diff+=30; break;
case 12:diff+=31; break;
}
}
int out_of_year=(days - int(days/365) * 365);
for (int i=1; diff < out_of_year-31; i++)
{
switch(i)
{
case 1:diff+=31; break;
case 2:diff+=28; break;
case 3:diff+=31; break;
case 4:diff+=30; break;
case 5:diff+=31; break;
case 6:diff+=30; break;
case 7:diff+=31; break;
case 8:diff+=31; break;
case 9:diff+=30; break;
case 10:diff+=31; break;
case 11:diff+=30; break;
case 12:diff+=31; break;
}
}
d.Month+= out_of_year/diff;
return d;
}
};
ostream &operator<<(ostream &out,const date &d)
{
out << d.Day << '-' << d.Month << '-' << d.Year;
return out;
}
istream &operator>>(istream &in,date &d)
{
char c;
in >> d.Day;
in >> c;
if (c=='-')
{
in >> d.Month;
in >> c;
if (c=='-') in >> d.Year;
else cout << "wrong date format, excepted '-' after month, variable is not complete\n";
}
else cout << "wrong date format, excepted '-' after days, variable is not complete\n";
return in;
}
int main()
{
date D1,D2;
cout << "Enter some date dd-mm-yy: ";
cin >> D1;
cout << "Enter some other date dd-mm-yy: ";
cin >> D2;
cout << "first date " << D1 << ", second date " << D2 << '\n';
cout << D1-D2 << " days betwin dates\n";
cout << "enter number: ";
int n;
cin >> n;
cout << "first date + " << n << " days: " << D1 + n << '\n';
return 0;
}
Bibliografie:
1. SoloLearn: Learn to Code for Free! https://www.sololearn.com/ [Accesat 24.09.2017]
2. Codifun: Game for Youth! http://codifun.com [Accesat 08.10.2017]
3. ++ http://cppstudio.com/post/8423/ [Accesat 08.10.2017]