前言
在設計程式時,我們有時會希望某些程式資源是可以被重複使用,並且在不同的程式中被引用時,變數內容可以是一致的。例如說,我希望我的程式可以共用同一個 DB 物件、同一個計時排程…諸如此類的需求,這時候 Singleton 單例設計模式就派上用場了。
電子、電腦、網路、科技與新知。
在設計程式時,我們有時會希望某些程式資源是可以被重複使用,並且在不同的程式中被引用時,變數內容可以是一致的。例如說,我希望我的程式可以共用同一個 DB 物件、同一個計時排程…諸如此類的需求,這時候 Singleton 單例設計模式就派上用場了。
身為一位程式設計師,是否常覺得一些開發環境實在是笨重又肥大呢? 或者覺得輕巧自由而且許多前輩們愛用的 VIM 或 EMACS 難以駕馭? 這裡有一款你只需要準備好對應的環境,你只需要開啟瀏覽器,就能開始寫程式的工具,它叫做「Cloud 9」!
陣列?啥?是列陣吧?要打仗嗎? 喔,不不不,是陣列無誤。這是英文 Array 翻譯而來的結果。不過,說真的,光聽陣列這兩個字其實頗抽象的,因為從字面上很難去了解它到底是什麼樣的東西。 也許我們可以拿戰爭中常用的陣形來作比喻。
其實陣列,說簡單一點就是一排很多空格的櫃子,每一格都有編號,編號從0到你所設定的格數(長度)為止。以剛剛那個程式碼來講,他第一排軍人的編號是0而不是1,第二排的編號則是1..以此類推。….
陣列?啥?是列陣吧?要打仗嗎? 喔,不不不,是陣列無誤。這是英文 Array 翻譯而來的結果。不過,說真的,光聽陣列這兩個字其實頗抽象的,因為從字面上很難去了解它到底是什麼樣的東西。 也許我們可以拿戰爭中常用的陣形來作比喻。
其實講到了條件判斷就該題一下跳出迴圈的這個流程控制方式。這邊先拿簡單的拿break這個最常見的文字來說明,範例先行!這次的程式碼很短,其實是我省略幾個東西,包含縮排以及if的大小括弧,因為if只有一行需要執行的程式碼,因此是可以省略大小括弧的。好的,那麼我想大家都看見關鍵字break了。[…]
其實講到了條件判斷就該題一下跳出迴圈的這個流程控制方式。 斯斯有兩種,迴圈跳出則有三種。
全部跳出則是return 這邊先拿簡單的拿break這個最常見的文字來說明,範例先行!
int day,money=0;
for(day=0;day<30;day++){
System.out.println(money); //此為JAVA輸出語法,C語言請改用 printf(“%d”,money);
if(money>100) break;
money += 5; //這行等同 money = money + 5;
}
這次的程式碼很短,其實是我省略幾個東西,包含縮排以及if的大小括弧,因為if只有一行需要執行的程式碼,因此是可以省略大小括弧的。
好的,那麼我想大家都看見關鍵字break了。
Break 在英文中有打破、破壞的意思,藉由這個意思代入程式碼中來理解這一小個英文單字在程式碼中到底扮演了何種的角色。
在這段簡易的範例程式碼中,我利用if設定了一個條件,也就是當money這個變數的數值到達100之後程式碼便會執行 break;
這個單字所代表的意思,是的,你會發現程式數到100後便不會再計數下去了。
接下來是 continue ,這個單字在英文的意思是繼續,不過在程式中的繼續是回到一開始再繼續往下。 簡單的例子:
1 2 3 4 5 6 |
int i; for(i=0;i<10;i++){ if(i==5) continue; System.out.println(i); //此為JAVA輸出語法,C語言請改用 printf("%d",i); } |
這個簡單的範例中,若你實際執行的話…
「012346789」某A數著,然後說:「咦? 好像少了5呢!」
是的,這就是 continue 的功用,他不像 break 那樣霸道,直接打壞整個迴圈,而是跳過這次的迴圈再繼續執行。
而若在JAVA中與一個標籤做搭配,此時的功用與C中的 goto 非常類似。
1 2 3 4 5 6 7 |
int i; c: for(i=0;i<10;i++){ System.out.println(i); //此為JAVA輸出語法,C語言請改用 printf("%d",i); if(i==5) continue c; } |
這只是個範例,在這範例的執行結果與上一個範例是很類似的,不過continue只能往上不能往下,這點在撰寫程式的時候要特別注意。
本來是想要再寫一個return的,不過return比較像是在回傳某些東西的時候才會運用比較多,而也正因為它是回傳,所以當return放在流程控制中的時候,就會發現它的功用與 break 非常類似,不同點在於,return還具有回傳數值之類的功能。
因為這樣,關於return的用法我會放在之後介紹到函數以及物件的時候再談囉。
如果,我們其實還滿掛在嘴上的一個詞語,他可以是假設,也可以是一種設想。上一篇文章我們談到條件判斷這玩意,接下來我們就從最常見的”如果”說起。所以上一篇提到的「不會時隔數月」是指數個月以內我就會發出新的文章這樣的意思…好啦,我知道這很白爛,放輕鬆一下咩。回顧一下那篇文章的最後小測試。(注意!這段程式碼使用的輸出方式是JAVA的寫法。)
這世界 如果有如果
如果一切重頭
如果你再 說你愛我
習慣了 熟悉的溫柔
turn around turn around turn around
怎麼還是 一個我
雨滴滴答答的墜落
還有什麼說不出口
淚不停不停的滑落
習慣沒有你的角落
…
這世界 如果有如果
如果一切重頭
如果你還在 請說你愛我
…
《如果有如果/鄧福如》
如果,我們其實還滿掛在嘴上的一個詞語,他可以是假設,也可以是一種設想。
上一篇文章我們談到條件判斷這玩意,接下來我們就從最常見的”如果”說起。 所以上一篇提到的「不會時隔數月」是指數個月以內我就會發出新的文章這樣的意思…好啦,我知道這很白爛,放輕鬆一下咩。 回顧一下那篇文章的最後小測試。(注意!這段程式碼使用的輸出方式是JAVA的寫法。)
1 2 3 4 5 6 7 8 9 10 11 |
int i,j,money = 0; for(i=0;i<20;i++){ if(money==10){ System.out.println("存到"+ money + "元了!"); }else{ System.out.println("現在存了"+ money + "元。"); } money++; for(j=0;j<10000;j++);//延遲一段時間,純粹是想讓數值跑慢點... } |
這裡的一開頭先將 i 、 j 、 money 這三個英文字詞當作一個變數並且是只接受整數(integer)的變數,其中,money這個變數先給了一個0的初始值,也就是0元。
接下來則是for迴圈的部分,我用for來做次數的控制,當然也可以利用while來做另外一種控制(關於這部分可參考這一篇文章)。
到此,我們遭遇了第一個 if 判斷式的挑戰,這個判斷式所在敘述的是「如果 money 等於 10 的時候」就執行內部的程式碼,否則(else) 就執行下段程式碼的內容。
在下面一點的 money++ 這個是在說 money+1 的意思,請注意,這一行程式碼是在 if…else 判斷式之外,也就是說無論如何都會執行,除非for迴圈執行完畢否則每次都會+1。而最後一行我就不細說了。
「咦? 這樣的解釋有點複雜,有沒有簡單一點的呢?」
有的,腦筋動得快的你或許已經猜到這段程式碼是在說什麼事情了,沒錯!就是錢錢的累加啦!XD
利用先前說過的文章閱讀式的方法來解讀這段程式碼你就能夠很輕鬆的了解這段程式碼在敘述些什麼,當然,這是需要聯想的,並不是每個程式碼都適合用錢來當作一個比喻,無論如何,多想像,會有不一樣的收穫!
「我還是不懂…」路人X抱頭。
好吧,那這段程式碼改成文章後就會變成這樣:「20天,每天存1元,存到10元時提示一下,然後每次存錢都顯示目前累積的金額數。」
大概就是這個樣子,我省略了宣告,把的i當作天數,利用for迴圈控制天數,在這裡我是設定20天,而其實這也是當時我設計這個小程式時的概念與想法。
OK,今天就到此結束了,謝謝各位的觀看~ (鞠躬)
前陣子洋洋灑灑的寫了不少與程式設計基礎有關係的文章後,相信想接觸的朋友們一定會有所疑惑。你們應該會想問:「這是什麼東西?」、「這是啥米鬼東西? 看都看不懂…」、「文章? 我她X的看不懂這是三米小朋友…」…等等之類的。我承認,我這是故意的,因為我想讓初入門的各位對這有點些微的概念,我同時也希望大家能夠自動自發地去查詢相關的資料,然後藉由自學…
前陣子洋洋灑灑的寫了不少與程式設計基礎有關係的文章後,相信想接觸的朋友們一定會有所疑惑。
你們應該會想問:「這是什麼東西?」、「這是啥米鬼東西? 看都看不懂…」、「文章? 我她X的看不懂這是三米小朋友…」…等等之類的。
我承認,我這是故意的,因為我想讓初入門的各位對這有點些微的概念,我同時也希望大家能夠自動自發地去查詢相關的資料,然後藉由自學與自尋的過程中讓自己對程式設計以及其語言有更深入的了解,進而引起各位對於程式設計的種種興趣以及降低程式設計的入門門檻… 以上這些都是我當初想架設這個網站初衷的一小角落,剩下的,改日再講,因為今天要講的主題不是這個 😛
條件判斷,乍看之下似乎是個很深奧的名詞,其實不然,這詞比起迴圈來得易懂,因為你生活中就經常用到啊!雖然在許多程式語言的書籍裡會把這個稱做條件分支,但我認為條件判斷比較符合這邊的內容。…還是太難? 沒關係,我把這詞分開來講。
條件判斷,乍看之下似乎是個很深奧的名詞,其實不然,這詞比起迴圈來得易懂,因為你生活中就經常用到啊!雖然在許多程式語言的書籍裡會把這個稱做條件分支,但我認為條件判斷比較符合這邊的內容。
…還是太難? 沒關係,我把這詞分開來講。
條件,就條件啊…就像你心中的理想情人一樣,一定有些條件或者是標準之類的,然後到達了標準之後,再判斷是不是要跟他交往。如何? 這樣清楚條件判斷這四個字的意思了嗎? 蛤? 不夠清楚? 好吧好吧…
假設你在小7買東西,你看著架子上的御飯糰跟國民便當,眼神在兩者之間飄移,然後下定決心拿了國民便當去結帳。
就在你掏出口袋裡的零錢時,你發現你口袋裡其實只剩下51元,這時你當然只能把便當放回去,然後選壽司回家啦~((咦?
這,就是最簡單的條件判斷之一。
「那麼,在程式語言中,要怎麼表達呢? 」
我繼續沿用上面去小7買東西的例子來說明。
1 2 3 4 5 6 |
if(零錢 > 55元){ 國民便當帶回家 }esle{ 壽司帶回家 } |
從上面這程式來看,原則上是不可能被編譯器所接受,因為沒有定義,文法也不對啊!
但,我在這裡只是方便解釋,千萬不要傻傻的Ctrl+C、Ctrl+V喔!
所以,聰明的你看出來了嗎? 對!你看見關鍵字 if 了,真是太棒了! 延續之前文章的觀念,if 在英文中有「如果」、「是否」的意思,所以你知道該怎麼做了,沒錯!就是代入!
就提示到這裡了,我猜你應該懂了,所以以下依照慣例,來個簡單測試,當然,這次的解答絕不會像上次那樣時隔數月啦! XD
1 2 3 4 5 6 7 8 9 10 11 |
int i,j,money = 0; for(i=0;i<20;i++){ if(money==10){ System.out.println("存到"+ money + "元了!"); }else{ System.out.println("現在存了"+ money + "元。"); } money++; for(j=0;j<10000;j++);//延遲一段時間,純粹是想讓數值跑慢點... } |
While是另一個常見的迴圈控制語法,在英文裡 while 有當的意思,請注意是”ㄉㄤ”不是”ㄉㄤˋ”。 while 與 for 有何不同呢? 除了語法上的表達不同之外,其應用的地方也不太相同。以for來講,他最常被應用於準確的次數控制,而while則較常被使用在不明確的次數控制上,當然,在你熟悉了while之後,也是可以讓他具有與for類似的性質。
While是另一個常見的迴圈控制語法,在英文裡 while 有當的意思,請注意是”ㄉㄤ”不是”ㄉㄤˋ”。
「那麼 while 與 for 有何不同呢?」
除了語法上的表達不同之外,其應用的地方也不太相同。
以for來講,他最常被應用於準確的次數控制,而while則較常被使用在不明確的次數控制上,當然,在你熟悉了while之後,也是可以讓他具有與for類似的性質。
或許你會對於上述的次數控制有所疑惑,不過你不用太擔心這問題,因為顧名可思其義啊!
次數控制指的是我要指定某一特定區塊的程式執行多少次,次數到了之後便執行區塊外面的程式。有點複雜,這時你可以回到上一篇觀看 i 先生與 j 先生的例子應可略知一二。
回到正題。 while 一般的 C like 語言寫法會像這樣:
1 2 3 4 5 6 7 8 |
while(判斷式){ . . ...程式碼敘述區。... . . } |
跟 for 比起來,while 精簡許多,只需要給他下一個判斷式就可以跑了。 而他的動作方式是這樣的:「當判斷式的條件成立的時候,就執行區塊裡面的程式碼,直到條件不成立時才結束執行。」
根據這個邏輯,如果寫成這樣的程式碼:
1 2 3 4 5 |
int i; while(true){ i++; } |
那這程式就會進入無限迴圈,直到 i 破表導致程式出現錯誤為止,不過通常這程式早已進入死當狀態…
所以, while 可以怎麼用呢? 我想可以先把 while 當作 for 來說。
試想,for 的基本使用方式是什麼? 對,就是 for(變數指定數值;下判斷式;累加) 從這裡面你發現甚麼了嗎?
是的,就是兩者的共通點「判斷式」。差別只在於,for還有另外兩個設定,也就是給某一變數的初始值以及未達到條件的累加。
那麼如何在看似 for 迴圈殘缺版的 while 有同樣的功能呢? 很簡單,只要把缺少的兩個東西放進就好啦~
像這樣…
1 2 3 4 5 6 |
int i=0; while(i<10){ printf("%d",i); i++; } |
這段程式碼的功能等同於
1 2 3 4 5 |
int i; for(i=0;i<10;i++){ printf("%d",i); } |
從以上這兩個程式就可以很明顯的看出,for 的專業在於明確的次數控制,而且閱讀起來也較容易理解。而同功能的 while 程式在閱讀上就沒有 for 這麼好理解,尤其是當 while 區塊裡要做的事情很多的時候。所以我說,while 的專業在於不明確的次數控制。
既然,while 的專業是不明確的次數控制,那該怎麼利用呢? 這就要問施主您啦~((被打
這樣好像太不負責任了,讓我想想…想想…想想…想想…想想…
問各位有沒有這樣的經驗? 你說我沒問? 等我一下咩…
就是在做一件事情,但是那件事情在還沒到達某個條件前你就必須一直給他做下去,直到滿足那個條件為止。
我拿寫報告來說好了,如果有一門課你必須繳出一篇報告才能過,而因為之前玩過頭,忘記做報告這件事,就當你想起來的時候,繳交的最終期限就在明天時你會怎樣?
「杯具。」
欸~ 是一場悲劇沒錯…但你還是要做啊!不然被當掉是一件很痛苦的事情…
所以你一定會熬夜將這報告完成,而你還沒完成就等於你不會過,所以,你就必須要一直做一直做,做到完成它為止。這就是一種不明確的次數控制了,難道你知道你報告何時寫出來?
好吧,我承認不明確的次數控制好像有點冗長難記,簡單講就是,當條件未到,你就必須一直做這樣的意思啦~
如何?希望這例子可以讓大家更了解 while 的用途與意義,甚麼? 你說沒有範例程式?
好吧好吧…
1 2 3 4 5 6 7 8 9 10 |
boolean paper = false; //報告還沒做 int words = 0, min_words = 1000; //報告要至少1000字才算有做 while(!paper){ //當報告真的沒做 if(words <= min_words){ paper = true; //報告做完了 printf("報告做完了!"); } words++; //字數增加中... } |
經過上一篇沒有任何語法解說的文章後,相信各位對於迴圈這東西仍然是一頭霧水,這,不意外。
今天,這篇文章將以實際的例子帶領各位進入迴圈的領域,以下文章將會有3種語言版本的迴圈,分別是C、Java、Visual Basic這三種學校教學常見的語言。另外,獨夜也希望大家在閱讀的同時能練習一遍,自己實際跑一次的感覺絕對比光看不練的感覺還要棒啊!
經過上一篇沒有任何語法解說的文章後,相信各位對於迴圈這東西仍然是一頭霧水,這,不意外。
今天,這篇文章將以實際的例子帶領各位進入迴圈的領域,以下文章將會有3種語言版本的迴圈,分別是C、Java、Visual Basic這三種學校教學常見的語言。另外,獨夜也希望大家在閱讀的同時能練習一遍,自己實際跑一次的感覺絕對比光看不練的感覺還要棒啊!
一樣,先以for來做開頭。
1 2 3 4 5 6 7 8 |
int i,j; for(i=0;i<10;i++){ for(j=0;j<5;j++){ System.out.println("j="+j); } System.out.println("i="+i); } |
以上語法於Java中適用,以下則是VB的版本。
1 2 3 4 5 6 7 8 |
int i,j for i = 1 to 10 for j = 1 to 5 print j next j print i next i |
對了,還有 C/C++ 的版本
1 2 3 4 5 6 7 8 |
int i,j; for(i=0;i<10;i++){ for(j=0;j<5;j++){ printf("j= %d",j); } printf("i= %d",i); } |
知道的讀者或許會很熟悉,沒錯,這就是上次那篇文章的題目,今天這篇文章我先解釋我怎麼解讀這些程式碼的。
我說過,以閱讀文章的方式去解讀程式碼絕對比你把程式碼當作程式碼來看來得輕鬆許多,這邊我先忽略輸出的程式碼。
首先,我定義了 i 跟 j 為整數(integer)。
然後我給 i 一個數字 0 ,若 i 小於 10 的時候,i 就會加 1。
再來我同樣地也給 j 一個數字 0 ,若 j 小於 5 時,j 就會加 1 。
好了,以上就是我對這程式碼的解讀。再來,我們需要一點區域的概念,或者稱區塊的概念。
在 C like 的程式語言中,經常使用大括號來當作區塊的分界線,”{“這個符號到表區塊的起始點,”}”這個符號則代表結束,太抽象嗎? 沒關係,看了下面這張圖後你就會了解區塊到底是什麼了。直接以範例程式來做說明。
通常最外層會用main包起來,以Java為例就像這樣:
1 2 3 4 5 6 7 8 9 10 11 12 |
public class test_for { public static void main(String[] args) { int i,j; for(i=0;i<10;i++){ for(j=0;j<5;j++){ System.out.println("j="+j); } System.out.println("i="+i); } } } |
OK,現在我們了解到,程式碼也是有地域性的,在他的領地中,裡面的東西就是屬於他執行的範圍,其他的他一概不會去理會,因為那不甘他的事。換句話說,他只會做主人交給他的事情,並不會也不可能主動去干涉其他人在做的事情。
回頭來看這些程式碼。
1 2 3 4 5 6 7 8 |
int i,j; for(i=0;i<10;i++){ for(j=0;j<5;j++){ System.out.println("j="+j); } System.out.println("i="+i); } |
因為我們知道了他的領域性,所以在這個程式碼裡,我們可以分成兩個區塊,一個是屬於 i 的,另一個則是 j 的,這在剛剛的說明文字裡就已經分好了。
區塊分好了後,我們來了解一下 for 的真正意義,也就是說在我給他了那些數值與判斷式之後他所做的動作。 從前面的描述中,我們可以知道,他是依著條件在走的,依什麼條件?
依你給的第2個數值,也就是判斷式,當到達判斷式的條件後他就不會繼續執行區塊裡的東西了,直接拿實際例子來說,i 會在執行完裡面的程式後自動加 1 ,直到加到10的時候跳出,因為他明顯的大於10了。
簡單說就是 i 先生一開始手上沒有半顆蘋果(i = 0),然後他做了點工作後,得到一顆蘋果(i++)。最後手上累積了 9 顆蘋果(i<10)終於拿不下了,所以他就辭職不幹了…((咦?
同樣的道理,j 先生跟i 先生一樣,不過在這程式裡面的 j 先生是 i 先生的助手,i 先生每次都會叫 j 先生幫忙做 5 個工作,做完那 5 個工作後,j 先生會跟 i 先生說:「我做好了!」…如此循環的結果,就是 j 先生的工作量遠多於 i 先生,所以結論是 i 先生是個壞上司…XD
正經點,在這程式裡面,j 先生做 5 次工作等於 i 先生的一次,也就是說,當你執行程式時你會發現 i 出現一次,j 會出現 5 次,若在 j 先生的工作範圍裡面放上一段程式碼讓他累加,你會發現最後出來的數值是 i 與 j 所做次數的相乘結果,也就是 50!
你問我怎麼加入? 像這樣就好囉~ (Java)
1 2 3 4 5 6 7 8 |
int i,j,k=0; for(i=0;i<10;i++){ for(j=0;j<5;j++){ k++; } } System.out.println(k); |
不知道以上解說有沒有讓你更了解了for了呢? 希望能幫上你的忙,預祝閱讀本篇文章的您有所收穫!
第一篇關於程式語言的文章,我就先直接切入程式語言最常見也最常應用,同時也是最常讓你腦筋打結的的東西,迴圈。而,在文章開始之前,我要麻煩觀看本文的各位先將迴圈這個名詞暫時忘記,這是為了避免你腦袋真的不停的旋轉…
第一篇關於程式語言的文章,我就先直接切入程式語言最常見也最常應用,同時也是最常讓你腦筋打結的的東西,迴圈。而,在文章開始之前,我要麻煩觀看本文的各位先將迴圈這個名詞暫時忘記,這是為了避免你腦袋真的不停的旋轉…