以文本方式查看主题

-  课外天地 李树青  (http://njcie.com/bbs/index.asp)
--  清心茶舍  (http://njcie.com/bbs/list.asp?boardid=21)
----  李老师,看一下上机编的程序,为什么调换顺序,结果就不一样  (http://njcie.com/bbs/dispbbs.asp?boardid=21&id=348)

--  作者:eva
--  发布时间:2007/4/3 18:46:18
--  李老师,看一下上机编的程序,为什么调换顺序,结果就不一样

李老师:

这是add函数的代码:

public void add(int a,int b,int c)
         {
          second=(second+c)%60;
          minute=(minute+b+((second+c)/60))%60;
          hour=(hour+a+((minute+b)/60))%60;
          }

最后输出结果是 02:09:43PM,这个答案不正确。

但是我把顺序调换一下:

public void add(int a,int b,int c)
        {
        
          hour=(hour+a+((minute+b)/60))%60;
           minute=(minute+b+((second+c)/60))%60;
           second=(second+c)%60;
          
        }

输出结果是: 02:08:43PM,这个答案是正确的。

这是为什么,只是把代码的顺序换了一下。

[此贴子已经被admin于2010-12-13 19:52:23编辑过]

--  作者:admin
--  发布时间:2007/4/4 7:54:31
--  回复

在你的第一种代码中,你是先改变second变量的值,然后在据此改变minute,而minute需要second原先的值才能得到正确结果

second=(second+c)%60;
minute=(minute+b+((second+c)/60))%60;

[此贴子已经被作者于2010-12-13 19:52:42编辑过]

--  作者:eva
--  发布时间:2007/4/4 20:32:13
--  

老师:我感觉在第一种代码应该没错阿。

算法是累加:Time t1=new Time(13,2,3);

                      t.add(200,300,400);

我先用1.(400+3)/60=6分,  (400+3)%60=43秒;

           2.(300+2+6)/60=5小时, (300+2+6)%60=8分;

           3.(200+13+5)%24=2; 所以是02:08:43

所以这个代码

public void add(int a,int b,int c)
         {
          second=(second+c)%60;
          minute=(minute+b+((second+c)/60))%60;
          hour=(hour+a+((minute+b)/60))%24;
          }

算出来应该和我前面推算的结果一样啊,但是为什么不一样呢?

还有你上面说的我不太明白。

[此贴子已经被admin于2010-12-13 19:53:00编辑过]

--  作者:eva
--  发布时间:2007/4/4 20:36:29
--  

哦,老师我明白了,我把代码改称这样:

public void add(int a,int b,int c)
         {
          int t=second+c;
          second=(second+c)%60;
          int  s=minute+b;
          minute=(minute+b+((t)/60))%60;
          hour=(hour+a+((s)/60))%24;
          }

这样结果就对了。

老师,这个代码正确吗?


 

[此贴子已经被admin于2010-12-13 19:53:14编辑过]

--  作者:admin
--  发布时间:2007/4/4 23:11:06
--  回复

建议试验验证