該是時候來說說「程式」的執行啦
程式的執行方式就是
由上而下 由左至右
至少我還沒有看過其他種跑法的程式.....
第一行跑完就跑第二行.......依此類推
當然,會有特殊狀況,第一行跑完可能跑去100多行執行別的程式
這一點後面教學會教
但是基本的由上而下由左至右這一點是不變的
就像在看文章
啊,看到一個非常好的範例
巴哈的廣告
你也一定是從第一行
「Python程式設計專班」開始看
再來第二行「起薪高職缺多........」等等等
從上而下從左至右看完這個廣告
你就知道這是一個補習班的招商廣告
這就是所謂的「流程」
從這個廣告可以得知「學會python後有很多高薪職缺等著你」
「沒有學過的0基礎也可以學」
程式也是一樣
拿之前的程式來說說
第6行宣告一個叫「gps」的裝布林值的容器(變數),裡面裝「否 false」
第7行宣告一個叫「chair」的裝布林值的容器(變數),裡面裝「否 false」
第8行宣告一個叫「a」的裝浮點數的容器(變數),裡面裝「10.003f」
第9行宣告一個叫「b」的裝double浮點數的容器(變數),裡面裝「a的記憶體位址」*註解1
第10行印出文字「是否成交? 」和「gps和chair的XOR的結果」和「a的值」
上面打的那麼多廢話
程式的呈現就像圖片啦
所以啦
「程式就是在把我們的要求簡化並執行」
以手機App概念為例
按下按鈕出現一張圖片
程式過程大概就是
讀出圖檔 → 調整顯示比例 → 顯示圖片
先不說Android系統面或是圖片要壓縮等問題
且上面說的流程只是粗略說說
真正的流程還需要判斷等等的
所以我們就先從「判斷」介紹流程
====================判斷====================
用中文解釋
「如果.......就.......不然.......」
如果口袋有錢,就吃麥當勞,不然就吃便當
判斷的基準在口袋
那英文就是「 if 」
再來一次,用英文寫
「 If my pocket have money then I will eat Mcdonalds else just lunch box」
程式的寫法大概就像
(我真的瀕臨破產邊緣啊啊啊啊啊啊啊啊)
所以這邊要先教「if else」的判斷式
====================if else====================
格式大概就長這樣
當然,如果你沒有要判斷「否則」
那可以拿掉變成下圖
就像前面舉的例子
如果口袋裡有錢
口袋裡有錢 → 成立 → 吃麥當勞
↓
不成立 → 吃便當
很口語化了吧!?
當然你也可以多重判斷,如下圖
一樣由上而下有左至右
第一個判斷不成立,他就會去判斷第二個順位....依此類推
而else一定是放最後,因為以上都沒有我要的結果
他就會去執行最後的else
雖然每個判斷不是「是否」這種一番兩瞪眼的答案
判斷數字、值等等的可能就會有多種狀況
就因為他是依序判斷,相對效能就會略差一點
所以接下來要介紹一個更高速的判斷
====================switch case====================
格式大略長如下圖
注意!!此處的判斷依據沒有跟別人比較
或者應該說「判斷依據」是和「判斷結果」去比較
換個口語一點的方式,一樣用前面吃中餐的說法
最後一個default可省略,他的「break」更可以不用寫
這邊的「break」是用來中斷判斷的
如果不寫,他可是會繼續判斷下去的*註解2(break解說)
一個「case」就會有一種結果
因為是唯一,所以直接去面對對應的case
這樣在程式的效能來說是最快的
順帶提醒
這個方式是「口袋的錢 = 50」才會進入
意思是說
每個case只會有一種狀況
且狀況完全符合就會進入該case的程式區塊中
不過我們通常在做判斷也會有需要「一直判斷」的狀況
像這樣的話「if else if ....... else」會是最好的
題外話
判斷其實還有一種
只是不常用
大概就是這樣的感覺
此寫法會把執行的結果直接存入c這個變數中
解說:
a + b小於5判斷的結果為false
故會先把b的值存入c變數中, b才做+1的動作
所以上面的答案c會是10
但如果是++b的話
答案就是11囉
業界不常用的原因大概是因為
判斷式不論是true或是false做的事情肯定不會只有一行寫完= =a
換成「if else」寫法就是
====================迴圈====================
愛因斯坦曾經說過
「瘋狂的定義就是一直一直在做相同的事情,期待著不同的結果」
(Insanity: doing the same thing over and over again and expecting different results)
遊戲:極地戰壕3(Far Cry 3)的大反派也說過相同的話
不知道為何這句話我還滿喜歡的....可能我真的是個瘋子吧.....
拉回主題
最基本的例子「數數字 1 ~ 10」
1 2 3 4 5 6 7 8 9 10
這誰都會
如果要你用程式把它呈現出來呢?
這樣? 你瘋了嗎? (os:真的瘋了)
愛因斯坦真的沒有說錯.......
所以我們要用一點正常人用的方式
至少看起來不會像瘋子寫程式
這時候迴圈就派上用場啦
先來介紹第一種
====================for====================
最常用的迴圈寫法
前面的數數字1 ~10
程式呈現大概就像下圖
解說:
§初始值:
因為是從1開始,所以初始值是1
之所以要「int a = 1」是因為要給定a的初始值
一定要給,不然就會像下圖
真的必須在外面定變數時, b 要重新給定初始值即可,如下圖
雖然很沒意義
第6行定b = 0, 但是迴圈裡又定一次初始值等於1
有種脫褲子放屁的感覺
§判斷式:
判斷結果只能為true或false
但千萬注意
「判斷式若恆為true,會很可怕」
「判斷式若恆為true,會很可怕」
「判斷式若恆為true,會很可怕」
講三次是因為太重要,因為這會造成所謂的「無限迴圈」
就像跳針似的一直進來迴圈內執行
不信? 你自己跑一次就知道結果,不要說我搞壞你電腦
跑3秒而已,已經累加到12萬多了.......
這已經比車子「0 ~ 100只需要3秒」還要快了.....
順便補充
想要讓這樣的無限迴圈停下來,請按「停止」鈕
§累加:
判斷式為true,並執行完裡面程式後,累加的數值
我原本的程式內
a在小於等於10以前都會先印出自己a的數字(和一個空格)
之後+1
額外提醒:累加條件是可以省略掉的
省略掉也是無限迴圈,有興趣的自己玩玩看吧
後果自負阿
所以如果有人問你「for迴圈的執行順序」時
請照這個順序
1→2→3→4→2→3→4→2→3→4→2→3→4...........
1建立初始值 2判斷 3執行程式 4累積
當然也有可能1 2就沒了,就要看你整個程式是如何寫的
這個問題也是我在補習班時老師問的問題
請謹記這個規則,很重要
另外一種迴圈就比較好理解了
====================while====================
如果了解了for迴圈
while就相對簡單很多
但是你一定會想
初始值勒? 累加勒?
我們同樣用「數數字 1 ~ 10 while版」呈現一次
一樣的結果
那麼另外一種while就更好說了
====================do while====================
格式上的差別在前面有一個「do」
一樣用「數數字 1 ~ 10 do while版」呈現一次
最大差別在於do while會先跑一次程式再去判斷
而while可能不會進入程式執行區
另外請記得判斷完要加「 ; 」
====================額外補充====================
巢狀
不論是判斷式「if」或是迴圈系列「for」「while」「do while」
都可以在程式裡面再跑一次,如下圖
你要幾層都可以
只是格式記得要對好
大括號代表程式區間
多一個少一個都不行
所以建議在寫的時候可以先把格式寫好,再來寫判斷或程式,如下圖
一次就先把大括號小括號都先寫好再進去寫程式
才可以盡量避免寫到忘記括號有沒有加
====================額外補充-2====================
這個寫法也是我在查證我寫法有沒有錯時發現的
真的很少看到這樣的寫法,不過真的滿酷的
看出來了嗎?
「for」迴圈和「if」判斷的結合
當然,顛倒過來也是可以的
只是跑出來的結果大不同
其實概念也很簡單
請把「for」和「if」當成各自獨立的個體
只要有一個條件不符合就不會下去執行程式
這個概念就像上次的「&&」一樣
一個條件不符合就不執行
只是我發這篇文之前查到的
所以對我個人來說也很新鮮@@a
====================總結====================
這篇文章重打了2次左右......
你要知道....IMac電腦的魔術滑鼠
好用是很好用,滑到一下不小心直接「上一頁」
打好的地方完全重寫.....
以上算是額外插曲
因為業界中使用的判斷和迴圈
頂多「if」「if else」和「for」就打死一片了
極少數的狀況會用到「switch case」
其他的就更少啦
所以只要把這幾個學起來
額外補充-2的那個可以記得一下
大部分的程式你就寫得出來囉
這一篇算是拖得滿久的
去看看我發的文你就知道
我前陣子有些東西不吐不快
所以才轉彎去寫別的東西
這篇算是回頭做正事....
好啦,有啥不懂或是寫不好的地方
請別吝嗇地來指教
那麼就下一篇見啦
*註解1
為何這邊說是記憶體位址
因為JVM把「a」的位址複製給了「b」
用最簡單的方式就可以得知
b是double,為較大的記憶體, a則是較小的float
較小的a裝去b裡面不會有問題
但是b現在的數值為10.003000259399414
非常明顯的跟a的「10.003f」不一樣
「==」是用來比較「記憶體位址」的
就像我問a :你家裝什麼?
他回答我: 10.003f
而我去問b :你家裝什麼?
而b回答我 : a的地址 所以我只能再去問a家裡裝什麼了
*註解2
兩個用法都會中斷「判斷式」或是「迴圈」
略過後面的程式碼
「break」用法用比較多的只有在switch case中,或是「for」「while」等迴圈中
「if else」沒有人在裡面寫「break」
另外補充一個「continue」
這個用法就和「break」相反
差別在於「continue」是會繼續判斷或迴圈
情境題:
今天上課1~8堂(一個1~8的上課迴圈)
中間肚子痛,跟老師報告去保健室
break: 肚子裡的蛔蟲可能是到了繁殖期大量繁殖,必須送醫院 break掉今天的課
continue:因為保健老師的神丹,肚子痛的症狀好了,繼續回來continue上課