韓順平_輕鬆搞定網頁設計(html+css+javascript)_第24講_js案例講解_js自定義函數_學習筆記_源代碼圖解_PPT文檔整理

文西馬龍:http://blog.csdn.net/wenximalong/

關於for循環

案例:

打印一行10個星號

for(var i=0;i<10;i++){
				document.writeln("*");
			}

或者②

for(var i=1;i<=10;i++){
				document.writeln("*");
			}
一個是i=0;i<10;而另一個是i=1;i<=10;兩者都是循環打印星號10次。

在①中,i取值:0,1,2,3,4,5,6,7,8,9共10個。

在②中,i取值:1,2,3,4,5,6,7,8,9,10共10個。


<html>
	<head>
		<script language="javascript">
			for(var i=0;i<10;i++){
				document.writeln("*");
			}
			document.writeln("<br/>=========<br/>");
			for(var i=1;i<=10;i++){
				document.writeln("*");
			}
		</script>
	</head>
	<boyd></body>
</html>

初學者,容易對i=0開始計數,轉不過來,因爲我們現實生活中計數都是從1開始,所以看i=1;i<=10;更加習慣些。

數組小標從0開始開始,爲什麼?找到這樣的解釋:

C的許多特徵是爲了方便編譯器設計者而建立的(爲什麼不呢?開始幾年C語言的主要客戶就是那些編譯器設計者)。數組下標從0而不是從1開始也是根據編譯器設計者的思路而來的,因爲偏移量的概念在他們心中已是根深蒂固。但這種設計讓非編譯器設計者感覺很彆扭,他們可能會在一個定義的a[10]的a[10]存儲數據,導致有一位偏移(one-bit offset)錯誤。
java爲何下標也從0開始呢,估計是考慮到習慣性問題。C/C++程序員被固化成下標從0開始後,想更改它也是件費勁事。

沒什麼可說的,就是這麼定義的,接受它。

============

(1)打印完整金字塔

我自己的思考過程,參看上一篇博文:javascript打印完整金字塔型_完整菱形_空心菱形_思路算法詳解_js源代碼


 觀察發現:


第一行星號的個數爲1;

第二行的星號個數爲2*2-1;

第三行星號的個數爲2*3-1;

第四行星號的個數爲2*4-1;以此類推…

星號的個數,即爲要循環打印幾次,這裏設置i=1更好理解些。

//金字塔
			for(var i=1;i<=n;i++){
				for(var j=1;j<=n-i;j++){
					document.write(" ");
				}
				for(var j=1;j<=2*i-1;j++){
					document.write("*");
				}
				document.writeln("<br/>");
			}
(2)打印空心三角形

發現如下規律:

①除去最後一行後,每一行,我們要打印的是內層循環的第一次和最後一次,就是三角形的邊上的星號。例如第二行,一共有三個,第一個星號,第二個空格,第三個星號,當設置i=1開始,則i取值1,2,3,用if語句只打印1和3,碰到2就打印星號。以此類推。

②特殊情況:最後一行,要滿打。

//空心金字塔
			for(var i=1;i<=n;i++){ //行數
				for(var k=1;k<=n-i;k++){ //打空格
					document.writeln(" ");
				}
				for(var j=1;j<=(2*i-1);j++){ //打星號
					if(i==n){ //最後一行
						document.writeln("*");
					}else if(j==1 || j==(2*i-1)){ //兩邊
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}
(3)打印空心菱形的下半部分,不帶底邊的,如下圖所示


截圖帶上底邊,是爲了方便觀察規律,這是n=6時候的情況,6行。

觀察上圖發現如下規律,除去底邊後,要打印的有5行。

①每行前面的空格數,和行數是一致的,控制打印空格的循環層,設置k=1;k<=i;

②在打印星號的循環層,我們要打印的就是每次循環的第一個星號和最後一個星號,最後一個星號和行數的關係爲:9-2*i+2;當i=1時,打印第9個星號


//菱形下半部分,不帶底邊的
			for(var i=1;i<=n-1;i++){ //不帶底邊,就可以少打印一行
				for(var k=1;k<=i;k++){
					document.writeln(" ");
				}
				for(var j=1;j<=(9-2*i+2);j++){
					if(j==1 || j==(9-2*i+2)){
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}

(4)打印菱形的上半部分,帶底邊,但是僅僅保留底邊的第一個和最後一個星號。把if(i==n)的判斷去掉。


for(var i=1;i<=n;i++){ //行數
				for(var k=1;k<=n-i;k++){ //打空格
					document.writeln(" ");
				}
				for(var j=1;j<=(2*i-1);j++){ //打星號
					if(j==1 || j==(2*i-1)){ //兩邊
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}
(5)打印完整菱形,上面的分析就可以得出了


//空心菱形
			for(var i=1;i<=n;i++){ //行數
				for(var k=1;k<=n-i;k++){ //打空格
					document.writeln(" ");
				}
				for(var j=1;j<=(2*i-1);j++){ //打星號
					/*if(i==n){ //最後一行
						document.writeln("*");
					}else*/ if(j==1 || j==(2*i-1)){ //兩邊
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}
			for(var i=1;i<=n;i++){
				for(var k=1;k<=i;k++){
					document.writeln(" ");
				}
				for(var j=1;j<=(9-2*i+2);j++){
					if(j==1 || j==(9-2*i+2)){
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}
完整圖形:


<html>
	<head>
		<!--
		   *    1
		  ***   2*2-1
		 *****  2*3-1 
		******* 2*4-1
		-->
		<script language="javascript">
			var n=window.prompt();
			//金字塔
			for(var i=1;i<=n;i++){
				for(var j=1;j<=n-i;j++){
					document.write(" ");
				}
				for(var j=1;j<=2*i-1;j++){
					document.write("*");
				}
				document.writeln("<br/>");
			}
			//空心金字塔
			for(var i=1;i<=n;i++){ //行數
				for(var k=1;k<=n-i;k++){ //打空格
					document.writeln(" ");
				}
				for(var j=1;j<=(2*i-1);j++){ //打星號
					if(i==n){ //最後一行
						document.writeln("*");
					}else if(j==1 || j==(2*i-1)){ //兩邊
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}
			//document.writeln("<br/>");
			//菱形下半部分,不帶底邊的
			for(var i=1;i<=n-1;i++){
				for(var k=1;k<=i;k++){
					document.writeln(" ");
				}
				for(var j=1;j<=(9-2*i+2);j++){
					if(j==1 || j==(9-2*i+2)){
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}
			//空心菱形
			for(var i=1;i<=n;i++){ //行數
				for(var k=1;k<=n-i;k++){ //打空格
					document.writeln(" ");
				}
				for(var j=1;j<=(2*i-1);j++){ //打星號
					//把if(i==n)判斷去掉,則底邊也是打印第一個和最後一個星號
					/*if(i==n){ //最後一行
						document.writeln("*");
					}else*/ if(j==1 || j==(2*i-1)){ //兩邊
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}
			for(var i=1;i<=n;i++){
				for(var k=1;k<=i;k++){
					document.writeln(" ");
				}
				for(var j=1;j<=(9-2*i+2);j++){
					if(j==1 || j==(9-2*i+2)){
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}
		</script>
	</head>
	<body></body>
</html>

至此:配合我上一篇博文,js打印完整金字塔型,完整菱形,完整空心菱形就告一段落,程序的優化以後再談。

★★★★★補充:★

上面的(3),考慮的是n=6時候的情況,9-2*i+2;沒有一般性。

如果還是還是上面的代碼,當n=7的時候,空心菱形就錯亂了,如下圖所示:


需要改進

當我們把底邊下面的一行,記爲第一行的時候。

當n=5時,最後一個星號爲7

當n=6時,最後一個星號爲9

當n=7時,最後一個星號是11

當n=m時,最後一個星號是2*m-3

當n=7時


改進後的代碼:

//菱形下半部分,不帶底邊的
			for(var i=1;i<=n-1;i++){
				for(var k=1;k<=i;k++){
					document.writeln(" ");
				}
				for(var j=1;j<=(2*n-3-2*i+2);j++){
					if(j==1 || j==(2*n-3-2*i+2)){
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}
當n=7時,空心菱形如下圖所示:


改進後的代碼,把原來的9-2*i+2循環註釋掉

	for(var i=1;i<=n;i++){
				for(var k=1;k<=i;k++){
					document.writeln(" ");
				}
				/*for(var j=1;j<=(9-2*i+2);j++){
					if(j==1 || j==(9-2*i+2)){
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}*/
				for(var j=1;j<=(2*n-3-2*i+2);j++){
					if(j==1 || j==(2*n-3-2*i+2)){
						document.writeln("*");
					}else{
						document.writeln(" ");
					}
				}
				document.writeln("<br/>");
			}

後記:羅馬不是一天建成的,代碼也不是一下就寫好的,不怕錯,錯了找到然後解決,更能加深理解。

==================

javascript——函數
內容介紹

1.常用函數介紹
2.js面向對象編程——對象與對象實例
學習目標
1.充分理解函數的感念
2.能熟練的自定義函數
3.掌握js中常用的系統函數

拋出問題:函數——爲什麼需要函數
請完成一個這樣的程序
輸入兩個數,再輸入一個運算符(+,-,*,/),得到結果
demo2.html

<html>
	<head>
		<script language="javascript">
			//輸入兩個數,再輸入一個運算符(+_*/),得到結果
			var num1=window.prompt("請輸入第一個num");
			var num2=window.prompt("請輸入第二個num");
			var operator=window.prompt("請輸入運算符");

			num1=parseFloat(num1);
			num2=parseFloat(num2);

			var res=0;
			if(operator=="+"){
				res=num1+num2;
			}else if(operator=="-"){
				res=num1-num2;
			}else if(operator=="*"){
				res=num1*num2;
			}else{
				res=num1/num2;
			}
			document.writeln("res="+res);
		</script>
	</head>
	<body></body>
</html>

通過這個,引出函數的必要性

再一個問題:如果在另外的html文件(比如a.html,b.html,c.html) 中也需要完成:輸入兩個數,再輸入一個運算符(+,-,*,/),得到結果。那又該怎麼辦啊?

解決方法——函數:
爲完成某一個功能的程序指令(語句)的集合,稱爲函數。
在js中,函數分爲:自定義函數、系統函數(經常查看js幫助手冊)

爲了複用,單獨的js文件

js函數
①爲什麼需要函數
②函數的基本概念
爲完成某一個功能的代碼(語句,指令)的集合
③基本語法
function 函數名(參數列表){
//代碼…
return 值;//可以選擇
}
demo3.html

<html>
	<head>
		<script language="javascript">
			//輸入兩個數,再輸入一個運算符(+_*/),得到結果
			var num1=window.prompt("請輸入第一個num");
			var num2=window.prompt("請輸入第二個num");
			var operator=window.prompt("請輸入運算符");

			num1=parseFloat(num1);
			num2=parseFloat(num2);

			//如何調用函數

			document.writeln("res="+jsSuan(num1,num2,operator));
			//自定義函數
			function jsSuan(num1,num2,operator){ //特別強調 參數名請不要帶var
			var res=0;
			if(operator=="+"){
				res=num1+num2;
			}else if(operator=="-"){
				res=num1-num2;
			}else if(operator=="*"){
				res=num1*num2;
			}else{
				res=num1/num2;
			}
			return res; //返回
			}
			
		</script>
	</head>
	<body></body>
</html>

改進:
把上面的函數單獨提出,寫到js文件中,然後在需要的地方引入
myfuns.js

function jsSuan(num1,num2,operator){ //特別強調 參數名請不要帶var
			var res=0;
			if(operator=="+"){
				res=num1+num2;
			}else if(operator=="-"){
				res=num1-num2;
			}else if(operator=="*"){
				res=num1*num2;
			}else{
				res=num1/num2;
			}
			return res; //返回
			}

demo4.html

<html>
	<head>
		<script language="javascript" src="myfuns.js"></script>
		<script language="javascript">
			//輸入兩個數,再輸入一個運算符(+_*/),得到結果
			var num1=window.prompt("請輸入第一個num");
			var num2=window.prompt("請輸入第二個num");
			var operator=window.prompt("請輸入運算符");

			num1=parseFloat(num1);
			num2=parseFloat(num2);

			//外部引用

			document.writeln("res="+jsSuan(num1,num2,operator));
		</script>
	</head>
	<body></body>
</html>


韓順平_php從入門到精通_視頻教程_學習筆記_源代碼圖解_PPT文檔整理_目錄

發佈了55 篇原創文章 · 獲贊 8 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章