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(条件)
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(开始值;循环条件;步长){
/*重复做的事情*/
}
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>");
}