Presentation is loading. Please wait.

Presentation is loading. Please wait.

鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所

Similar presentations


Presentation on theme: "鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所"— Presentation transcript:

1 鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
流程控制 鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所

2 if 流程 false true

3 UsingIf.Program片段 const int THRESHOLD = 60; Console.Write("請輸入成績: ");
int grade = Convert.ToInt16(Console.ReadLine()); if (grade < THRESHOLD) { Console.WriteLine("請注意, 成績不及格"); }

4 if-else 流程 true false

5 UsingIfElse.Program 片段
if (grade < THRESHOLD) { Console.WriteLine("請注意, 成績不及格"); } else { Console.WriteLine("成績及格"); } // 也可使用三元運算子 string message = (grade < THRESHOLD) ? "請注意, 成績不及格" : "成績及格"; Console.WriteLine(message);

6 UsingNestedIf.Program片段
if (grade < FAIL_THRESHOLD) { Console.WriteLine("請注意, 成績不及格"); } else if (grade < GOOD_GRADE_THRESHOLD) Console.WriteLine("成績中等"); Console.WriteLine("成績優良");

7 UsingIfElseIf.Program片段
if (grade < FAIL_THRESHOLD) { Console.WriteLine("請注意, 成績不及格"); } else if (grade < GOOD_GRADE_THRESHOLD) Console.WriteLine("成績中等"); else Console.WriteLine("成績優良");

8 練習 寫一個程式,輸入西元年份,輸出該年是否閏年

9 Switch 概念 . . .

10 switch 流程 true break false true break false default

11 UsingSwitch.Program 片段(1/3)
const int LEVEL_A = 90; const int LEVEL_B = 80; const int LEVEL_C = 70; const int LEVEL_D = 60; const int LEVEL_F = 50; Console.Write( "請輸入成績:90, 80, 70, 60, 50: "); int grade = Convert.ToInt16(Console.ReadLine()); switch (grade) { case LEVEL_A: Console.WriteLine("成績等級: A"); break;

12 UsingSwitch.Program 片段(2/3)
case LEVEL_B: Console.WriteLine("成績等級: B"); break; case LEVEL_C: Console.WriteLine("成績等級: C"); case LEVEL_D: Console.WriteLine("成績等級: D"); case LEVEL_F: Console.WriteLine("成績等級: F");

13 UsingSwitch.Program 片段(3/3)
default: Console.WriteLine( "請輸入符合設定的成績: 90, 80, 70, 60, 50"); break; }

14 switch 敘述 省略break的場合 使用字元與其他整數型別的switch敘述 敘述 goto

15 練習 用Nested If修改範例程式UsingSwitch,使其能處理任意整數成績

16 for 流程 for condition false for condition true

17 UsingFor.Program 片段 int i; int n = 100; int sum = 0;
for (i = 1; i <= n; i++) { sum += i; if (i % 10 == 0) Console.WriteLine( "1 ~ {0} 的加總等於{1} ", i, sum); }

18 MTable.Program片段 for (i = 1; i < 10; ++i) {
for (j = 1; j < 10; ++j) Console.Write("{0}*{1}={2} ", i, j, i * j); } // 印完一組便換行 Console.WriteLine();

19 練習 修改範例程式UsingFor,計算1到100的偶數和

20 while 流程 false true

21 UsingWhile.Program 片段 int i = 0; int n = 100; int sum = 0;
while (i <= n) { i++; sum += i; if (i % 10 == 0) Console.WriteLine( "1 ~ {0} 的加總等於{1} ", i, sum); }

22 do-while 流程 false true

23 UsingDoWhile.Program 片段
int i = 0; int n = 100; int sum = 0; do { i++; sum += i; if (i % 10 == 0) Console.WriteLine( "1 ~ {0} 的加總等於{1} ", i, sum); } while (i <= n);

24 關於迴圈(Loops) 迴圈之基本要素 三種迴圈敘述之不同 常見錯誤 迴圈與執行效率 控制變數初值設定 檢驗條件 控制變數改變
Off-by-one 無窮迴圈 迴圈與執行效率

25 特設之無窮迴圈 for ( ; ; ) { /* */ } while (true) {

26 UsingContinueAndBreak.Program片段
int i = 0; int n = 100; int sum = 0; while (i <= n) { i++; if (i % 2 != 0) continue; if (i == 52) break; sum += i; if (i % 10 == 0) Console.WriteLine( "1 ~ {0} 的偶數加總等於{1} ", i, sum); }

27 CheckingInput.Program 片段
int grade = 0; Console.Write("輸入成績: "); while (true) { grade = Convert.ToInt16( Console.ReadLine() ); if (grade >= 0 && grade <= 100) break; // 數值合理則跳出無窮迴圈 Console.Write( "成績須在0到100之間, 請重新輸入: "); } Console.WriteLine("成績為: " + grade);

28 練習 寫一程式,要求使用者不斷輸入及Echo學生成績,直到輸入為負時為止。印出學生總人數及平均成績

29 VarScope片段 Console.Write("請輸入一個字元: "); string s = Console.ReadLine();
if (s == "A") { string s1 = s; Console.WriteLine(s1 + "為第一個英文字母!!"); } else { Console.WriteLine(s1 + "不是第一個英文字母!!"); } for (int i = 0; i < 10; i++) { Console.WriteLine(s1);

30 結構化程式

31 虛擬碼(Pseudo Code) 幫助思考程式流程 沒有程式語言正式,省略細節,易寫易懂 限定使用結構化程式流程控制,容易以程式語言改寫
較流程圖方便 紙筆追蹤測試(Tracing an algorithm)

32 Euclid 輾轉相除法尋找最大公因數 As long as the value of neither x nor y is zero,
continue dividing the larger of the values by the smaller and assigning x and y the values of the divisor and remainder, respectively. (The final value of x is the greatest common divisor.)

33 Euclid 輾轉相除法虛擬碼 x = the larger input; y = the smaller input;
while( y not zero ) { remainder = remainder after dividing x by y; x = y; y = remainder; } gcd = x;

34 紙筆測試 1, 5 12, 18 17, 13

35 數值方法程式 如矩陣運算等,易寫成類別 如數值積分、微分方程之數值解等為常用工具函式,不易看出對應類別 可將若干工具函式集中於一類別
各工具函式寫成靜態函式

36 類別庫 NumberTheoryLibrary

37 建立方案與專案 TestingNumberTheoryLibrary
輸入程式Program.cs 專案>加入類別>NumberTheoryLibraryTest.cs 建置方案看著建置失敗

38 TestingNumberTheoryLibrary.Program
using System; namespace TestingNumberTheoryLibrary { class Program static void Main(string[] args) NumberTheoryLibraryTest.GCD_Euclid_Test(); }

39 TestingNumberTheoryLibrary. NumberTheoryLibraryTest (1/2)
using System; using System.Diagnostics; using NumberTheoryLibrary; namespace TestingNumberTheoryLibrary { class NumberTheoryLibraryTest public static void GCD_Euclid_Test()

40 TestingNumberTheoryLibrary. NumberTheoryLibraryTest (2/2)
Debug.Assert( GCD.Euclid(1, 5) == 1, "GCD.Euclid() Test 1 fails"); GCD.Euclid(12, 18) == 6, "GCD.Euclid() Test 2 fails"); GCD.Euclid(17, 13) == 1, "GCD.Euclid() Test 3 fails"); }

41 建立類別庫專案NumberTheoryLibrary
方案總管>方案TestingNumberTheoryLibrary名稱上按右鍵>加入>新增專案>類別庫>NumberTheoryLibrary 方案總管> NumberTheoryLibrary專案>Class1.cs名稱上按右鍵>重新命名為GCD.cs 輸入GCD.cs程式 建置>建置NumberTheoryLibrary,應該成功

42 NumberTheoryLibrary.GCD片段(1/3)
public static int Euclid(int x, int y) { if (x < y) // x 必須較大, 否則需交換 swap(ref x, ref y); } int remainder;

43 NumberTheoryLibrary.GCD片段(2/3)
while (y != 0) { remainder = x % y; x = y; y = remainder; } return x;

44 NumberTheoryLibrary.GCD片段(3/3)
private static void swap( ref int x, ref int y) { int temp = x; x = y; y = temp; }

45 完成方案TestingNumberTheoryLibrary
方案總管>專案TestingNumberTheoryLibrary>”參考”處按右鍵>加入參考>對話盒”專案”標籤下,選擇NumberTheoryLibrary>確定 重新建置方案,應該成功 開始偵錯,應該順利執行完畢

46 建立新方案/專案 FindingGCD 建立新方案/專案 FindingGCD 輸入程式Program.cs 建置方案看著建置失敗

47 FindingGCD.Program (1/2)
using System; using NumberTheoryLibrary; namespace FindingGCD { class Program static void Main(string[] args) Console.Write( "請輸入第一個整數x: "); int x = Convert.ToInt32( Console.ReadLine());

48 FindingGCD.Program (2/2)
Console.Write( "請輸入第二個整數y: "); int y = Convert.ToInt32( Console.ReadLine()); int gcd = GCD.Euclid(x, y); Console.WriteLine( "兩數的最大公因數為" + gcd); }

49 完成方案FindingGCD 方案總管>方案FindingGCD名稱上按右鍵>加入>現有專案>檔案對話盒中選取TestingNumberTheoryLibrary\NumberTheoryLibrary\NumberTheoryLibrary.csproj>開啟專案NumberTheoryLibrary已加入 方案總管>專案FindingGCD>”參考”處按右鍵>加入參考>對話盒”專案”標籤下,選擇NumberTheoryLibrary>確定 重新建置方案,啟動但不偵錯,應該順利執行

50 練習(1/2) 在類別庫NumberTheoryLibrary增加類別LCM及一個static int函數getLCM(int x, int y) ,傳回x與y的最小公倍數(可利用x*y = GCD(x,y)*LCM(x,y)) 修改相關程式,測試函式getLCM 利用函式getLCM,寫一個新專案,印出由鍵盤輸入兩數之最小公倍數 利用無窮迴圈,確保輸入之兩數為正整數

51 練習(2/2) 在類別庫NumberTheoryLibrary增加類別Prime及一個static bool函數IsAPrime(int x) ,決定x是否質數,方法如下頁投影片。 修改相關程式,測試函式IsAPrime 利用函式IsAPrime,寫一個新專案,印出1到100的所有質數

52 判斷是否質數的篩檢法 要判斷x是否質數,可用2開始到x開根號的奇數,逐一檢查是否能整除x 如果都不能整除,x便是質數,否則x就不是質數

53 類別庫的維護 維持版本紀錄 修改時注意維持向後相容性(backward compatibility)


Download ppt "鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所"

Similar presentations


Ads by Google