循环结构
先来看看生活中的场景:
(1)食堂阿姨打菜:接过顾客的餐盘→询问菜品→打菜→递回餐盘,重复以上过程,直到所有顾客的菜都打完
(2)快递员送快递:查看送件地址→赶往目的地→电话告知收件人→收件人签收→交快递件,重复以上过程,直到所有需要送的快递都处理完了。
(3)公交司机.........
(4)作业流程......
以上场景都有一个共同点:有条件地重复的做一件事情,每一次做的事情不同但类似
程序是为了解决实际问题。实际问题中存在着重复的动作,那么程序也应该有相应的描述,这就是循环
-案例:
/* 计算1+2+3+4.......+10*/
/* 方案一 */
varsum =1+2+3+4+5+6+7+8+9+10;
/*方案二*/
varsum2 = 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(条件)
While和do……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; |
循环条件 |
num<=999 |
chinaGdp <= usaGdp |
循环体 |
var b100 = Math.floor(num / 100); |
usaGdp *=(1 + 0.02); |
为下次循环做准备 |
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(开始值;循环条件;步长){
/*重复做的事情*/
}