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是表示“當……則……”,也就是當某個條件成立時,則一直重複做某件事。(流程圖)
(調試工具查看程序運行軌跡以及變量的變化情況)
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;
|
循環條件 |
Num <= 999 |
cha<usa
|
循環體 |
var b100 = Math.floor(num / 100); |
cha *= (1+0.08); |
爲下次循環做準備 |
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("*"+" ");
}
document.write("<br>");
}