讓你用其它語言寫也是完全一樣的道理,
這道題估計大家在學習C語言的時候就見過……
也就是列印以下的鬼東西:
當時候看到迴圈結構的時候覺得很無聊,就相當不屑這題,沒有好好仔細想想,
因為要是放在JavaScript完全可以這樣寫,甚至還不算是JavaScript,僅僅就是一個html:
<html><head><meta http-equiv="content-type" content="text/html;charset=gb2312"/></head><body>&nbsp;&nbsp;*&nbsp;********&nbsp;***&nbsp;&nbsp;*</body></html>
這裡之所以不用utf-8編碼是因為utf-8對於nbsp的處理與*的字型會導致排版錯亂,就是不是用標準的宋體字,從而導致最終的結果無法查看。
反正你出題人出多少行,我都可以複製粘貼上面的內容完全可以實現,但是,今天編程編到一定量,有點大資料概念的時候,又見到這題,仔細思考了一下,要是出題人要求輸出二十萬行這樣中間軸對稱的星型金字塔,我TMD就呵呵了。
所以還是要徹底搞明白這個怎麼實現,雖然在實際的編程中不會出現這樣的編程,但是,據說一些無聊的面試還是會出這題,至少,後來者問你C語言的時候,問你如果輸出二十萬行這樣的中間軸對稱的星型金字塔,你還是要會,這題如果第一次做不好做的。
一、基本目標
首先彈出一個輸入框,讓使用者輸入一個奇數,畢竟軸對稱需要一個奇數,
然後為了程式的健壯性,必須對使用者輸入的東西進行判斷,如果輸入的不是奇數,就彈出提示,不再執行後面的程式,怎麼JavaScript判斷一個奇數,我已經在《【JavaScript】對數的判斷與對數的處理》(點擊開啟連結)說過,不再進行贅述。
考慮到瀏覽器的負載,這裡,使用者輸入的奇數,我只允許去到189,你調大一點也可以,189由於在我的電腦裡面感覺還可以,所以才定這個數的,沒有什麼特別的意義,亂輸入的,不是故意測試的。
輸入一個189行,IE已經彈出“中止指令碼”的提示了,但不中止也完全沒有問題。
運行結果如下:
如果是在寫C語言程式或者其他程式,這個值絕對可以定大一點。
二、基本思想
這個弄懂就非常好寫了。
首先,我們僅僅是要在*的左邊輸出空格,右邊就沒有必要輸出空格了,輸完*就直接換行
分兩部分,一部分是上半部分i<=n/2的時候,另一部分是下半部分i>n/2的時候,
之所以要這樣分是因為這兩部分輸出的*號與輸出的空格數是不同的。
之後就是初中都會的找規律問題了,反正我就找到了如上的規律,編程運行時沒有問題,其它數學帝找到更牛B的運算式,小弟甘拜下風。
三、製作過程
代碼非常簡單,就是條件結構與迴圈結構的表達,上面的思想弄懂了,不用說了。
這裡可能會有人覺得奇怪,為何我要先n++然後n%2!=0再來判斷,也就是判斷n+1是偶數來判斷n是否奇數,
這裡主要是為了迎合下面的for迴圈結構……
<html><head><meta http-equiv="content-type" content="text/html;charset=gb2312"/></head><body></body></html><script>var i,j,k,n;n=window.prompt("請輸入要輸出的行數n,為了形成軸對稱,所以你輸出的必須是奇數。");if(isNaN(n)||!n)alert("你輸入的不是數。");else{n++;if(n%2!=0)alert("你輸入的不是奇數。");else if(n>190){alert("不要這麼大嘛。臣妾做不到啊。");}else{for(i=1;i<n;i++){if(i<=n/2){for(k=n/2-i;k>0;k--)document.write("&nbsp;");for(j=0;j<2*i-1;j++)document.write("*");}else{for(k=i-n/2;k>0;k--)document.write("&nbsp;");for(j=0;j<2*(n-i)-1;j++)document.write("*");}document.write("<br>");}}}</script>
說多了也是淚,自己體會……