【问题描述】
设计一个Time类,并设计多个重载的构造函数,可以设置时间、进行时间的加减运算、按12小时格式和24小时格式输出时间。
例如:
class Time
{
int hour,minute,second;
public:
int SecCalc(){return(hour*60+minute)*60+second; }
Time(int h,int m, int s=0);
Time(int s=0);
void SetTime(int h=0,int m=0, int s=0);
void print_12();
void print_24();
Time Add(Time &);
Time Sub(Time &);
};
其中构造函数Time::Time(int s)根据总秒数计算hour、minute、second并构造对象;
成员函数Time::print_12()按12小时格式显示时间,如“09:20:45 AM”、“03:15:20 PM”;
成员函数Time::print_24()按24小时格式显示时间,如“09:20:45”、“4:30:20”;
成员函数Time::Add(Time&)用来实现两个时间对象的值进行相加;
成员函数Time::Sub(Time&)用来实现两个时间对象的值进行相减。
为了检验Time类的功能,主函数按如下方式设计:
int main()
{
Time t1(2,34),t2,t3(3723);
t2.SetTime(13,23,34);
cout<<"t2:";
t2.print_12();
cout<<endl<<"t2:";
t2.print_24();
cout<<"
t1+t2:";
t1.Add(t2).print_24();
cout<<"
t1-t2:";
t2.Sub(t1).print_24();
cout<<endl<<"t3:";
t3.print_24();
return 0;
}
【输入形式】 无输入
【输出形式】 程序运行结果
【样例输入】 无
【样例输出】
t2:01:23:34 PM
t2:13:23:34
t1+t2:15:57:34
t1-t2:10:49:34
t3:01:02:03
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
class Time
{
private:
int hour,minute,second;
public:
int SecCalc(){ return(hour*60+minute)*60+second; }//返回总秒数
Time(int h,int m,int s=0);//构造函数
Time(int s=0);//根据总秒数计算hour、minute、second并构造对象
void SetTime(int h=0,int m=0, int s=0);
void print_12();//按12小时格式显示时间
void print_24();//按24小时格式显示时间
Time Add(Time &);//实现两个时间对象的值进行相加
Time Sub(Time &);//实现两个时间对象的值进行相减
};
Time::Time(int h,int m,int s)//构造函数
{
hour = h; minute = m; second = s;
}
Time::Time(int s)//根据总秒数计算hour、minute、second并构造对象
{
hour = s/3600;
minute = (s-hour*3600)/60;
second = s-hour*3600-60*minute;
}
void Time::SetTime(int h,int m, int s)
{
hour = h; minute = m; second = s;
}
void Time::print_12()//按12小时格式显示时间
{
if(hour>12)
{
cout << setw(2) << setfill('0') << hour-12 << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second << " PM";
}
else
{
cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second << " AM";
}
}
void Time::print_24()//按24小时格式显示时间
{
cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second;
}
Time Time::Add(Time &t)//实现两个时间对象的值进行相加
{
Time tt;
tt.second = second+t.second;
tt.minute = tt.second/60 + minute + t.minute;
tt.second %= 60;
tt.hour = tt.minute/60 + hour + t.hour;
tt.minute %= 60;
tt.hour %= 24;
return tt;
}
Time Time::Sub(Time &t)//实现两个时间对象的值进行相减
{
int s = fabs( this->SecCalc() - t.SecCalc() );
Time tt(s);
return tt;
}
int main()
{
Time t1(2,34),t2,t3(3723);
t2.SetTime(13,23,34);
cout<<"t2:";
t2.print_12();
cout<<endl<<"t2:";
t2.print_24();
cout<<"
t1+t2:";
t1.Add(t2).print_24();
cout<<"
t1-t2:";
t2.Sub(t1).print_24();
cout<<endl<<"t3:";
t3.print_24();
return 0;
}
笔记:
- 用 cout << setw(2) << setfill(‘0’) << … 时要注意每输出一个值都要设定一次,不能一次一劳永逸
- setfill(‘0’) 括号里填的是’0’,是字符零;而不是数字0
- Time Add(Time &);//实现两个时间对象的值进行相加
Time Sub(Time &);//实现两个时间对象的值进行相减
这两个函数运用了不同思路的计算方法
Add函数是直接运算取余取整得时间;而Sub函数是借助给定的SecCalc()函数把时间转换成秒数,再利用秒数构造函数得时间 - 主函数里可以这样写:t1.Add(t2).print_24(); 是因为 t1.Add(t2) 返回的是一个时间类对象,再用此时间类对象调用print_24()函数
- 带默认值的函数在函数原型声明时:void SetTime(int h=0,int m=0, int s=0);
但在定义时:void Time::SetTime(int h,int m, int s) {…}