1016. 时间模拟

给出下面的基类Time的框架如下:
class Time
{ protected:
int second;
int minute;
int hour;
public:
void operator++();
void operator—();
}
建立一个派生类Time_12hours,用于表示十二进制时间,增加以下成员数据:
string type;//标识为12进制时间,type=”12-hours-time”
string interval;//标识为AM或者PM,interval=”AM”或interval=”PM”
增加以下成员函数:
void operator++();
void operator—();
建立一个派生类Time_24hours,用于表示二十四进制时间,增加以下成员数据:
string type;//标识为24进制时间,type=”24-hours-time”
增加以下成员函数:
void operator++();
void operator—();
生成上述类并编写主函数,根据输入的初始时间信息、自增或者自减类型、自增或者自减次数,输出其最后时间信息。
输入格式:测试输入包含多个测试用例,一个测试用例为一行,每行共五个数字,第一个数字为进制,121表示输入为12进制AM时间,122表示输入为12进制PM时间,输入为24表示输入为24进制时间,第二个数字为hour,第三个数字为minute,第四个数字为second,第五个字符为运算类型,+表示自增,-表示自减,第六个数字为运算次数,0表示测试用例结束。
输入样例:
121 11 59 59 + 3
24 11 59 59 + 3
122 11 59 59 + 3
122 00 00 00 – 3
121 00 00 00 – 5
24 00 00 00 – 1
0
输出样例:
PM 00:00:02
12:00:02
AM 00:00:02
AM 11:59:57
PM 11:59:55

23:59:59


#include<iostream>
#include<iomanip>
using namespace std;
class Time
{ 
  protected:
    int second;
    int minute;
    int hour;
    int sum;
  public:
    friend istream& operator >> (istream&,Time&);
    friend ostream& operator << (ostream&,Time&);
    void operator++();
    void operator--();
};
istream& operator >> (istream& in,Time& a)
{
  in>>a.hour>>a.minute>>a.second;
  a.sum=(a.hour*60+a.minute)*60+a.second;
  return in; 
}
ostream& operator << (ostream& out,Time& a)
{
  out<<setiosflags(ios::right)<<setfill('0')<<setw(2)<<a.hour<<":"<<setfill('0')<<setw(2)<<a.minute<<":"<<setw(2)<<a.second<<endl;
  return out;
}
void Time::operator++()
{
  sum++;
  second=sum%60;
  minute=sum/60%60;
  hour=sum/3600%24;
}
void Time::operator--()
{
  
  if(sum==0)
    sum=86400;
  sum--;
  second=sum%60;
  minute=sum/60%60;
  hour=sum/3600%24;
}
class Time_12hours:public Time
{
  string type;//标识为12进制时间,type=”12-hours-time”
  string interval;//标识为AM或者PM,interval=”AM”或interval=”PM”
  public:
    void set(int n){if(n==122) sum+=43200;}
    void operator++();
     void operator--();
     friend ostream& operator << (ostream& out,Time_12hours& a);
};
void Time_12hours::operator++()
{
  Time::operator++();
}
void Time_12hours::operator--()
{
  Time::operator--();
}
ostream& operator << (ostream& out,Time_12hours& a)
{
  if(a.hour>=12)
   a.interval="PM ",a.hour-=12;
   else
     a.interval="AM ";
  out<<a.interval<<setiosflags(ios::right)<<setfill('0')<<setw(2)<<a.hour<<":"<<setw(2)<<a.minute<<":"<<setw(2)<<a.second<<endl;
  return out;
}
int main()
{
  Time_12hours t12;
  Time t24;
  int act,n,i;
  char flag;
  cin>>act;
  while(act!=0)
  {
    if(act>100)
    {
      cin>>t12;
      t12.set(act);
      getchar();
      cin>>flag>>n;
      if(flag=='+')
        while(n--)
          ++t12;
      else
        while(n--)
          --t12;
      cout<<t12; 
    }
    else
    {
      cin>>t24;
      getchar();
      cin>>flag>>n;
      if(flag=='+')
        while(n--)
          ++t24;
      else
        while(n--)
          --t24;
      cout<<t24; 
    }
    cin>>act;
  }
  return 0;
}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值