exam5.cpp
来自「C++语言程序设计题典」· C++ 代码 · 共 125 行
CPP
125 行
#include <iostream.h>
int day_tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
//day_tab二维数组存放各月天数,第一行对应非闰年,第二行对应闰年
class Date
{
int year,month,day;
int leap(int);
int dton(Date &);
Date ntod(int);
public:
Date() {}
Date(int y,int m,int d)
{
year=y;month=m;day=d;
}
void setday(int d) { day=d; }
void setmonth(int m) { month=m; }
void setyear(int y) { year=y; }
int getday() { return day; }
int getmonth() { return month; }
int getyear() { return year; }
Date operator+(int days)
{
static Date date;
int number=dton(*this)+days;
date=ntod(number);
return date;
}
Date operator-(int days)
{
static Date date;
int number=dton(*this);
number-=days;
date=ntod(number);
return date;
}
int operator-(Date &b)
{
int days=dton(*this)-dton(b)-1;
return days;
}
void disp()
{
cout << year << "." << month << "." << day << endl;
}
};
int Date::leap(int year)
{
if (year%4==0 && year%100!=0 || year%400==0) //是闰年
return 1;
else //不是闰年
return 0;
}
int Date::dton(Date &d)
{
int y,m,days=0;
for (y=1;y<=d.year;y++)
if (leap(y))
days+=366;
else
days+=365;
for (m=0;m<d.month-1;m++)
if (leap(d.year))
days+=day_tab[1][m];
else
days+=day_tab[0][m];
days+=d.day;
return days;
}
Date Date::ntod(int n)
{
int y=1,m=1,d,rest=n,lp;
while (1)
{
if (leap(y))
{
if (rest<=366)
break;
else
rest-=366;
}
else
{
if (rest<=365)
break;
else
rest-=365;
}
y++;
}
y--;
lp=leap(y);
while (1)
{
if (lp)
{
if (rest>day_tab[1][m-1])
rest-=day_tab[1][m-1];
else
break;
}
else
{
if (rest>day_tab[0][m-1])
rest-=day_tab[0][m-1];
else
break;
}
m++;
}
d=rest;
return Date(y,m,d);
}
void main()
{
Date now(2002,6,12),then(2003,2,10);
cout << "now:";now.disp();
cout << "the:";then.disp();
cout << "相差天数:" << (then-now) << endl;
Date d1=now+100,d2=now-100;
cout << "now+100:";d1.disp();
cout << "now-100:";d2.disp();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?