JS基础五

来源:互联网 发布:linux epoll socket 编辑:程序博客网 时间:2024/06/11 18:21

1.循环结构

循环结构的概念:

生活中的一些场景:

食堂阿姨打菜:接过顾客的餐盘→询问菜品→打菜→递回餐盘,重复以上过程,知道所有顾客的菜都打完了。

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

公交司机。。。

作业流程。。。

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

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

/*计算1+2+3+......+10*/
    var sum1 = 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++;
}

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


while循环

While是表示“当……则……”,也就是当某个条件成立时,则一直重复做某件事。(流程图)

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

var cha =49089.82;
var usa = 142562.75;
var year = 2009;
while(cha<usa){
    /*cha += 49089.82*0.8;
    usa += 142562.75*0.2;*/
    cha *= (1+0.08);
    usa *= (1+0.02);
    year ++;
}
alert(year+"年超过美国");

水仙花数:

var num = 100;
while (num<=999) {
    var b100 = Math.floor(num / 100);
    var b10 = Math.floor((num % 100) /10);
    var b1 = num % 10;
    var sum = b100 * b100 * b100 + b10 *b10 * b10 + b1 * b1 * b1;
    if(sum == num){
        document.write(num+"是水仙花数"+"<br>");
    }
    num ++;
}

 

 

 

 

 

循环的套路:

初始状态

循环条件

循环体(需要重复做的事情)

为下次循环做准备()

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

初始状态是怎样的?

重复做的条件是什么

重复做什么

怎么过渡到下一次循环

 

水仙花数问题

GDP预测问题

初始状态

Num = 100

var year = 2009;
var cha = 49089.82;
var usa = 142562.75;

 

循环条件

Num <= 999

cha<usa

 

循环体

var b100 = Math.floor(num / 100);
var b10 = Math.floor((num % 100) / 10);
var b1 = num % 10;
var sum = b100 * b100 * b100 + b10 * b10 * b10 + b1 * b1 * b1;
if(sum == num){
    document.write(num+"是水仙花数"+"<br>");
}

cha *= (1+0.08);
usa *= (1+0.02);

为下次循环做准备

num++;

year++;

案例:计算圆周率,π = (1-1/3 + 1/5 –1/7+……)*4,计算到最后一项的绝对值小于10-6

分析:将公示稍微变化一下,1-1/3 + 1/5 – 1/7+

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

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

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

t = 符号*1/分母

 

初始状态是怎样的?

sum = 0;

t = 1;

sign = 1;

deno = 1;

重复做的条件是什么

|t|>=10-6

重复做什么

sum += t;

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

      sign = -sign;

      deno = t;

      t = sign*1/deno;

do while循环

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

先循环体,在判断循环条件

循环辅助语句

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

案例:素数的判断

var n =Number(prompt("输入一个数:"));
    var found = false;
    for(var i = 2; i<Math.sqrt(n);i++){
        if(n%i == 0){
            found = true;
//            alert(n+"不是质数");
            break; //找到则提前结束
        }
    }
    alert(found?"不是质数":"是质数");

 

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

案例:

对100以内既不是3的倍数也不是5的倍数的数求和

常规思路:对满足条件的数累加

var sum = 0;
for(var i = 1; i<=100; i++){
    if(i%3 != 0 && i%5 != 0){
        sum += i;
    }
}
alert(sum);

 

另一种思路:不满足条件的就放过

var sum = 0;
for(var i = 1; i<=100; i++){
    if(i%3 == 0 || i%5 == 0){
        continue;   //结束本次循环
    }
        sum += i;
}
alert(sum);

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

 

 

 

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

if(条件1){

       if(条件2){

alert(”错误提示1”);

}

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

}else{

       alert(”错误提示2”);

}

换另一个思路来描述,如下:

for(……){

    if(!条件1){

       alert(“错误提示2”);

       continue;

} if(!条件2){

    alert(“错误提示2”);

    continue;

}

循环体主体代码;

}

循环的嵌套:

为什么有循环的嵌套?

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

什么时候用循环的嵌套:

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

比如直角三角形的输出:

for(var i =1;i<=9; i++){
    for(var n = 1;n<=i; n++){
        document.write("*"+"&nbsp;");
    }
   document.write("<br>");
}


原创粉丝点击