回复 7# 的帖子
谢谢您的程序 好厉害啊 但是我运行了一下 有一些问题,1.年输出的是3907
2.题目的意思是原有时间同四舍五入后的时间进行比较 原有时间大输出1,四舍五入时间大输出-1,相等输出0.您的程序不太符合题意.
3.您的程序我没有看到对闰年的判断.
谢谢指教!
雕刻单调的人生
#include <iostream> using namespace std; #include <ctime> #define TM_TIMEBASE 1900 class CLF_DateTime : public tm { inline void carry(int& v1,int& v2,int v3){v1+=v2/v3;v2%=v3;} inline bool isleap(int y){return y%100?!(y%4):!(y%400);} public: bool isleap(){return isleap(tm_year+TM_TIMEBASE);} CLF_DateTime(int year=1900,int month=1,int day=1, int hour=0,int min=0,int sec=0) { tm_year=year-TM_TIMEBASE;tm_mon=month-1;tm_mday=day; tm_hour=hour;tm_min=min;tm_sec=sec; } ~CLF_DateTime(){} char* display(char* strdisplay) { strftime(strdisplay,80,"%Y-%m-%d %H:%M:%S",this); return strdisplay; } char* setdisplay(char* strdisplay) { tm_min+=tm_sec>=30; tm_sec=0; carry(tm_hour,tm_min,60); carry(tm_mday,tm_hour,24); tm_mday--;//tm_mday属于1~max但是判断属于0~max-1,故这里减一,以前的有Bug switch (tm_mon+1) { case 1:case 3:case 5:case 7:case 8: case 10:case 12:carry(tm_mon,tm_mday,31);break; case 2:carry(tm_mon,tm_mday,28+isleap());break; default:carry(tm_mon,tm_mday,30); }tm_mday++;//恢复mday carry(tm_year,tm_mon,12); return display(strdisplay); } int compare(CLF_DateTime& pb) { int t; if (t=tm_year-pb.tm_year)return t>0?1:-1; if (t=tm_mon -pb.tm_mon )return t>0?1:-1; if (t=tm_mday-pb.tm_mday)return t>0?1:-1; if (t=tm_hour-pb.tm_hour)return t>0?1:-1; if (t=tm_min -pb.tm_min )return t>0?1:-1; if (t=tm_sec -pb.tm_sec )return t>0?1:-1; return t; } }; void main() { CLF_DateTime pa(2000,2,28,23,59,59); CLF_DateTime pb(pa); char testdisplay[100]; cout<<"Your input date and time is: "<<pa.display(testdisplay)<<endl; cout<<"leap year?"<<pa.isleap()<<endl; cout<<"Provide rounding:"<<pa.setdisplay(testdisplay)<<endl; cout<<"compare time:"<<(pb)<<endl; getchar(); }1和3帮你改好了,2本来就不是错误。从代码看你的四舍五入是指将秒设置成0或者30然后进位。那么pa是调整后的时间,在我的程序里(注意数据跟你的不一样)pa是大于pb的,返回1是正确的。但是compare里面我漏写了一行代码所以没有判断秒,这里改了过来。还有,你的闰年检查有问题,注意年份要加上1900再检查。
//下面两行是为了防止一个头文件被载入两次 #ifndef _TEST_H_ #define _TEST_H_ class test{ public: test();//注意分号结尾,没有实现代码 void display();//同上 private: void print(); }; /* 和第1,2行呼应。意思是,如果定义了_TEST_H_, 那么就跳过上面的代码,如果没有定义,就定义。 这样这份代码就可以只包含一遍了。如果你使用 VC++2005的话,就只在文件开头加上一句 #pragma once就可以了,不需要这么麻烦 */ #endif _TEST_H_在test.cpp中:
//包含头文件 #include "test.h" #include <iostream> using namespace std; test::test() { cout<<"in Test::Test\n"; } void test::display(){ cout<<"In Test::display\n"; print(); } void test::print(){ cout<<"In Test::print\n"; }在main.cpp中:
//使用源代码的时候,也需要包含头文件 #include "test.h" #include <iostream> using namespace std; int main(){ test t1; t1.display(); getchar(); }我没有对代码进行编译。只是简单地演示一下该怎么做。只需要像上面一样就可以了。实现和使用会被编译到不同的obj里面去。
#ifndef _CLF_H_ #define _CLF_H_ #include <ctime> #define TM_TIMEBASE 1900 class CLF_DateTime : public tm { void carry(int& v1,int& v2,int v3); bool isleap(int y); public: bool isleap(); CLF_DateTime(int year=1900,int month=1,int day=1, int hour=0,int min=0,int sec=0); ~CLF_DateTime(){} char* display(char* strdisplay); char* setdisplay(char* strdisplay); int compare(CLF_DateTime& pb); }; #endif在CLF.cpp中:
#include "CLF.h" #include <iostream> using namespace std; inline void CLF_DateTime::carry( int& v1,int& v2,int v3 ) { v1+=v2/v3; v2%=v3; } inline bool CLF_DateTime::isleap( int y ) { return y%100?!(y%4):!(y%400); } bool CLF_DateTime::isleap() { return isleap(tm_year+TM_TIMEBASE); } CLF_DateTime::CLF_DateTime( int year/*=1900*/,int month/*=1*/,int day/*=1*/, int hour/*=0*/,int min/*=0*/,int sec/*=0*/ ) { tm_year=year-TM_TIMEBASE; tm_mon=month-1; tm_mday=day; tm_hour=hour; tm_min=min; tm_sec=sec; } char* CLF_DateTime::display( char* strdisplay ) { strftime(strdisplay,80,"%Y-%m-%d %H:%M:%S",this); return strdisplay; } char* CLF_DateTime::setdisplay( char* strdisplay ) { tm_min+=tm_sec>=30; tm_sec=0; carry(tm_hour,tm_min,60); carry(tm_mday,tm_hour,24); tm_mday--; switch (tm_mon+1) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: carry(tm_mon,tm_mday,31); break; case 2: carry(tm_mon,tm_mday,28+isleap()); break; default: carry(tm_mon,tm_mday,30); } tm_mday++; carry(tm_year,tm_mon,12); return display(strdisplay); } int CLF_DateTime::compare( CLF_DateTime& pb ) { int t; if (t=tm_year-pb.tm_year)goto ret; if (t=tm_mon -pb.tm_mon )goto ret; if (t=tm_mday-pb.tm_mday)goto ret; if (t=tm_hour-pb.tm_hour)goto ret; if (t=tm_min -pb.tm_min )goto ret; if (t=tm_sec -pb.tm_sec )goto ret; return t; ret: return t>0?1:-1; }在main.cpp中:
#include "CLF.h" #include "iostream" using namespace std; int main() { CLF_DateTime pa(2000,2,28,23,59,59); CLF_DateTime pb(pa); char testdisplay[100]; cout<<"Your input date and time is: "<<pa.display(testdisplay)<<endl; cout<<"leap year?"<<pa.isleap()<<endl; cout<<"Provide rounding:"<<pa.setdisplay(testdisplay)<<endl; cout<<"compare time:"<<(pb)<<endl; getchar(); }