时间类

【问题描述】
设计一个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;
}

笔记:

  1. 用 cout << setw(2) << setfill(‘0’) << … 时要注意每输出一个值都要设定一次,不能一次一劳永逸
  2. setfill(‘0’) 括号里填的是’0’,是字符零;而不是数字0
  3. Time Add(Time &);//实现两个时间对象的值进行相加
    Time Sub(Time &);//实现两个时间对象的值进行相减
    这两个函数运用了不同思路的计算方法
    Add函数是直接运算取余取整得时间;而Sub函数是借助给定的SecCalc()函数把时间转换成秒数,再利用秒数构造函数得时间
  4. 主函数里可以这样写:t1.Add(t2).print_24(); 是因为 t1.Add(t2) 返回的是一个时间类对象,再用此时间类对象调用print_24()函数
  5. 带默认值的函数在函数原型声明时:void SetTime(int h=0,int m=0, int s=0);
    但在定义时:void Time::SetTime(int h,int m, int s) {…}
原文地址:https://www.cnblogs.com/yuzilan/p/10626154.html