for 循環
for語句也是一種前測試循環語句,但它具有在 執行循環之前初始化變量 和 定義循環后要執行的代碼的能力
for循環中專門提供了位置來放置循環的三個表達式
定義一個循環需要做實現這三步:
1、初始化表達式
2、條件表達式
3、更新表達式
語法:
for(①初始化表達式;②條件表達式;③更新表達式){ 循環體語句; }
for循環執行過程:
1、執行初始化表達式,初始化變量;(初始化表達式只執行一次)
2、執行條件表達式(Boolean值),判斷是否執行循環
- 如果表達式值為true則執行循環體,
- 如果表達式值為false則退出循環;
4、執行更新表達式,更新表達式執行完之后,則繼續執行第2步
如此循環往復,直到條件表達式的值為false。
注意:
1、for語句的三個表達式可以不寫,也可以寫在外面(兩個分號;是必不可少的,無論寫不寫表達式)
2、在for循環的變量初始化表達式中,也可以不使用var 關鍵字。變量的初始化可以在外面定義;
3、如果for循環中不寫任何表達式只寫兩個分號; 那么此時for循環就是一個死循環,會一直執行下去
實例:
1、要求用戶輸入班級人數,之后依次輸入每個學生的成績,最后打印出該班級的總成績和平均成績。
思路分析:
彈出輸入框輸入班級總人數 num
依次輸入學生成績(保存到變量 score),使用 for循環,彈出的次數和班級總人數有關。
加算成績,求總成績sum,再求平均成績avg
最后彈出結果
注意:prompt 輸出的是字符串類型的值,想參與數值運算需要
var num = prompt('請輸入班級總人數:');//請輸入班級總人數 var sum = 0;//求和變量 var avg = 0;//求平均值的變量 for(var i = 1;i<=num;i++) { var score = prompt('請輸入第' + i + '位學生成績'); sum = sum + parseFloat(score); } avg = sum/num; alert('總成績為:' + sum); alert('平均成績為:' + avg);
for循環的嵌套
所謂for循環的嵌套就是一個大的for循環里面嵌套着一個或是多個小的for循環。
1、嵌套for 循環語法結構:
for(外層初始化變量 ; 外層的條件表達式 ; 外層的更新表達式) { for(里層的初始化變量 ; 里層的條件表達式 ; 里層的操作表達式) { // 執行語句 } }
2、里層循環可看做是是外層循環的執行語句
3、外層循環執行一次,里面循環就會執行全部
通過for循環來判斷條件輸出內容。for循環嵌套的實質就是:
外層for循環控制循環的高度(行數);
內層for循環控制循環的寬度(列數);
可以通過幾個例子來理解for循環嵌套
實例一:
首先如果我們希望實現圖一這種效果,除了可以使用多次重復的相同代碼輸出,還可以使用更加簡便的for循環來實現結果。
實現代碼:
<script> document.write("★★★★★★<br />"); document.write("★★★★★★<br />"); document.write("★★★★★★<br />"); document.write("★★★★★★<br />"); document.write("★★★★★★<br />"); document.write("★★★★★★<br />"); </script>
等價於:
外層的for循環,定義一個變量 i(初始變量),在這里面 i 的初始值為0,0小於6為真(執行條件表達式並判斷)進入循環輸出一次★,然后再進行一次自增 i 的值變為1(更新表達式);
執行完畢變量 i ++自增(更新表達式)之后,再執行第二步比較 i 與 6 的大小。 當 i 自增到 6時,6 < 6結果為false,所以最后循環停止之后共在頁面輸出了5次,最終 i 的結果為 6。
這個for循環可以執行從0~5 共6次(for循環執行了幾次,圖形的高度就是多少,外層循環決定了圖形的高度)
for(var i = 0 ; i < 6 ; i++){ document.write("★★★★★★<br />"); }
使用for循環嵌套實現效果:
外層循環每執行一次,內部循環就執行從0~4,共 5 次。所以每一行的寬度是5。
外部循環共執行了6次,所以最后形成的是6*5的圖形。
注意:內部for循環決定的是圖像的寬度
for(var i = 0 ; i < 6 ; i++){ document.write("<br />"); for(var aa = 0 ; aa < 5 ; aa++){ document.write("* "); } }
實例二:
使用for循環嵌套實現三角形圖形效果。如下圖所示:
分析如何實現這個圖形(aa與i的關系是 aa=i+1):
實現代碼:
for(var i = 0 ; i < 6 ; i++){ document.write("<br />"); for(var aa = 0 ; aa < i + 1 ; aa++){ document.write("* "); } }
上面的例子是實現正着的三角形,那么又該如何實現下面這種倒着的三角圖形呢?
實現原理(aa與i的關系是 aa=5-i):
實現代碼:
for(var i = 0 ; i < 5 ; i++){ document.write("<br />"); for(var aa = 0 ; aa <5-i ; aa++){ document.write("* "); } }
或者
for(var i = 1;i<=6;i++){ document.write('<br />'); for(var aa=i;aa<=6;aa++) document.write('* '); }
實例三:
輸出九九乘法表
根據外層循環控制高度,內層循環控制寬度這個規律來分析九九乘法表的結構:
乘法表共有9層,所以外部循環的變量 i的條件表達式是:i < 9;
創建內部循環來控制內部循環的寬度,第一行寬度是1,第二行寬度是2,第三行寬度是3……
之后內一行的列數(寬度)隨着行數的增加而增加一列,所以內部循環的變量aa的條件表達式是:aa <=1;(或是 aa < i+1;)
實現代碼:
for(var i= 0 ; i <=9 ; i++){ for(var aa = 1 ; aa <i+1 ; aa++){ document.write(aa+"*"+i+"="+i*aa); } document.write("<br />"); }
做到這一步之后,來看一下效果(這個效果和我們預想中的好像還有些差距,它不夠美觀,每行的公式都擠在一起。):
實現更加美觀的乘法表:
在循環代碼輸出中添加span元素,定義body主體部分的寬度,將span元素改為inline-block行內塊元素,設置其固定寬度,使乘法表的每個公式排列整齊。
<head>
<style> body{ width:2000px;
} span{ display:inline-block; width:80px;
}
</style>
</head>
<body>
<script>
for(var i= 0 ; i <=9 ; i++){ for(var aa = 1 ; aa <i+1 ; aa++){ document.write("<span>"+aa+"*"+i+"="+i*aa+"</span>"); } document.write("<br />"); } </script>
</body>
實例四:
打印一個1~100之間的質數
質數(prime number)又稱素數,有無限個。一個大於1的自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的因數;否則稱為合數。
根據算術運算法據,每一個比1大的整數,要么本身是一個質數,要么可以寫成一系列質數的乘積;而且如果不考慮這些質數在乘積中的順序,那么寫出來的形式是唯一的。最小的質數是2。
創建外部循環,定義一個初始變量 i=2,查找2~100內的所有數,並創建一個布爾值,用以保存結果,默認 i 是質數。
創建內部循環,獲取2~i之間所有數,使用 if 分支判斷 i 是否是質數。
在這里判斷 i 是否是質數的方法。外部循環循環一次,返回一個i值。內部循環里面查找一遍所有小於i,又大於2,且又不是i本身的數,賦值給aa。
再用 i 模以 aa (質數除了1和它本身余數都不為0),如果進入判斷則證明 i 不是質數,修改 flag 值為 false。
for(var i = 2 ; i <= 100 ; i++){ // 創建一個布爾值,用來保存結果,默認i是質數 var flag = true; // 判斷 i 是否是質數 // 獲取2— i 之間的所有數 for(var aa = 2; aa<i ; aa++){ // 判斷 i 是否能被aa整除 if(i % aa == 0){ // 如果進入判斷則證明 i 不是質數,修改flag值為false; flag = false; } } if(flag){ document.write(i); // 如果是質數,則打印 i 的值 }}
輸出結果:
實例五:
質數求和:
基本框架和例四是相同的,判斷並查找2~100之間的質數。
一個數從1開始除,一直除到它本身,如果是質數,就應該有兩個因數(1和自身)。通過bb是否為2來判斷 i 是否是質數。
如果是質數那么就執行 sum += i 求得1~100內所有質數的和。
var sum = 0; for(var i = 2 ; i<=100 ; i++){ var bb = 0; for(var aa=1 ; aa<= i ; aa++){ if(i % aa == 0){ bb += 1; } } if(bb == 2){ sum += i; } }document.write(sum);
最終結果是1060
當然除了這種方法還有很多方法去判斷是否是質數求取質數之和,感興趣的話可以自己去研究搗鼓一下。