黑马程序员技术交流社区

标题: 为什么只有用do while才能做的出来呢?还是我其他的写得不对?求大神指点 [打印本页]

作者: 黄梁梦想享    时间: 2014-7-13 17:19
标题: 为什么只有用do while才能做的出来呢?还是我其他的写得不对?求大神指点
/*
* 需求:计算1+1/3+1/5+1/7+...+1/(2*n+1)的值。且必须得到1/(2*n+1)小于0.00001时为止。
* 当循环结束时,显示表达式中n的值,以及表达式的结果。
*
*/


public class sumTwo {
        public static void main(String[] args){
//                第一种
//                int n=1;
//                double sum=1.0;
////                double N=1.0/0.00001;
//                double l=1.0/(2*n+1);
//                while(l>=0.00001)
//                {
//                        sum+=l;
//                        n++;
//                }
//                System.out.println(sum);
//                System.out.println(n-1);
//                System.out.println(l);
//                第二种
                int n = 1;
                double sum = 1.0;
                for(double l=1.0/(2*n+1);l>=0.0001;n++)
                {
                        sum+=l;
                }
                System.out.println("循环结束时n的值:"+n);
                System.out.println("计算出的结果是:"+sum);
//                第三种
//                int n=1;
//                double dSum=1.0,dTemp;
//                do
//                {
//                        dTemp = 1.0/(2*n+1);
//                        dSum+=dTemp;
//                        n++;
//                }
//                while(dTemp>=0.00001);
//                System.out.println(n-1);
//                System.out.println(dSum);
//                       
               
        }
}
只有第三种才能运行 其他的运行不了。求指点!!!
作者: blue_sky    时间: 2014-7-13 17:57
看你的第二种:使用for循环操作的时候:
for 循环结构
        for(初始化表达式1;循环条件表达式2;循环后的操作表达式3)
        {
           执行语句;
        }
执行过程:
            1、首先进行初始化表达式的计算;
         2、然后进行循环条件表达式的验证;
         3、若符合执行循环体,再执行4;若不符合则结束循环;
         4、执行完执行语句后,再执行循环后操作表达式
         5、执行完循环后表达式的值跳转到2进行验证
         6、载执行3      

你每一次循环虽然都执行了n++;但是,接着操作l>=0.0001;但是,l的值一直都是1.0/(2*1+1);所以就死循环了;

你的第一种方法;使用whilel判断表达式,其实和上面犯得错误一样;l的值已经固定;无论你怎么判断,都和第一次的判断结果一样;所以就死循环;
作者: blue_sky    时间: 2014-7-13 17:59
while循环语句

  while(条件表达式)
  {
     执行语句;
  }
执行过程:  符合条件表达式的时候执行执行语句;
              然后再进行验证条件表达式;
                若满足再执行执行语句;
            若不满足跳出循环;


看看while和for循环的执行流程,你就清楚了;一定要搞清楚控制变量
作者: 爨庚轩    时间: 2014-7-13 18:03
                int n = 1;
                double sum = 1.0;
                double l=1.0/(2*n+1);
                n++;  //从n=2开始循环
                for(;l>=0.00001;n++)
                {
                        sum+=l;
                        l=1.0/(2*n+1);     //l的值每次都得计算
                }
                System.out.println("循环结束时n的值:"+n);
                System.out.println("计算出的结果是:"+sum);
第二种的给你修改了,看看我的注释
for循环和while循环的区别就是,for循环第一次循环都必须判断条件是否满足,do-while循环第一次不用判断条件是否满足,也就是do-while循环至少执行一次,for循环有可能一次都不执行。
第一种方法的错误和第二种方法的错误一样,我给第二种的给你改了改,你看完后,自己修改第一种的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2