循环的总结

来源:互联网 发布:股票抢单软件 编辑:程序博客网 时间:2024/06/07 00:49

 5循环结构

5.1循环结构的概念

先来看看生活中的场景:

(1)食堂阿姨打菜:接过顾客的餐盘→询问菜品→打菜→递回餐盘,重复以上过程,直到所有顾客的菜都打完

(2)快递员送快递:查看送件地址→赶往目的地→电话告知收件人→收件人签收→交快递件,重复以上过程,直到所有需要送的快递都处理完了。

(3)公交司机.........

(4)作业流程......

以上场景都有一个共同点:有条件重复的做一件事情,每一次做的事情不同但类似

程序是为了解决实际问题。实际问题中存在着重复的动作,那么程序也应该有相应的描述,这就是循环

-案例:

/* 计算1+2+3+4.......+10*/
    /* 方案一 */
    var sum =1+2+3+4+5+6+7+8+9+10;
    /*方案二*/
    var sum2 = 0;
    sum2 += 1;
    sum2 += 2;
    sum2 += 3;
    sum2 += 4;
    sum2 += 5;
    sum2 += 6;
    sum2 += 7;
    sum2 += 8;
    sum2 += 9;
    sum2 += 10;

但是这两种方案的描述方式都不太理想,如果是要加到10000呢?

注意观察方案二,他重复做一件事(将一个数加到sum2中),每一次不同但是类似

/*方案三*/
var sum3 = 0;
var n = 1;
while(n<=10) {
    sum3 += n;
    n++;
    alert(sum3)
}

方案三表达的含义和方案二一样,但是表达方式要好的多,比如加到10000,只需要把条件n<=10改为n<=10000

5.2while循环

while是表示“当........”,也就是说当某个条件成立时,则一直重复做。

(流程图)

(调试工具查看程序轨迹以及变量的变化情况)

一、while(条件){

循环体

}

二、do{

循环体

}while(条件)

Whiledo……while的区别是

While是先判断在做,如果条件错误,那么它一次都不会执行。

Do……while是先做在判断,如果条件错误,那么它至少会执行一次。


 

案例:10以内相加

var sum3 = 0;
var n = 1;
do{
    sum3 += n;
    n++;
}while(n<=10);
alert(sum3);

1000以内水仙花数


 

  var num = 100 ;
    while (num<1000) {
    var b100 = Math.floor(num / 100);
    var b10 = Math.floor((num % 100) / 10);
    var b1 = num % 10;
    sum = b100 * b100 * b100 + b10 * b10 * b10 + b1 * b1 * b1;
        if(sum == num){
            alert(num +"水仙花数");
        }
        num++;
//    alert(num(sum == num ? "" : "不是") + "水仙花数");
}

GDP预测

 

var usaGdp = 142562.75;
var chinaGdp = 49098.82;
var year = 2009;
while( chinaGdp <= usaGdp){
    usaGdp *=(1 + 0.02);
    chinaGdp *=(1 + 0.08);
    year++;
}
alert(year+"年,中国("+chinaGdp+")将反超美国("+usaGdp+")");

总结循环的套路

(1)初始状态

(2)循环条件(要重复做的事情)

(3)循环体

(4)为下次循环做准备()

那如何去写循环的程序呢?回答四个问题:

(1)初始状态是怎样的?

(2)重复做的条件是什么

(3)重复做什么

(4)怎么过渡到下一次循环

 

水仙花数问题

GDP预测

初始状态

var  num =10

var usaGdp = 142562.75;
var chinaGdp = 49098.82;
var year = 2009;

循环条件

num<=999

chinaGdp <= usaGdp

循环体

var b100 = Math.floor(num / 100);
    var b10 = Math.floor((num % 100) / 10);
    var b1 = num % 10;
    sum = b100 * b100 * b100 + b10 * b10 * b10 + b1 * b1 * b1;
        if(sum == num){
            alert(num +"水仙花数");
        }

  usaGdp *=(1 + 0.02);
  chinaGdp *=(1 + 0.08);

为下次循环做准备

num++

year++

案例计算圆周率,π=1-1/3+1/5-1/7+......*4

1-1/3+1/5-1/7+变化为(+1/1+-1/3++1/5+-1/7

那么他就和我们之前解决的1+2+3+..+10问题就非常类似了,即都是求累加和,只不过每次加的内容不同而已

我们都可以将每一项拆分为:

t = 符号*1/分母

1)初始状态是怎样的?

sum = 0

t = 1;

sign = 1

deno = 1

(2)重复做的条件是什么

|t|>=10-6

 

(3)重复做什么

sum += t

(4)怎么过渡到下一次循环

sign = -sign

deno +=2;

t = sign*1/deno

 

/*初始状态 */

while(/*循环的条件*/){
    /*重复做的事情*/
    /*为下一次循环做准备*/
}

for(开始值;循环条件;步长){

/*重复做的事情*/
    

}

5.4循环辅助语句

break:跳出所在的switch或者循环结构

案例:素数判断

r found = false;//找到因子的标志
for (var i=2; i<=m; i++){
    if(n%i == 0){
        found = true ;
        break;//找到则提前结束
    }
}
alert(found?"不是素数":"是素数");

continue:结束本次循环,开启下一次循环。

常规思路:满足累加

思路一
1)对[1,100]范围内的数逐个判断
2)如果满足条件就累加
3)输出和
 */
//    var sum = 0;
//    for(var n=1 ;n<=100 ; n++){
//        if(n%3!=0 && n%5!=0){
//            sum +=n;
//        }
//    }
//    alert(sum);
/*

另一种思路:不满足放弃

 

var sum = 0;
for(var n=1 ;n<=100 ; n++){
    if(n%3==0 || n%5==0){
       continue;
    }

sum +=n;


}
alert(sum);

第二种思路的好处:结构清晰

也就是我们在进行数据处理之前,先把各种不符合条件的情况先排除,然后在处理符合条件的情况(这个一般是程序的主体)

如果循环体的主体代码的执行有两个前提条件,常规思路就是这么写的,如果循环主体代码较多,该程序的可读性较差

if(条件1{

if(条件2{

主体代码(可能代码比较多)

 

}else{

alert错误提示2”)

}

}else{

alert错误提示1”)

}

换另一思路来描述,是这样的

for......{

if(!条件1{

alert错误提示1”);

continue

}

if(!条件2{

alert错误提示2”);

continue

}

循环体主体代码

}

5.5循环嵌套

为什么有循环的嵌套

因为一件事情的内容需要重复做,而且这个事情要反复做

什么时候用循环的嵌套:

两者没有制约关系

两者有制约关系

一般有行数列数并且两者之间存在关系的时候用循环的嵌套。

比如直角三角形的输出

for (var i=1; i<=4; i++){
    for (var j=1; j<i ; j++){
        document.write("*");
    }
    document.write("<br>");
}

等腰三角形的输出

var num= 10;
for(var i=1; i<num ; i++){
    for (var j=num-i; j>0; j--){
        document.write("  ");
    }
    for(var k=1; k<=i*2-1;k++) {
        document.write("6");
    }
    document.write("<br>");
}

原创粉丝点击