創作內容

1 GP

流程控制

作者:播磨拳兒│2018-11-06 14:13:08│巴幣:2│人氣:238
該是時候來說說「程式」的執行啦

程式的執行方式就是

由上而下 由左至右

至少我還沒有看過其他種跑法的程式.....



第一行跑完就跑第二行.......依此類推

當然,會有特殊狀況,第一行跑完可能跑去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上課





引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4186248
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 1 篇留言

超猛禿頭佬
最大差別在於 do while 會先跑一次程式再去判斷

而 while 可能不會判斷

第二句應該是 while 可能不會跑裡面的程式,而不是判斷吧?

11-07 20:53

播磨拳兒
有道理耶@@哈哈,對不起我國文被當,真的11-07 20:57
我要留言提醒:您尚未登入,請先登入再留言

1喜歡★jerryexcc 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:人物介紹 金爆 ゴールデ... 後一篇:2019 angela ...

追蹤私訊切換新版閱覽

作品資料夾

MoeTakoヾ(●゜▽゜●)♡
來一起陪雪糕畫畫喵✧◝(⁰▿⁰)◜✧看更多我要大聲說昨天20:24


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】