文西馬龍: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>