zoukankan      html  css  js  c++  java
  • SDUST OJ 时间类的加、减法赋值运算

    Problem F: 时间类的加、减法赋值运算

    Time Limit: 3 Sec  Memory Limit: 128 MB
    Submit: 3801  Solved: 2210
    [Submit][Status][Web Board]

    Description

    封装一个时间类Time,在类上重载以下运算符,使得main()函数能够正确运行。
     
    1. Time::Time()无参构造方法。
    2. Time::inputTime()方法:按格式从标准输入读取数据修改Time对象的时分秒数值。该方法返回修改后的对象。
    3. Time::showTime()方法:输出“hh:mm:ss”,不足两位的要前面补0。如果对象不是合法的时间,则输出“Time error”。
    4. 运算符
    加法赋值运算符“+=”和减法赋值运算符“-=”:把一个整数m加到Time对象自身,并且仅对合法的时间操作,不会产生不合法的时间,比如:
    若原时间对象为“00:00:00”,减去2后的对象为“23:59:58”;
    若原时间对象为“23:59:59”,加上1后的对象为“00:00:00”;
    若原时间对象为“24:60:60”,加减后的对象仍为“24:60:60”
     
    函数调用格式见append.cc。
     
    append.cc中已给出main()函数
     

    Input

    输入的第一个整数n,表示有n组测试数据,每组4个整数,前三个整数为:hh,mm,ss,分别表示时、分、秒,其值都在int范围内,最后一个整数为m。
     

    Output

    每个输入对应两行输出,分别为时间“hh,mm,ss”加上m秒和减去m秒后的值。错误的时间输出“Time error”
     

    Sample Input

    6 0 0 1 2 0 59 59 1 1 1 60 10 23 0 0 60 23 59 59 100 24 1 0 3

    Sample Output

    00:00:03 23:59:59 01:00:00 00:59:58 Time error Time error 23:01:00 22:59:00 00:01:39 23:58:19 Time error Time error

    HINT

    输出格式用头文件<iomanip>中流操作算子:

    setw(w)   :设置数据的输出宽度为w个字符

    setfill(c):设置用字符c作为填充字符

    left      :设置输出左对齐

    right     :设置输出优对齐

    Append Code

    这道题目没有什么难点,我的问题主要出在对时间的减法处理上思路不够灵活。可以通过先把时间都转换成秒再进行运算来简化思维难度。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 class Time{
     4     int h,m,s;
     5     public:
     6     Time & inputTime(){
     7         cin >> h >> m >> s;
     8         return *this;
     9     }
    10     Time & operator += (int  t){
    11         //int d = 60-s;
    12         if(h >=24 || h <0 || m>= 60 || m <0 || s >= 60||s< 0) return *this;
    13         s = (s + t);
    14         m = (m + s/60);
    15         h = (h + m/60);
    16         s%=60,m%=60,h%=24;
    17         return *this;
    18     }
    19     Time & operator -=(int  t){
    20         if(h >=24 || h <0 || m>= 60 || m <0 || s >= 60||s< 0) return *this;
    21         int t0 = (s+m*60+h*3600-t +24*3600)%(24*3600);
    22         h = t0/3600;
    23         m = (t0-h*3600)/60;
    24         s = t0%60;
    25         return *this;
    26     }
    27     void showTime()const{
    28         if(h >=24 || h <0 || m>= 60 || m <0 || s >= 60||s< 0)
    29             printf("Time error
    ");
    30         else 
    31             printf("%02d:%02d:%02d
    ",h,m,s);
    32     }
    33 };
    34 int main()
    35 {
    36     int cases;
    37     cin>>cases;
    38     for(int i = 1; i <= cases; ++i)
    39     {
    40         Time t;
    41         t.inputTime();
    42         Time tt(t);
    43         int num;
    44         cin>>num;
    45         t += num;
    46         t.showTime();
    47         tt -= num;
    48         tt.showTime();
    49     }
    50 }
  • 相关阅读:
    js相关小实例——大图轮播
    js相关小实例——div实现下拉菜单
    js相关小实例——二级菜单
    html5部分相关
    CSS3常用属性(边框、背景、文本效果、2D转换、3D转换、过渡、有过渡效果大图轮播、动画)
    数据访问
    php测试
    单例模式
    Doc
    横竖列表 下拉隐藏显示
  • 原文地址:https://www.cnblogs.com/Wade-/p/6550980.html
Copyright © 2011-2022 走看看