JS基礎五

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>");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章