首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-02-20 
发动大家找错误(我没辙了)下面主函数中的while循环中老是能输出1900-2-29,但1900是平年,不会有29天,而date

发动大家找错误(我没辙了)
下面主函数中的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.

热点排行