读书人

发动大家找异常(小弟我没辙了)

发布时间: 2013-02-20 12:23:22 作者: rapoo

发动大家找错误(我没辙了)
下面主函数中的while循环中老是能输出1900-2-29,但1900是平年,不会有29天,而date类的构造函数中加入了处理这种情况的函数process(),主函数开始的date(1900,2,29)为什么能构建正确?难道与随机函数有关?大家帮帮我......发动大家找异常(小弟我没辙了)

#include <iostream>
#include <cstdlib>
#include "date.h"

using namespace std;
using namespace zhw;

int main(void)
{

date da(1900,2,29);     //为什么此处能正确构造
if(da.isError()) cout<<"\n不正确的日期\n";  
cout<<da.datetostr()<<endl; //
cout<<asctime(&da)<<endl; //
/*
time_t t=0;
tm* ptr=localtime(&t); //1970.1.1
cout<<asctime(ptr); //输出1970
*/
int a,b,c,d=16000,i=0;
int e,f,g;
srand((unsigned)time(0));
while(d--)
{
a=rand()%2014;
b=rand()%13;
c=rand()%32;

e=rand()%2014;
f=rand()%13;
g=rand()%32;

date dd(a,b,c);
date ddd(e,f,g);
//dd.process();
//ddd.process();
//if(dd.isError()) cout<<"dd\n";
//if(ddd.isError()) cout<<"ddd\n";

a=difmonth(dd,ddd);
b=difmonth_t(dd,ddd);
if(a!=b)
{ //为何此处能输出1900-2-29,构造函数中加入了process的啊
cout<<dd.datetostr()<<" a:"<<a<<endl<<ddd.datetostr()
<<" "<<b<<endl<<endl;
++i;
}
}
if(0 == i)
cout<<"\n两求相差月数函数结果相等\n"<<endl;

return 0;
}

date.h /date.cpp 较长,为方便大家我专门写了篇博客 见:

  http://blog.csdn.net/c_rrb/article/details/8561188
[解决办法]
date da(1900,2,29);     //为什么此处能正确构造
=====================
构建器date::date(int y,int m,int md,int h,int mi,int s,int is)开始就给日月年赋值,然后调用了process(),还以为你会处理,跟进去没看到判断闰年的代码啊
[解决办法]
date da(1900,2,29); 因为你的其他参数有默认值,第二个问题,你单步跟踪一下。
[解决办法]
有什么奇怪的吗?
date da(1900,2,29);表示的是3月29日,msdn上如下描述第二个参数


month Required. The month as an integer between 0 and 11 (January to December).

[解决办法]


[解决办法]
Java中也是这样,月份是用0-11的数字表示,很容易搞死初学者
[解决办法]
先给你两组数你看看吧
a=1476
b=2
c=29
1900-02-29 08:00:00 Thursday
--------------------------------
a=1680
b=2
c=29
1900-02-29 08:00:00 Thursday
-----------------------------
这两组数都能出现1900-2-29的结果.
我没有去验证楼主的isleap()里的表达式能不能正确地判断.
但此外还有一点的是,在process()里边,
运行下列语句:
else while(tm_mday>zhw::dayFmon(getYear(),getMonth()))
{
tm_mday -= zhw::dayFmon(getYear(),getMonth());
pro_addone_mon();
}
的时候,你的a值,也就是year,仍然是随机生成出来的那个值,而你用这个year值来作是否是闰年的判断,那肯定
是不正确的,应该在上述语句之前将year值先设定(if(tm_year<0) tm_year=0; )。



[解决办法]
也就是当你随机生成的year值小于1900的时候,你应该先把date对象的year值置成1900(tm_year=0),然后用1900来进行isleap()判断。
在你的程序里,你直接将随机生成的值来进行isleap()判断了,之后你又将小于1900的随机值置成了1900.

读书人网 >C++

热点推荐