Вы находитесь на странице: 1из 6

Ministerul Educaiei, Culturii i Cercetrii al Republicii

Moldova

Universitatea Tehnic a Moldovei

Facultate de Calculatoare Informatica si Microelectronica


Departamentul Ingineria Software i Automatic

Specialitate Automatica si Informatica

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)

for (int i=from; i < to; 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;
}
}
else
{
for (int i=from; i <= 12; 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;
}
}
for (int i=1; i < to; 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;
}
}
}
//
diff-=d1.Day;
diff+=d2.Day;
//
diff+=((diffyear > 1)?(diffyear - 1):(0))*365;
//
diff+=diffyear/4;
// 4
.
for (int i=d2.Year-diffyear;i<=d2.Year;i++)
{
// , 4 100,
400.
if (((i%4==0) && !(i%100==0))||(i%400==0))
{
diff+=1; break;
}
}
return diff;
}
date operator+(int days)
{

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]

Вам также может понравиться