[程式設計的壹貳參肆]程式語言的基礎知識(II) — 判斷式及迴圈
[前言]
這週我們要來學習程式語言的迴圈及判斷式,不過在這之前,我們先來看看程式如何變成電腦看懂的1, 0,因為開發環境的設定比較冗長,我將三個程式開發環境(Command Line)設定分為三篇文章 — C++, java, python,有興趣的人可以點進去看一下,這系列程式基礎文章會是由JAVA為主的教學,不過其他語言的語法其實都長很像,重點是思考的方式及邏輯!
因為怕有些人沒有看開發環境設定的文章,還是稍微說明一下開發軟體以及java 編譯指令,因為我個人非常喜歡用Command Line 開發,對於沒有要製作大型project,純粹只是想要確認一些程式流程的演算法或是做一些單元測試有很大的幫助,能夠節省掉許多開發時間把重點放在程式流程,也可以順便了解編譯流程,以後遇到開發環境設定的問題比較容易知道問題在哪以及如何解決!
[第一個JAVA程式編譯]
這邊我是使用Visual Studio Code 作為開發程式的編輯軟體,他不僅是個編輯軟體,如圖他也附帶Command Line(Terminal)視窗,以及許多外掛套件,並且可以直接進行除錯,支援的程式語言也相當多元
當然你們也可以選擇自己喜歡的開發環境,例如Visual Studio for C/C++、Intellij for JAVA、Spyder for python
在JAVA 的應用程式都會有一個class 類別名稱,而類別名稱一定要跟檔案名稱一樣,像下面程式碼一樣,而整個專案只能有一個public class,名稱為CodingWorld,那檔名就會是CodingWorld.java
裡面會有一個public static void main的函式,就是JAVA程式的進入點
CodingWorld.java
///EX01:
public class CodingWorld
{
public static void main(String[] args)
{
System.out.print(“Welcome to my Coding World! \n”);
}
}
///Output Welcome to my Coding World!
將上面這段程式碼複製到Visual Studio Code ,存成CodingWorld.java,View>Integrated Terminal,輸入javac CodingWorld.java,看到一個.class檔案跑出,再執行java CodingWorld 就會看到印出Welcome to my Coding World!
JAVA 和C/C++一樣在運算式的後面都必須有個分號 “ ; ”,來讓編譯器知道運算式已經結束,我也習慣在運算子與運算元之間加入一個空格,看起來程式會比較整齊,不會密密麻麻擠在一坨
上一篇文章有介紹變數類型,這是我們要來進入程式的流程控制,每種程式語言都有流程控制的語法,下面這個表格是JAVA使用的流程控制關鍵字,不過除了throw,其他的關鍵字都是大部分程式語言共同擁有的
[判斷式 Judgment]
在上一篇文章我們知道程式的邏輯運算子:
● > 大於:if(a > b)
● >= 大於等於:if(a >= b)
● <小於:if(a < b)
● <=小於等於:if(a <= b)
● ==是否 等於:if(a == b)
● !=是否 不等於:if(a != b)
● &&是否 a與b兩者皆成立:if(a && b)
● ||是否 a與b有一者成立:if(a || b)
● !a 的反向if:if(!a)
這些運算子運算出來的值都是屬於boolean(布林值的true, false),這些值(value)是變數也可以拿來判斷程式的流程要怎麼走下去,我們假設今天有一位同學Jhon,Jhon的錢包有50元,而有一包餅乾賣45元,另一包新出的巧克力要賣80元,那Jhon的錢足夠買哪一個呢?
在這件事情上,我們人腦可以立刻判斷出來,不過我們也知道,數量及價錢ㄧ但變大變複雜,我們極有可能判斷不出來,因此這些事情我們會寄望電腦像我們人腦一樣思考,告訴我們正確的答案或是比較好的決定。
這邊我們撇開Jhon 的喜好及其他因素,單純看錢夠不購買這兩樣商品,先把人腦判斷的過程化為流程圖來看一下:
當我們需要電腦幫我們運算就必須使用他看得懂的語言,不會跟他說人類的自然語言,而對電腦而言,我們如果要請他判斷一件事情,會使用 if 這個關鍵字,這也是蠻好理解的,我們會說“如果John有超過80元,那他就可以買巧克力” ,在JAVA中的程式實作,我們會寫成:
///EX02 :
public class CodingWorld
{
public static void main(String[] args)
{
System.out.print(“Welcome to my Coding World! \n”);
int money = 50;
int chocolatePrice = 80;
int cookiePrice = 45;
if(money > 80)
{
System.out.print(“John can buy chocolate! \n”);
} if(money > 45)
{
System.out.print(“John can buy cookie! \n”);
}
}
}
/// Output John can buy cookie!
有時候當我們現實生活中有些事是我們做不到的,我們可能會有其他方案或是直接捨棄;在Jhon的例子,我們可以說“如果John有超過80元,那他就可以買巧克力,否則他不能買巧克力”,『否則』在程式語言的關鍵字是else,其他的意思,在JAVA中程式實作如下:
///EX03 :
public class CodingWorld
{
public static void main(String[] args)
{
System.out.print(“Welcome to my Coding World! \n”);
int money = 50;
int chocolatePrice = 80;
int cookiePrice = 45;
if(money > 80)
{
System.out.print(“John can buy chocolate! \n”);
}
else
{
System.out.print(“John can't buy chocolate! \n”);
} if(money > 45)
{
System.out.print(“John can buy cookie! \n”);
}
else
{
System.out.print(“John can't buy cookie! \n”);
}
}
}
/// Output John can't buy chocolate! \n John can buy cookie! \n
今天其實最好的狀況下,我們希望電腦能夠跟我們說“利用Jhon的錢50元,我們能買到的最貴的東西是哪一樣,如果都不能買,則說明不能買任何東西“,重點會放在只能挑選一樣負擔得起的商品內最貴的那一個,這時候我們會選擇用 else if 這個關鍵字
說明一下if-else和if-else if 的差異,if-else 僅能判斷兩種狀況,不是一就是二,而if-else if 則可以進行兩種狀況以上的判斷,JAVA程式實作如下:
///EX04 :
public class CodingWorld
{
public static void main(String[] args)
{
System.out.print(“Welcome to my Coding World! \n”);
int money = 50;
int chocolatePrice = 80;
int cookiePrice = 45;
if(money > 80)
{
System.out.print(“John will buy chocolate! \n”);
}
else if (money > 45)
{
System.out.print(“John will buy cookie! \n”);
}
else
{
System.out.print(“John won't buy anything! \n”);
}
}
}
/// Output John will buy cookie!
EX03 和 EX04 兩個寫法還有一種差異就是if-elseif只要判斷到為true的運算式,就不會再繼續判斷,也就是說今天假設John存到了100元,EX03依舊會印出“John can buy chocolate! John can buy cookie! ”,而EX04只會印出”John will buy chocolate!”
程式語言裡還有一種判斷的語法 — switch,語法基本上是這樣:
///EX05 :
public class CodingWorld
{
public static void main(String[] args)
{
System.out.print(“Welcome to my Coding World! \n”);
int weekday = 1;
switch(weekday)
{
case 1:
System.out.print(“Today is Monday! \n”);
break;
case 2:
System.out.print(“Today is Tuesday! \n”);
beak;
case 3:
System.out.print(“Today is Wednesday! \n”);
break;
case 4:
System.out.print(“Today is Thursday! \n”);
beak;
case 5:
System.out.print(“Today is Friday! \n”);
break;
case 6:
System.out.print(“Today is Saturday! \n”);
beak;
case 7:
System.out.print(“Today is Sunday! \n”);
break;
default:
System.out.print(“You are in a wrong weekday! \n”);
}
}
}
// Outputs Today is Monday!
這邊會看到switch 只有一個判斷式,而這個判斷式不像是if 是一個boolean值的判斷,switch可以看成是種分類的判斷
switch 語法會根據判斷的整數變數(這邊是day)去判斷是哪一種case,只要判斷到相符的,就break中斷掉不會繼續比較,最後一定會有一個default 的 case,如果都沒有判斷到相符的case,就會進入到default的case 去執行
而switch語法在Java 7 以上的版本也能夠支援字串的判斷,對開發者更加友善,使用 switch 在 Java編譯器中也比if-else 來得更加有效率!
[迴圈 Looping]
迴圈應該很好理解,就是一件事情或是一個運算做好幾次,當然你也可以運算無限次,假如我們運算的次數是有限次數,那我們第一個會很直覺的選擇for迴圈,for迴圈寫法如下:
///EX06:
public class CodingWorld
{
public static void main(String[] args)
{
int i = 0;
int count = 100;
for(i = 0; i < count; i ++)
{
System.out.print(“Welcome to my Coding World! ” + i + ”\n”);
}
}
}
在大括號 {} 之間稱為 for 迴圈的區塊,我們可以看到 for 迴圈有三個條件運算式:
● i = 0; 代表i這邊變數在for 迴圈內是從0開始的
● i = i + 1; 代表每執行一次for迴圈 i 的值就會增加1
● i < count; 代表i 小於 count 時都會一直執行for 迴圈,直到i = count
迴圈還有另外一種while,如果將上述的for迴圈用 while 迴圈會寫成如下:
///EX07:
public class CodingWorld
{
public static void main(String[] args)
{
int i = 0;
int count = 100;
i = 0; //設定為初始值
while(i < count)
{
System.out.print("Welcome to my Coding World! " + i + "\n");
i = i + 1;
}
}
}
while 迴圈的條件運算式只有一個 i < count,通常以防 i 這個變數有人使用,當我們要再次使用時,會先將 i 設為想要的初始值,而while 迴圈因為沒有自動累加 i 的概念,因此 i = i + 1; 必須自己寫在迴圈內
而 do-while 其實就跟while一樣,只是比較適用在不管怎麼樣不管條件式有沒有達成,while內的運算你都必須要執行到一次,do-while會先執行一次運算再去判斷while的運算式來決定要不要繼續在迴圈內,不過通常這個狀況很少會用到,而且也可以用一般while 迴圈完成,就看大家熟悉後怎麼選擇!
///EX08:
public class CodingWorld
{
public static void main(String[] args)
{
int i = 0;
int count = 100;
i = 0;
do
{
System.out.print("Welcome to my Coding World!" + i + "\n");
i = i + 1;
}while(i < count); /// do-while必須要放置 " ; " 在while 後面
}
}
[分支 Branch]
分支就是將我們目前所在的區域(從{}大括號內離開)流程中斷或是跳出的語法,我們在之前的例子switch 裡每一種case判斷完後就有一個break,這個就是分支的語法,在switch中,看到break就會從switch區域中離開
那還有哪些分支語法以及他們使用的時機呢:
●break
●continue
break 除了在switch中使用,分支語法在迴圈也是相當常見的,例如比起上述的EX07、EX08 while的判斷式寫法,一般來說我們更會將迴圈的限制放在迴圈內:
//EX09:
public class CodingWorld
{
public static void main(String[] args)
{
int i = 0;
int count = 100;
i = 0; //設定為初始值
while(true)
{
if(i >= count)
{
break;
}
System.out.print("Welcome to my Coding World! " + i + "\n");
i = i + 1;
}
}
}
當我們寫一個while(true) 的迴圈時,就代表著這一整個程式會永無止境在while迴圈內執行,所以我們一定必須得在裡面放一個break分支,從永無止境的迴圈離開,中斷while流程,否則整個程式會卡在迴圈內
而我比較喜歡這個寫法也是因為,while迴圈原本的判斷式只能有一個,當我們有好幾種狀況都能夠使迴圈中止,while的判斷式會變得相當長,如下:
///EX10:
public class CodingWorld
{
public static void main(String[] args)
{
int i = 0;
int j = 0;
int count = 100;
i = 0; //設定為初始值
j = 0; //設定為初始值
while((i < count) && (j < (count / 2)))
{
System.out.print("Welcome to my Coding World! " + i + "\n");
i = i + 1;
j = j + 1;
}
}
}
因為實際應用上大多會有多種狀況,因此,我們通常會習慣將判斷寫在迴圈內,程式看起來較有邏輯,也比較整齊:
///EX11:
public class CodingWorld
{
public static void main(String[] args)
{
int i = 0;
int j = 0;
int count = 100;
i = 0; //設定為初始值
j = 0; //設定為初始值
while(true)
{
/// 判斷條件1
if(i >= count)
{
break;
}
/// 判斷條件2
if(j >= (count / 2))
{
break;
}
System.out.print("Welcome to my Coding World! " + i + "\n");
i = i + 1;
j = j + 1;
}
}
}
continue 這個關鍵字只能在迴圈的區域內使用(for, while),當迴圈內部程式看到continue時,會停止這一回合的運算,繼續下一回合的迴圈運算
我們以EX06的for迴圈來做修改示範:
///EX12:
public class CodingWorld
{
public static void main(String[] args)
{
int i = 0;
int count = 100;
for(i = 0; i < count; i ++)
{
if((i < 20) && (i > 50))
{
continue;
}
System.out.print(“PASS DATA : ” + i + ”\n”);
}
}
}
這邊continue 有點像是一種屏蔽的效果,這種用法在數據處理演算法上會很常用到,例如我們需要過濾掉、篩選掉一些突然出現的高低訊號,這會非常的有用,像EX12範例我們就是只要讓20~50的數字通過,其餘不是PASS DATA
這篇文章說明了程式語言的迴圈、判斷式、分支的用法,在之後的程式教學,大家會更加熟悉這些基本的語法,下週的文章是關於JAVA的輸出輸入(I/O)以及例外處理,本來是這週一起討論的,但是輸出輸入內容可以講到很多,所以想說將它獨立出來,這週大家可以先練習迴圈、判斷式、分支,以下也有一些QA測試大家有沒有吸收囉!
[QA]
● 如果要請電腦做判斷,可以使用哪個關鍵字?
● 如果要請電腦做無限次運算,可以使用哪個關鍵字?
● 如果想要離開迴圈,不要繼續做迴圈內運算,可以使用哪個關鍵字?
● 今天 John 有 1000元,一顆茶葉蛋賣12元,試著用while迴圈、if 判斷式、break ,計算出John可以買幾顆茶葉蛋?● 如果要請電腦做有限次運算,可以使用哪個關鍵字?
● 用for迴圈,試著計算出1 + 3 +5 +...... + 100
喜歡我的文章的人也記得幫我按個拍手、分享,覺得很不錯的可以幫我拍個50下!
也要快點追蹤我的 FB粉絲專頁 — 飛比尋常的程式設計世界 ,不會太頻繁出現在你的塗鴉牆騷擾你,好文章生產需要一點時間,有錯誤或想討論的都歡迎留言給我唷!那就下次見拉!