第二章

Post on 05-Jan-2016

29 views 0 download

description

第二章. 流程控制. 本章投影片僅供本書上課 教師 使用 , 非經同意請勿供網路下載或拷貝. 2-1 演算法 (Algorithm). 演算法是設計程式的藍圖,規劃出解決問題 具體步驟。 演算法的定義: 為解決某特定問題,所規劃出一系列有順序 且明確步驟。 建造房子先繪藍圖再依藍圖建造符合需求房子。 利用電腦解決某問題前  先充分瞭解問題  構思出具體可行且有效率處理步驟  這些抽象思考過程需透過演算法做具體呈現, 做為撰寫程式的依據。. 好演算法必須滿足五個條件:. 1. 有 限 性:要在有限的步驟內解決問題。 - PowerPoint PPT Presentation

Transcript of 第二章

第二章

流程控制

本章投影片僅供本書上課教師使用,非經同意請勿供網路下載或拷貝

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 …..