设计一个日期类Date,包括年、月、日等私有成员。要求实现日期的基本运算,例如某日期加上天数或减去天数
2012-12-20 22:05
1286 查看
/*设计一个日期类Date,包括年、月、日等私有成员。要求实现日期的基本运算,例如某日期加上天数或减去天数
,两日期相减的天数等。
实现要求:
实现运算符加与减的重载
设计一个日期类Date,包括年、月、日等私有成员。要求实现日期的基本运算,例如某日期加上天数或减去天数,
两日期相减的天数等。
实现要求:
实现运算符加与减的重载
设计一个时间类,要求能够在时间类上实行以分钟为单位的加减运算,同时当分钟增或减的变化应体现日期变化。
如:2012年11月28日12:10PM 增加12小时后,应变为2012年11月29日00:10AM
*/
#include <iostream>
#include <time.h>
using namespace std;
bool prime(int year);
class Date
{
protected:
int year;
int mouth;
int day;
int mouths[12];
public:
Date();
void setDate();
void output();
Date operator +(Date D);
int operator -(Date D);
Date operator +(int D);
Date operator -(int D);
};
class Time :public Date
{
int hour;
int minute;
public :
void setTime();
void output();
Time operator + (int T);
Time operator - (int T);
Time daojishi ();
};
void Time::setTime()
{
cout<<"请输入时间(如 2011 11 23 12 33)"<<endl;
cin>>year>>mouth>>day;
cin>>hour>>minute;
}
void Time::output()
{
cout<<year<<"/"<<mouth<<"/"<<day<<" "<<hour<<":"<<minute<<endl;
}
Time Time::operator + (int T) //时间加上分钟数
{
Time TT;
int num1=0,sum0=0,sum1=0;
num1=T/60; //num1小时数
T=T%60;
sum1=T+minute;
if(sum1>=60)
{
hour++;
sum1=sum1-60;
}
sum0=hour+num1;
while(sum0>=24) //想家小时>24小时,则天数加1
{
day++;
sum0=sum0-24;
}
while(day>mouths[(mouth-1)%12]) //如果天数加起来大于该月的天数,则天数减去该月的天数,月份加1
{
if(prime(year+mouth/12))
mouths[1]=29;
else
mouths[1]=28;
day=day-mouths[mouth-1];
mouth++;
}
while(mouth>=12) //加起来的月份大于12,则月份减去12,年份加1
{
year++;
mouth=mouth-12;
}
TT.hour=sum0;
TT.minute=sum1;
TT.day=day;
TT.mouth=mouth;
TT.year=year;
return TT;
}
Time Time::operator - (int T) //时间减去分钟数
{
Time TT;
int num1=0,sum0=0,sum1=0;
sum0=hour*60+minute;
if(sum0>=T)
{
num1=T/60;
T=sum0-T;
T=T%60;
sum0=hour-num1;
TT.day=day;
TT.mouth=mouth;
TT.year=year;
TT.hour=sum0;
TT.minute=T;
return TT;
}
else
{
while(sum0<T) //减去分钟所表示的天数
{
day--;
sum0=sum0+24*60;
}
sum0=sum0-T; //剩余总分钟数
T=sum0/60; //剩余小时数
sum0=sum0%60; //剩余分钟数
while(day<=0)
{
if(prime(year+mouth/12))
mouths[1]=29;
else
mouths[1]=28;
mouth--;
day=day+mouths[(mouth-1+12)%12];
}
while(mouth<1)
{
year--;
mouth=mouth+12;
}
TT.day=day;
TT.mouth=mouth;
TT.year=year;
TT.hour=T;
TT.minute=sum0;
}
return TT;
}
Time Time::daojishi() //倒计时
{
Time T1,T2,TT;Date D1,D2;
int num0=0,num1=0,num2=0,num_day=0;
T1.setTime(); //当前时间
T2.setTime(); //未来时间
D1=T1;D2=T2;
num_day=D2-D1;
num0=T1.hour*60+T1.minute; // 当前时间一天多出来的分钟数
num1=T2.hour*60+T2.minute; //未来时间一天多出来的分钟数
if(num1>=num0)
{
num1=num1-num0;
}
else
{
num1=num1+24*60-num0;
num_day--;
}
hour=num1/60; //num0小时数
minute=num1%60; //多出来的分钟数
int i=60;
while(num_day!=0||hour!=0||minute!=0)
{
while(num_day>=0)
{
hour=23;
while(hour>=0)
{ minute=59;
while(minute>=0)
{ i=60;
while(i>0)
{
cout<<num_day<<"/"<<hour<<"/"<<minute<<" "<<--i;
system("cls");
}
minute--;
}
hour--;
}
num_day--;
}
}
return TT;
}
void Date::setDate()
{
cin>>year>>mouth>>day;
}
void Date::output()
{
cout<<year<<"/"<<mouth<<"/"<<day<<endl;
}
Date::Date()
{
for(int i=0;i<12;i++)
if(i==0||i==2||i==4||i==6||i==7||i==9||i==11)
mouths[i]=31;
else
mouths[i]=30;
mouths[1]=28;
}
Date Date::operator +(Date D) //日期相加
{
Date DD;
int sum_day0=D.day,sum_day1=day,sum_day=0;
while(D.mouth--)
{
if(D.mouth!=0)
sum_day0=D.mouths[D.mouth-1]+sum_day0;
else
sum_day0=sum_day0;
}
while(mouth--)
{
if(mouth!=0)
sum_day1=sum_day1+mouths[mouth-1];
else
sum_day1=sum_day1;
}
sum_day=sum_day0+sum_day1;
if(prime(year+D.year))
{
if(sum_day>=366)
{
DD.year=D.year+year+1;
sum_day=sum_day-366;
}
else
DD.year=D.year+year;
}
else
{
if(sum_day>=365)
{
DD.year=D.year+year+1;
sum_day=sum_day-366;
}
else
DD.year=D.year+year;
}
if(prime(DD.year))
mouths[1]=29;
for(int i=0;sum_day>=mouths[i];i++)
{
sum_day=sum_day-mouths[i];
}
DD.mouth=i+1;
DD.day=sum_day;
return DD;
}
int Date::operator -(Date D) //日期相减
{
Date DD; //D被减日期
int sum_day0=D.day,sum_day1=day,sum_day=0;
int year0=D.year;
while(D.year<year)
{
if(prime(D.year))
sum_day1=sum_day1+366;
else
sum_day1=sum_day1+365;
D.year++;
}
while(mouth--) //减的日期
{
if(prime(year))
mouths[1]=29;
else
mouths[1]=28;
if(mouth!=0)
sum_day1=sum_day1+mouths[mouth-1];
else
sum_day1=sum_day1;
}
while(D.mouth--) //被减日期
{
if(prime(year0))
D.mouths[1]=29;
else
D.mouths[1]=28;
if(D.mouth!=0)
sum_day0=D.mouths[D.mouth-1]+sum_day0;
else
sum_day0=sum_day0;
}
return sum_day1-sum_day0;
}
Date Date::operator +(int D) //日期加天数
{
Date DD;
int sum_day0=day,year_day=0,sum_day=0;
while(mouth--)
{
if(prime(year))
mouths[1]=29;
if(mouth!=0)
sum_day0=sum_day0+mouths[mouth-1];
else
sum_day0=sum_day0;
}
sum_day=sum_day0+D;
if(prime(year))
year_day=366;
else
year_day=365;
while(sum_day>=year_day)
{
if(prime(year))
{
mouths[1]=29;
sum_day=sum_day-366;
}
else
{
mouths[1]=28;
sum_day=sum_day-365;
}
year++;
if(prime(year))
year_day=366;
else
year_day=365;
}
if(prime(year))
mouths[1]=29;
for(int i=0;sum_day>mouths[i];i++)
sum_day=sum_day-mouths[i];
DD.year=year;
DD.mouth=i+1;
DD.day=sum_day;
return DD;
}
Date Date::operator -(int D) //日期减天数
{
Date DD;
int sum_day0=day,year_day=0,sum_day=0;
if(prime(year))
mouths[1]=29;
while(mouth--)
{
if(mouth!=0)
sum_day0=sum_day0+mouths[mouth-1];
else
sum_day0=sum_day0;
}
if(sum_day0>=D)
{
if(prime(year))
mouths[1]=29;
sum_day=sum_day0-D;
for(int i=0;sum_day>mouths[i];i++)
sum_day=sum_day-mouths[i];
DD.year=year;
DD.mouth=i+1;
DD.day=sum_day;
return DD;
}
else
{
while(sum_day0<D)
{
if(prime(--year))
{
sum_day0=sum_day0+366;
}
else
sum_day0=sum_day0+365;
}
sum_day=sum_day0-D;
if(prime(year))
mouths[1]=29;
else
mouths[1]=28;
for(int i=0;sum_day>mouths[i];i++)
sum_day=sum_day-mouths[i];
DD.year=year;
DD.mouth=i+1;
DD.day=sum_day;
return DD;
}
}
bool prime(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)
return true;
else
return false;
}
void show()
{
cout<<" 1.两日期相加 2.两日期相减"<<endl;
cout<<" 3.日期加天数 4.日期减天数"<<endl;
cout<<" 5.日期加去分钟数 6.日期减去分钟数"<<endl;
cout<<" 7.清屏 8.退出"<<endl;
}
int main()
{
Date D1,D2,DD;
Time T1,T2,TT;
char ch='Y';
int d1,d2,t1,t2,i;
system("color 71");
cout<<" 1.两日期相加 2.两日期相减"<<endl;
cout<<" 3.日期加天数 4.日期减天数"<<endl;
cout<<" 5.日期加去分钟数 6.日期减去分钟数"<<endl;
cout<<" 7.清屏 8.退出"<<endl;
cout<<" 9.倒计时 "<<endl;
while(ch=='Y')
{
cout<<"请选择需要操作的选项:";cin>>i;
switch(i)
{
case 1:D1.setDate();D2.setDate();DD=D1+D2;DD.output();break;
case 2:D1.setDate();D2.setDate();d2=D1-D2;cout<<d2<<endl;break;
case 3:D1.setDate();cout<<"请输入增加的天数:";cin>>d1;DD=D1+d1;DD.output();break;
case 4:D1.setDate();cout<<"请输入减少的天数:";cin>>d2;DD=D1-d2;DD.output();break;
case 5:T1.setTime();cout<<"请输入增加的分钟数:";cin>>t1;TT=T1+t1;TT.output();break;
case 6:T1.setTime();cout<<"请输入减少的分钟数:";cin>>t2;TT=T1-t2;TT.output();break;
case 7:system("cls");show();break;
case 8:ch='N';break;
case 9:T1.daojishi();break;
}
cout<<endl;
}
return 0;
}
/*
1
2000 1 20
2000 1 20
2
2012 11 28
2000 1 20
2012 12 12
2011 11 11
2012 12 31 23 50
310
2013 1 1 5 0
310
*/
,两日期相减的天数等。
实现要求:
实现运算符加与减的重载
设计一个日期类Date,包括年、月、日等私有成员。要求实现日期的基本运算,例如某日期加上天数或减去天数,
两日期相减的天数等。
实现要求:
实现运算符加与减的重载
设计一个时间类,要求能够在时间类上实行以分钟为单位的加减运算,同时当分钟增或减的变化应体现日期变化。
如:2012年11月28日12:10PM 增加12小时后,应变为2012年11月29日00:10AM
*/
#include <iostream>
#include <time.h>
using namespace std;
bool prime(int year);
class Date
{
protected:
int year;
int mouth;
int day;
int mouths[12];
public:
Date();
void setDate();
void output();
Date operator +(Date D);
int operator -(Date D);
Date operator +(int D);
Date operator -(int D);
};
class Time :public Date
{
int hour;
int minute;
public :
void setTime();
void output();
Time operator + (int T);
Time operator - (int T);
Time daojishi ();
};
void Time::setTime()
{
cout<<"请输入时间(如 2011 11 23 12 33)"<<endl;
cin>>year>>mouth>>day;
cin>>hour>>minute;
}
void Time::output()
{
cout<<year<<"/"<<mouth<<"/"<<day<<" "<<hour<<":"<<minute<<endl;
}
Time Time::operator + (int T) //时间加上分钟数
{
Time TT;
int num1=0,sum0=0,sum1=0;
num1=T/60; //num1小时数
T=T%60;
sum1=T+minute;
if(sum1>=60)
{
hour++;
sum1=sum1-60;
}
sum0=hour+num1;
while(sum0>=24) //想家小时>24小时,则天数加1
{
day++;
sum0=sum0-24;
}
while(day>mouths[(mouth-1)%12]) //如果天数加起来大于该月的天数,则天数减去该月的天数,月份加1
{
if(prime(year+mouth/12))
mouths[1]=29;
else
mouths[1]=28;
day=day-mouths[mouth-1];
mouth++;
}
while(mouth>=12) //加起来的月份大于12,则月份减去12,年份加1
{
year++;
mouth=mouth-12;
}
TT.hour=sum0;
TT.minute=sum1;
TT.day=day;
TT.mouth=mouth;
TT.year=year;
return TT;
}
Time Time::operator - (int T) //时间减去分钟数
{
Time TT;
int num1=0,sum0=0,sum1=0;
sum0=hour*60+minute;
if(sum0>=T)
{
num1=T/60;
T=sum0-T;
T=T%60;
sum0=hour-num1;
TT.day=day;
TT.mouth=mouth;
TT.year=year;
TT.hour=sum0;
TT.minute=T;
return TT;
}
else
{
while(sum0<T) //减去分钟所表示的天数
{
day--;
sum0=sum0+24*60;
}
sum0=sum0-T; //剩余总分钟数
T=sum0/60; //剩余小时数
sum0=sum0%60; //剩余分钟数
while(day<=0)
{
if(prime(year+mouth/12))
mouths[1]=29;
else
mouths[1]=28;
mouth--;
day=day+mouths[(mouth-1+12)%12];
}
while(mouth<1)
{
year--;
mouth=mouth+12;
}
TT.day=day;
TT.mouth=mouth;
TT.year=year;
TT.hour=T;
TT.minute=sum0;
}
return TT;
}
Time Time::daojishi() //倒计时
{
Time T1,T2,TT;Date D1,D2;
int num0=0,num1=0,num2=0,num_day=0;
T1.setTime(); //当前时间
T2.setTime(); //未来时间
D1=T1;D2=T2;
num_day=D2-D1;
num0=T1.hour*60+T1.minute; // 当前时间一天多出来的分钟数
num1=T2.hour*60+T2.minute; //未来时间一天多出来的分钟数
if(num1>=num0)
{
num1=num1-num0;
}
else
{
num1=num1+24*60-num0;
num_day--;
}
hour=num1/60; //num0小时数
minute=num1%60; //多出来的分钟数
int i=60;
while(num_day!=0||hour!=0||minute!=0)
{
while(num_day>=0)
{
hour=23;
while(hour>=0)
{ minute=59;
while(minute>=0)
{ i=60;
while(i>0)
{
cout<<num_day<<"/"<<hour<<"/"<<minute<<" "<<--i;
system("cls");
}
minute--;
}
hour--;
}
num_day--;
}
}
return TT;
}
void Date::setDate()
{
cin>>year>>mouth>>day;
}
void Date::output()
{
cout<<year<<"/"<<mouth<<"/"<<day<<endl;
}
Date::Date()
{
for(int i=0;i<12;i++)
if(i==0||i==2||i==4||i==6||i==7||i==9||i==11)
mouths[i]=31;
else
mouths[i]=30;
mouths[1]=28;
}
Date Date::operator +(Date D) //日期相加
{
Date DD;
int sum_day0=D.day,sum_day1=day,sum_day=0;
while(D.mouth--)
{
if(D.mouth!=0)
sum_day0=D.mouths[D.mouth-1]+sum_day0;
else
sum_day0=sum_day0;
}
while(mouth--)
{
if(mouth!=0)
sum_day1=sum_day1+mouths[mouth-1];
else
sum_day1=sum_day1;
}
sum_day=sum_day0+sum_day1;
if(prime(year+D.year))
{
if(sum_day>=366)
{
DD.year=D.year+year+1;
sum_day=sum_day-366;
}
else
DD.year=D.year+year;
}
else
{
if(sum_day>=365)
{
DD.year=D.year+year+1;
sum_day=sum_day-366;
}
else
DD.year=D.year+year;
}
if(prime(DD.year))
mouths[1]=29;
for(int i=0;sum_day>=mouths[i];i++)
{
sum_day=sum_day-mouths[i];
}
DD.mouth=i+1;
DD.day=sum_day;
return DD;
}
int Date::operator -(Date D) //日期相减
{
Date DD; //D被减日期
int sum_day0=D.day,sum_day1=day,sum_day=0;
int year0=D.year;
while(D.year<year)
{
if(prime(D.year))
sum_day1=sum_day1+366;
else
sum_day1=sum_day1+365;
D.year++;
}
while(mouth--) //减的日期
{
if(prime(year))
mouths[1]=29;
else
mouths[1]=28;
if(mouth!=0)
sum_day1=sum_day1+mouths[mouth-1];
else
sum_day1=sum_day1;
}
while(D.mouth--) //被减日期
{
if(prime(year0))
D.mouths[1]=29;
else
D.mouths[1]=28;
if(D.mouth!=0)
sum_day0=D.mouths[D.mouth-1]+sum_day0;
else
sum_day0=sum_day0;
}
return sum_day1-sum_day0;
}
Date Date::operator +(int D) //日期加天数
{
Date DD;
int sum_day0=day,year_day=0,sum_day=0;
while(mouth--)
{
if(prime(year))
mouths[1]=29;
if(mouth!=0)
sum_day0=sum_day0+mouths[mouth-1];
else
sum_day0=sum_day0;
}
sum_day=sum_day0+D;
if(prime(year))
year_day=366;
else
year_day=365;
while(sum_day>=year_day)
{
if(prime(year))
{
mouths[1]=29;
sum_day=sum_day-366;
}
else
{
mouths[1]=28;
sum_day=sum_day-365;
}
year++;
if(prime(year))
year_day=366;
else
year_day=365;
}
if(prime(year))
mouths[1]=29;
for(int i=0;sum_day>mouths[i];i++)
sum_day=sum_day-mouths[i];
DD.year=year;
DD.mouth=i+1;
DD.day=sum_day;
return DD;
}
Date Date::operator -(int D) //日期减天数
{
Date DD;
int sum_day0=day,year_day=0,sum_day=0;
if(prime(year))
mouths[1]=29;
while(mouth--)
{
if(mouth!=0)
sum_day0=sum_day0+mouths[mouth-1];
else
sum_day0=sum_day0;
}
if(sum_day0>=D)
{
if(prime(year))
mouths[1]=29;
sum_day=sum_day0-D;
for(int i=0;sum_day>mouths[i];i++)
sum_day=sum_day-mouths[i];
DD.year=year;
DD.mouth=i+1;
DD.day=sum_day;
return DD;
}
else
{
while(sum_day0<D)
{
if(prime(--year))
{
sum_day0=sum_day0+366;
}
else
sum_day0=sum_day0+365;
}
sum_day=sum_day0-D;
if(prime(year))
mouths[1]=29;
else
mouths[1]=28;
for(int i=0;sum_day>mouths[i];i++)
sum_day=sum_day-mouths[i];
DD.year=year;
DD.mouth=i+1;
DD.day=sum_day;
return DD;
}
}
bool prime(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)
return true;
else
return false;
}
void show()
{
cout<<" 1.两日期相加 2.两日期相减"<<endl;
cout<<" 3.日期加天数 4.日期减天数"<<endl;
cout<<" 5.日期加去分钟数 6.日期减去分钟数"<<endl;
cout<<" 7.清屏 8.退出"<<endl;
}
int main()
{
Date D1,D2,DD;
Time T1,T2,TT;
char ch='Y';
int d1,d2,t1,t2,i;
system("color 71");
cout<<" 1.两日期相加 2.两日期相减"<<endl;
cout<<" 3.日期加天数 4.日期减天数"<<endl;
cout<<" 5.日期加去分钟数 6.日期减去分钟数"<<endl;
cout<<" 7.清屏 8.退出"<<endl;
cout<<" 9.倒计时 "<<endl;
while(ch=='Y')
{
cout<<"请选择需要操作的选项:";cin>>i;
switch(i)
{
case 1:D1.setDate();D2.setDate();DD=D1+D2;DD.output();break;
case 2:D1.setDate();D2.setDate();d2=D1-D2;cout<<d2<<endl;break;
case 3:D1.setDate();cout<<"请输入增加的天数:";cin>>d1;DD=D1+d1;DD.output();break;
case 4:D1.setDate();cout<<"请输入减少的天数:";cin>>d2;DD=D1-d2;DD.output();break;
case 5:T1.setTime();cout<<"请输入增加的分钟数:";cin>>t1;TT=T1+t1;TT.output();break;
case 6:T1.setTime();cout<<"请输入减少的分钟数:";cin>>t2;TT=T1-t2;TT.output();break;
case 7:system("cls");show();break;
case 8:ch='N';break;
case 9:T1.daojishi();break;
}
cout<<endl;
}
return 0;
}
/*
1
2000 1 20
2000 1 20
2
2012 11 28
2000 1 20
2012 12 12
2011 11 11
2012 12 31 23 50
310
2013 1 1 5 0
310
*/
相关文章推荐
- 设计一个时间类Time, 包括时,分,秒等私有数据成员。要求实现时间的基本运算,一个时间加上另一个时间。。
- 设计一个日期类Date,,要求: (1)包含年(year)、月(month)和日(day)私有数据成员。 (2)包含构造函数,重载关于一日期加上天数的加法运算符+、重载关于一日期减去天数的减加运算符-
- 设计一个日期类Date,,要求: (1)包含年(year)、月(month)和日(day)私有数据成员。 (2)包含构造函数,重载关于一日期加上天数的加法运算符+、重载关于一日期减去天数的减加运算符-
- 设计一个时间类Time,要求: (1)包含时(hour)、分(minute)和秒(second)私有数据成员。 (2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间
- 设计一个日期类date,包括日期的年份,月份和日号,编写一个友元函数求两个日期之间相差的天数。
- 号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函
- 设计一个计算器类Calculator,它只有一个计数的成员count。该计算器的有效范围说0~65535,实现计算器的前自增、后自增、前自减、后自减、两个计算器相加减等运算
- 需要求3个长方体的体积,写一个基于对象的程序,数据成员包括 length width height 要求用成员函数实现以下功能
- 设计一个计算器类Claculator,它只有一个用于计数的数据成员count。该计算器的有效计数范围是0~65535,实现计数器的前自增、后自增、前自减、后自减、两个计算器相加减运算
- 66.6 设计一个雇员类 employee,存储雇员的姓名、编号和生日等信息,要求该类使用 上一题设计的日期类作为成员对象。雇员类的使用如下: //定义一个雇员,其雇员号为 10,生日为 1970 年
- 实验题7.1: 编写一个程序algo7-1.cpp,实现二叉树的各种基本运算,并在此基础上设计一个程序Main.cpp完成如下功能(b为如下图所示的一棵二叉树)
- 问题:求两个字符串的最长公共子串。 要求:输入两个字符串,输出它们的最长公共子串,包括长度。 设计: 设计一个类 String,包括一个 len(字符串长度)和字符串指针 s。另有如下成员函数: ·
- 设计一个日期Date类(静态成员)
- 创建一个数组, 实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。 要求:自己设计函数的参数,返回值。
- 定义一个描述学生(Student)基本情况的类,数据成员包括姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(count)...
- 一个真正符合中国国情的工作流设计参考(包括PHP实现)
- 实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
- 设计一个电视机类,成员变量包括电视机编号、生产厂家、品牌名称、大小、开关状态,并可以对其进行相应操作,如打开电视、提高/降低音量、更换频道等。
- 定义一个圆类(Circle),私有数据成员为半径(radius)、圆周长和面积,共有成员函数为输入半径;计算周长、面积;输出半径、周长和面积。要求定义构造函数(以半径为参数,缺省值为0,周长和面积在
- 一个真正符合中国国情的工作流设计参考(包括PHP实现)