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