回复 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();
}