Download presentation
Presentation is loading. Please wait.
1
第二章 流程控制 本章投影片僅供本書上課教師使用,非經同意請勿供網路下載或拷貝
2
2-1 演算法 (Algorithm) 演算法是設計程式的藍圖,規劃出解決問題 具體步驟。
演算法的定義: 為解決某特定問題,所規劃出一系列有順序 且明確步驟。 建造房子先繪藍圖再依藍圖建造符合需求房子。 利用電腦解決某問題前 先充分瞭解問題 構思出具體可行且有效率處理步驟 這些抽象思考過程需透過演算法做具體呈現, 做為撰寫程式的依據。
3
好演算法必須滿足五個條件: 1. 有 限 性:要在有限的步驟內解決問題。 2. 明 確 性:演算法中每個步驟必須清楚表達。
1. 有 限 性:要在有限的步驟內解決問題。 2. 明 確 性:演算法中每個步驟必須清楚表達。 3. 輸入資料:應包含零個或一個以上輸入資料。 4. 輸出資料:演算法中至少應產生一個輸出。 5. 有 效 性:每個步驟須在有限時間內完成。
4
演算法表示方式有兩種: 使用虛擬碼 (Pseudo Code)即一般描述語言 使用流程圖(Flow Chart)
5
一、虛擬碼 使用文字敘述來說明處理問題的步驟。 類似程式語言。 此種表示方式較易改寫成任何程式語言。 複雜演算法大都採用此方式描述。
6
二、流程圖 流程圖是利用簡明的圖形符號來表示 程式處理問題的流程和方法。
藉著各種不同圖形和箭頭 來表達解決問題的順序 每種圖形代表一種作業功能 箭頭代表流程方向,可協助設計出周詳程式 不致漏掉某些部份。 流程圖缺點 只能表示細部邏輯,對整個程式結構較難表示。 複雜演算法大都不採流程圖,而採虛擬碼。
8
使用虛擬碼 【例】由鍵盤輸入密碼,若正確顯示 Pass , 若連續輸入三次都不對,顯示 Fail。 Step1 令猜的次數為 0次。
Step3 檢查密碼是否正確? 若正確,顯示 “Pass”。 跳到步驟5。 若不正確,繼續下一步驟。 Step4 檢查次數是否超過3? 若次數未超過,跳到步驟2。 若次數超過,顯示 “Fail”。跳到步驟5。 Step5 結束程式執行。
9
方式2 使用流程圖
10
2-2 結構化程式設計 結構化程式設計技巧: 1. 使用三種基本邏輯結構 循序、選擇、重覆。 2. 由上而下的設計。 3. 模組獨立性。
11
一、循序結構
12
二、選擇結構
14
三、重覆結構 亦稱迴圈 (Loop)。 重覆結構可分為下列兩種: 1. 前測式重覆結構 2. 後測式重覆結構
15
1. 前測式重覆結構
16
2. 後測式重覆結構
17
2-3 選擇敘述
18
一、單向選擇 if … 敘述
20
二、雙向選擇 if …else… 敘述
22
三、…?…:… 三元運算子
26
// FileName : ifElse1.sln
static void Main(string[] args) { int num = 0; Console.Write("請輸入正整數:"); num = int.Parse(Console.ReadLine()); if (num % 2 == 0) Console.WriteLine("{0} 是偶數!", num); else Console.WriteLine("{0} 是奇數!", num); Console.Read(); }
27
2-4 巢狀選擇
30
// FileName : ifElse2.sln
01 namespace ifElse2 02 { 03 class Program 04 { static void Main(string[] args) { int score1 = 0, score2 = 0; Console.Write("請輸入操行成績:"); score1 = int.Parse(Console.ReadLine()); Console.Write("請輸入學科成績:"); score2 = int.Parse(Console.ReadLine());
31
if (score1 >= 90) if (score2 >= 95) Console.WriteLine("操行{0}分, 學科{1}分,獎學金5000元", score1, score2); else if (score2 >= 90) Console.WriteLine("操行{0}分, 學科{1}分,獎學金2000元", else Console.WriteLine("操行{0}分,學科{1}分,未達申請條件", else Console.WriteLine("操行 {0} 分,學科 {1} 分,未達申請條件", Console.Read(); } 24 } 25 }
33
2-5 多向選擇
38
// FileName : switch1.sln
01 namespace switch1 02 { 03 class Program 04 { static void Main(string[] args) { int num1 = 0, num2 = 1; Console.Write("請輸入第1個數:"); num1 = int.Parse(Console.ReadLine()); Console.Write("請輸入第2個數(不能為0):"); num2 = int.Parse(Console.ReadLine()); string op; Console.Write("請輸入運算子(+、-、*、/):");
39
14 op = Console.ReadLine();
switch (op) { case "+": Console.WriteLine("{0} + {1} = {2}", num1, num2, num1 + num2); break; case "-": Console.WriteLine("{0} - {1} = {2}", num1, num2, num1 - num2); break; case "*": Console.WriteLine("{0} * {1} = {2}", num1, num2, num1 * num2); break; case "/": Console.WriteLine("{0} / {1} = {2}", num1, num2, num1 / num2); break; default: Console.WriteLine("運算子錯誤"); break; } Console.Read(); } 35 } 36 }
40
2-6 計數迴圈
41
一. for … 迴圈
45
// FileName :forAdd1.sln
05 static void Main(string[] args) 06 { int start_num, end_num, step_num, i, sum = 0; Console.Write("請輸入初值(整數):"); start_num = int.Parse(Console.ReadLine()); Console.Write("請輸入終值(整數):"); end_num = int.Parse(Console.ReadLine()); Console.Write("請輸入增值(整數):"); step_num = int.Parse(Console.ReadLine()); for (i = start_num; i <= end_num; i += step_num) sum += i; Console.Write("初值 {0} 到終值 {1} 增值為 {2} 時,總和為 {3}", start_num, end_num, step_num, sum); Console.Read(); 18 }
49
二. Foreach 迴圈
50
簡例
51
2-7 條件式迴圈 條件式迴圈的基本形式有下列兩種: 1. 前測式迴圈:while… 2. 後測式迴圈:do…while
52
一、前測式迴圈
54
二、後測式迴圈
55
【簡例】使用者只能輸入 1 到 6 之間的整數。 int num; do { Console.Write("請輸入1到6之間的整數:");
num = int.Parse(Console.ReadLine()); } while (num < 1 || num > 6); Console.WriteLine("你輸入的整數= {0}", num);
56
三、無窮迴圈 表示迴圈的條件式結果無法變為 false, 無法離開迴圈。
無法離開迴圈時按 <Ctrl>+<Break> 鍵 中斷程式。
57
2-8 巢狀迴圈 是指一個程式,迴圈內還有迴圈。 一般製作二維表格如:九九乘法表或 有規則表格都可用「巢狀迴圈」。
59
// FileName : nestFor1.sln
05 static void Main(string[] args) 06 { for (int i = 1; i <= 5; i++) { for (int j = 1; j <= i; j++) { Console.Write("{0} ", j); } Console.Write("\n"); } Console.Read(); 16 }
60
2-9 例外處理 當程式執行時發生問題會造成無法繼續執行, 系統就會發出一個例外 (Exception) 訊號。
譬如:除法運算遇到除數為 0 時產生錯誤。 例外處理 (Exception Handle) C# 將 發生問題程式區段 使用 try 框住, 透過 catch 抓取符合問題的敘述 在該區塊內編寫例外處理相關程式碼。
61
一、try…catch…finally 語法
62
二、例外類別
63
【簡例】除數為0時的例外處理。 Filename : tryCatch.sln int num1=5, num2=0, num3; try
{ num3=num1/num2; Console.WriteLine(" 結果 = {0}", num3); } catch(DivideByZeroException e) Console.WriteLine("除數不得為0!!"); catch(Exception e) Console.WriteLine("其他錯誤!!"); Console.Read();
64
三、自訂例外處理
66
// FileName : tryCatch2.sln
05 static void Main(string[] args) 06 { string input; while (true) { try { Console.Write("請輸入Y或N:"); input = Console.ReadLine(); if (input != "Y" && input != "N") { throw new InvalidCastException(); } Console.WriteLine("你輸入的是 {0}", input); break; }
67
21 catch (InvalidCastException ex)
{ Console.WriteLine("只能輸入Y或N!"); } } Console.ReadLine(); } 28 } 29 }
68
本章結束 Take a Break …..
Similar presentations