壹 課程說明 單元名稱 C 語言 : 流程控制 單元摘要 本單元重點為介紹程式語言之選擇與重複敘述等流程控制結構, 並培養學 生具備正確使用流程控制語法的能力 設計者林光耀教師 ( 國立鳳新高中 ) 學習目標 課綱範圍 教學節數 8 先備知識 評量方法 參考資源 1. 能說明選擇敘述的功能, 及其在程式設計中的使用時機 2. 能說明並舉例如何正確地使用單一 雙重 多重條件以及巢狀選擇敘述 3. 能說明重複敘述的功能, 及其在程式設計中的使用時機 4. 能說明並舉例如何正確地使用計數式以及條件式重複敘述 5. 能舉例說明如何正確地中斷重複敘述的執行 1. 選擇敘述 1 1 選擇敘述功能與用途 1 2 單一條件選擇敘述 1 3 多重條件選擇敘述 2. 重複敘述 2 1 重複敘述功能與用途 2 2 計數式重複敘述使用方法 2 3 條件式重複敘述使用方法 2 4 重複敘述中斷方法 1. 必修科目 資訊科技概論 2. 九年一貫課程 資訊教育 簡單口頭問答 課堂觀察 紙筆測驗 上機作業 相關書籍 : 1. C 語言教學攻略 (2008) 李啟龍 俞冠廷 尤信翰著 台北 : 上奇科技股份有限公司 2. C 程式設計藝術 (2006) 吳國樑譯 台北 : 全華科技圖書股份有限公司 3. 最新 C 語言完美的演繹 (2005) 松橋工作室編著 台北 : 知城數位科技股份有限公司 4. 最新 C++ 程式語言 (2005) 施威銘研究室著 台北 : 旗標出版股份有限公司 5. 精通 C++ 程式設計 (2004) 數位新知著 台北 : 金禾資訊股份有限公司 6. 精通 C++ 入門與實作 (2003) 榮欽科技編著 台北 : 文魁資訊股份有限公司 1
7. C 語言程式設計實務 (2002) 莊益瑞 吳權威編著 台北 : 碁峰資訊股份有限公司 8. C++ 程式語言入門與應用 (1996) 蔡明志譯 台北 : 松崗電腦圖書資料股 份有限公司 2
貳 教學活動計畫教學活動 1 時間 說明 一 引起動機 1. 程式示範 5 分 1. 教師可以示範類似成績統計計算軟體, 引起學生的學習動機 二 程式設計介紹 1. 循序控制 10 分 1. 教師說明循序控制的意義 2. 教師說明程式的執行順序, 由程式的第一行敘述開始, 逐步執行到最後一行 示意流程圖 : 2. 上機演練 10 分 1. 舉例說明並練習 :( 可提供程式, 擇一練習 ) * 進行教學演練時, 教師請斟酌提示流程圖並適時說明循序控制的應用方式 (1) 平均分數計算程式 : 說明 輸入 3 筆數字, 求其平均分數 (2) 攝氏與華氏溫度轉換程式 : 說明 攝氏溫度 =( 華氏溫度 32)*(5/9) 華氏溫度 = 攝氏溫度 *(9/5)+32 3. 選擇控制介紹 ( 單一條件 ) 20 分 1. 教師說明選擇控制的意義, 並適時繪製流程圖輔助解說 << 教學時請老師搭配範例進行 >> (1) 單一條件選擇敘述 (a)if ( 條件運算式 ) { [ 敘述區段 ]} (b)if ( 條件運算式 ) { [ 敘述區段 1] } else { [ 敘述區段 2] } 三 作業練習 5 分 請繪製流程圖簡單說明 (1) 學期末成績結算或 (2) 補考成 績結算 3
教學活動 2 時間 說明 一 作業解答 1. 參考解答示範 2. 上機演練 10 分 1. 示範作業 ( 流程圖說明 ) 並練習紙筆推導 : (1) 學期末成績結算 (2) 補考成績結算 二 程式設計介紹 1. 多重條件選擇敘述 20 分 1. 教師說明選擇控制的意義, 並適時繪製流程圖輔助解說 << 教學時請老師搭配範例進行 >> (1) 多重條件選擇敘述 if ( 條件運算式 1) { [ 敘述區段 1] } else if ( 條件運算式 2) { [ 敘述區段 2] } else if ( 條件運算式 3) { [ 敘述區段 3] } else { [ 敘述區段 n] } (2) 選擇控制之巢狀敘述 4
if ( 條件運算式 1) { if ( 條件運算式 2) } else { [ 敘述區段 1] } { [ 敘述區段 2] } else { if ( 條件運算式 3) else { [ 敘述區段 3] } { [ 敘述區段 4] } 2. 上機演練 15 分 1. 舉例說明並練習 :( 可擇一練習 ) } (1) 成績等第程式 : 說明 成績等第判別標準 : 成績 90 分到 100 分, 等第為甲等 ;80 分到 89 分為 乙等 ;70 分到 79 分為丙等 ;60 分到 69 分為丁等 ; 成績 59 分以下為戊等 (2) 百貨公司打折程式 : 說明 百貨公司週年慶依以下方式打折 : 消費滿五萬元打八折 ; 消費滿一萬元打九折 ; 消費 未滿一萬元不打折 ( 可參考以下流程圖 ) 三 作業練習 5 分請依流程圖題意撰寫程式 : 找出三數中最大值者 5
教學活動 3 時間 說明 一 作業解答提示 10 分提示 :if (a>b) /* 判斷 a 是否大於 b*/ 1. 解答提示 2. 下回繳交 二 程式設計介紹 1. 多重條件選擇敘述 { if (a>c) /* 判斷 a 是否大於 c*/ else printf(" 最大數為 %d \n", a); printf(" 最大數為 %d \n", c); } else { if (b>c) /* 判斷 b 是否大於 c*/ } * 進行作業提示時, 教師應適時解釋特殊情形處理規則 ( 例如 : 若三個變數中有兩個相等, 或是三個變數值均 相等 ) 15 分 2. 教師說明選擇控制的意義, 並適時繪製流程圖輔助 解說 << 教學時請老師搭配範例進行 >> (1) 多重條件選擇 switch 敘述 : switch( 條件運算式 ) { case 常數 1: [ 敘述區段 1] break; case 常數 2: break; [ 敘述區段 2] case 常數 n: break; [ 敘述區段 n] default : [ 敘述區段 0] 2. 上機演練 20 分 1. 舉例說明並練習 :( 可擇一練習 ) } 6
(1) 閏年判斷程式 : 說明 判斷閏年公式: 西元末兩位不為 00, 且為 4 的倍數, 則該年為閏年, 否則為不閏年 西元末兩位為 00, 則可被 400 整除者, 則該年為閏年, 否則為不閏年 (2) 解一元二次方程式 : 說明 假設一元二次方程式為:ax^2+bx+c=0 其中,a,b,c 是係數, 而一元二次方程式的解為 x 其實根或虛根的判斷方式, 依據判別式 D=b^2 4ac 的值而定, 其情況可分為下列三種 : b^2 4ac=0: 代表此一元二次方程式有兩等根, 其值 b 為 2 a b^2 4ac>0: 代表此一元二次方程式有兩相異實根, b + b ^ 2 4 ac b b ^ 2 4 ac 其值為及 2 a 2 a b^2 4ac<0: 代表此一元二次方程式有兩虛根 (3)( 前述之 if) 成績等第程式或百貨公司打折程式 三 問題與討論 5 分 1. 請同學分享學習心得或提出問題討論 2. 提醒同學下次上課繳交前次作業 ( 找三數中最大者 ) 教學活動 4 時間 說明 一 作業解答 1. 解答示範參考 2. 選擇敘述回顧複習 10 分示範作業解答參考 ( 找出三數中最大值者 ) 1. #include <stdio.h> 2. #include <conio.h> 3. int main(void) 4. { 5. int a, b, c; 6. printf(" 請連續輸入三個整數 :( 逗號隔開 )\n"); 7. scanf("%d,%d,%d", &a, &b, &c); 8. if (a>b) /* 判斷 a 是否大於 b*/ 9. { if (a>c) /* 判斷 a 是否大於 c*/ 10. printf(" 最大數為 %d \n", a); 11. else 12. printf(" 最大數為 %d \n", c); } 13. else 14. { if (b>c) /* 判斷 b 是否大於 c*/ 15. printf(" 最大數為 %d \n", b); 7
二 程式設計介紹 1. 計數式重複 ( 迴圈 ) 控制 16. else 17. printf(" 最大數為 %d \n", c); } 18. getch(); return 0; 19. } * 進行作業示範時, 教師請適時說明特殊情形 ( 例如 : 若 三個變數中有兩個相等, 或是三個變數值均相等 ) 20 分 1. 教師說明並舉例 ( 密碼檢查 ) 重複控制的意義, 可提供 流程圖輔助解說 2. 重複結構使得程式語言更具威力, 且善用了電腦的好處 不厭其煩的重複執行特定程式敘述, 以完成指定的動作 以下就此結構進行介紹 3. 教師說明重複結構的類型 C 語言有三種迴圈敘述 :for while do while 敘述 若迴圈的次數可預知, 例如學校運動會的大隊接力競賽, 每隊固定跑 20 圈 (8000 公尺 ) for 敘述是最好的選擇 若迴圈次數無法確定, 例如老少咸宜的大富翁 ( 或另名 地產大亨 ) 遊戲, 以最後資產累積最多者為優勝, 無法事先預判執行次數 則可使用 while do while 敘述來達成 (1) 迴圈結構之 for 敘述 : for ( 初始運算式 ; 條件運算式 ; 控制運算式 ) { [ 敘述區段 ] } 迴圈一開始會先比較初始運算式是否符合條件運算式, 若是則執行敘述區段, 否則離開迴圈, 執行以後的程式區塊 ; 當每執行完成敘述區段一次後, 會計算控制運算式, 再判斷是否仍符合條件運算式, 8
若是則繼續執行敘述區段, 否則離開迴圈, 執行以後的程式區塊 重複執行以上動作, 直到離開迴圈 示例 以流程圖說明使用 for 迴圈計算 1+2+3+ +n 的總和 2. 上機演練 20 分 1. 舉例說明並練習 : (1) 依序顯示 1~10 數字, 間距為 1 (2) 累加程式 1+2+ +10 (3) 累加程式 1+3+5+ +99 ( 學習變量不為 1 ) 教學活動 5 時間說明 二 程式設計介紹 1. 重複 ( 迴圈 ) 控制 25 分 (2) 迴圈結構之巢狀 for 敘述 : for ( 初始運算式 1; 條件運算式 1; 控制運算式 1) { for ( 初始運算式 2; 條件運算式 2; 控制運算式 2) { [ 敘述區段 1] } [ 敘述區段 2] } 若在程式中一個 for 迴圈內還需要再執行另一個重複動 作, 此種迴圈內還有迴圈, 一層一層有如洋蔥一般, 由 內而外即構成一個 巢狀 for 迴圈 使用巢狀迴圈時要注意, 每個迴圈都必須使用自己對應 的迴圈控制變數, 迴圈和另一個迴圈範圍不可以交叉, 只能一個迴圈包圍另一個迴圈 示例 使用巢狀 for 迴圈印出九九乘法表 9
2. 上機演練 20 分 1. 舉例說明並練習 : (4) 在螢幕上印出 : * ** *** **** ***** (5) 在螢幕上印出 : * ** *** **** ***** (6) 在螢幕上印出 : * *** ***** ******* ********* 10
三 作業練習 5 分請自行依題意撰寫程式 ( 可依程度指定 ) 1. 累加程式 1+4+7+ +100 2. 累加程式 1+2+4+7+ +106 變化組合型 3. 在螢幕上印出 :1 22 333 4444 55555 4. 在螢幕上印出 : 1 22 333 4444 55555 教學活動 6 時間 說明 一 作業解答提示 1. 解答提示 2. 下回繳交 二 程式設計介紹 1. 條件式重複 ( 迴圈 ) 控制 10 分 1. 參考教學活動 4 之 2. 上機演練中的 (3) 累加程式 1+3+5+ +99 ( 學習變量不為 1 ) 2. 參考教學活動 4 之 2. 上機演練中的 (3) 累加程式 1+3+5+ +99 ( 注意變量變化 ) 3. 參考教學活動 5 之 2. 上機演練中的 (4) 在螢幕印出 : * ( 學習變量改為數字 ) 4. 參考教學活動 5 之 2. 上機演練中的 (5) 在螢幕印出 : * ( 學習變量改為數字 ) 20 分若事先不確定迴圈要重複執行多少次, 使用 while 迴圈 或 do while 迴圈會較為方便 此類迴圈無迴圈控制變數, 而是靠一個條件運算式來判 斷是否停止迴圈 ; 若條件運算式的結果不為零 ( 真 ), 迴 圈內敘述區段將再執行一次 此種迴圈內的敘述區段必須能改變條件運算式的結果 方能離開迴圈, 否則會變成無窮迴圈 ; 若運算式結果為 零 ( 假 ), 則離開迴圈 (3) 迴圈之 while 敘述 (a) while ( 條件運算式 ) { [ 敘述區段 ] } 由於 while 迴圈是將判斷條件運算式置於迴圈的最開 頭, 屬前測式迴圈, 若ㄧ開始便不滿足條件, 迴圈內的 敘述區段連一次都不會執行 (b)do { [ 敘述區段 ] } 11
while ( 條件運算式 ); 後測迴圈 do while 是將條件運算式置於迴圈的最後面, 因此一開始就先執行迴圈內的敘述一次, 接著再檢查 while 後面的條件運算式 當結果不為零 ( 真 ) 會再執行迴圈內的敘述一次, 一直到結果為零 ( 假 ) 才會離開迴圈 注意 :while( 條件運算式 ) 後面必須加上一個 ; 分號 2. 上機演練 20 分 1. 舉例說明並練習 : (1) 輸出 1 到 100 之間可被 n 整除的整數 ( 每列顯示 5 個 ), 並統計共有多少個 (2) 輸入一整數 n(1<=n<=10) 輸出 n!( 階乘 ) 的計算值 12
教學活動 7 時間說明 一 程式設計介紹 1. 重複敘述中斷控制 20 分 1. 中斷控制 :break 與 continue 敘述可在 for while do while 迴圈內的敘述區段中使用 2. 當程式執行到 break 敘述時, 會跳離 while 迴圈, 並繼續 執行接在 while 迴圈以外的後面各敘述 ( 區段 3) while ( 條件運算式 ) { [ 敘述區段 1] break; [ 敘述區段 2] } [ 敘述區段 3] 3. 當程式執行到 continue 敘述時, 會直接返回到 while 迴 圈內的 cond 條件運算式, 忽略接在 continue 後面的各 敘述 ( 區段 2), 並判斷是否要繼續執行 while 迴圈 while ( 條件運算式 ) { [ 敘述區段 1] continue; [ 敘述區段 2] } [ 敘述區段 3] 13
2. 上機演練 20 分 1. 舉例說明 ( 提供流程圖參考 ) 並練習 : 輸入兩整數 回答兩數相加結果, 輸出答案若正確則詢問是否繼續 ; 若錯誤則要求重新回答, 一直到答案正確為止 三 作業練習 10 分請自行依題意撰寫程式 ( 可依程度指定 ) 1. 計算兩數的最大公因數及最小公倍數 2. 找出 1~100 之間的所有質數 教學活動 8 時間 說明 一 程式設計介紹 1. 無窮迴圈控制 10 分 1. 如果迴圈的條件運算式永遠不為零 ( 表示真 ), 則會形成無窮迴圈, 程式將無法停止, 此時欲中斷執行可按下 Ctrl + C 鍵強迫程式中止執行 2. 因此撰寫無窮迴圈內的程式片段必須有改變條件的敘述才能離開無窮迴圈 3. 三種無窮迴圈常見的寫法 : (1) for ( ; ; ) 14
{ [ 敘述區段 ] } (2) while ( 1 ) {[ 敘述區段 ]} (3) do {[ 敘述區段 ]} while ( 1 ); 2. 上機演練 20 分以流程圖舉例說明後測式密碼檢查程式並練習 : 二 經驗分享 1. 程式設計經驗分享 15 分 1. 讓同學報告程式執行時發生哪些錯誤, 並由其他同學討論該錯誤如何解決 2. 老師進行程式設計經驗分享的總結 三 作業練習 5 分 終極密碼遊戲 ( 提供流程圖參考 ): 猜測由程式以亂數產生一個介於 1~99( 範圍可自定 ) 之間的整數 逐次輸出提示再大或再小 ; 若答案正確則詢問是否繼續, 若錯誤則要求重新回答, 直到答案 正確為止 15
16