第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。

Slides:



Advertisements
Similar presentations
CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
Advertisements

鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
迴圈 迴圈基本觀念 while迴圈 do 迴圈 for迴圈 巢狀迴圈 迴圈設計注意事項 其他控制指令 迴圈與選擇的組合.
四資二甲 第三週作業 物件導向程式設計.
C#程序设计案例教程 第3章 程 序 结 构.
TQC+ 物件導向程式認證-JAVA.
C#程序设计 10软件1、2班 王槐彬 计算机工程学院.
第二章 JAVA语言基础.
实践 课题 周围环境对当代大学生成长的影响 指导老师:王永章 小组成员:陈荣、刘若楠、张红艳、吕雪丹、樊金芳、李惠芬、黄婧
第三章 控制结构.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
BLANK overview.
程式設計實作.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
C#程序设计 c# programming 泛型 C#程序设计课程组.
控制流程 邏輯判斷 迴圈控制.
Class 2 流程控制-選擇敘述與迴圈.
.NET 程式設計入門(使用 C#) 講師:鄧智鴻.
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
例外處理(Exception Handling)
第5章 程序结构.
Java基础 JavaSE异常.
南华大学计算机学院 软件工程系 QQ讨论群:
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Java语言程序设计 第五部分 Java异常处理.
C#面向对象程序设计 $7 继承和多态性.
Introduction to the C Programming Language
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
檔案讀寫與例外處理 (File IO and Exception Handling)
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
第 十二 章 C# 中的文件处理.
异常及处理.
第六章 属性、索引器、委托和事件.
類別與物件 I (Classes and Objects I)
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第三章 C# 基础知识.
第二章Java基本程序设计.
程式結構&語法.
第二单元 第2课 Matlab程序控制结构 1.顺序结构 2.选择结构 3.循环结构.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
1.2 C语言程序的结构与书写规则 一、 C语言程序的总体结构
第7章 异常处理.
第二章 Java基本语法 讲师:复凡.
第3章 JavaScript基本语句.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第2章 Java语言基础.
多重條件選擇敘述
迴圈(重複性結構) for while do while.
C#快速導讀 流程控制.
判斷(選擇性敘述) if if else else if 條件運算子.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Presentation transcript:

第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。

3.1 選擇結構 三種方式: 2. if… else if… else (多重選擇兩種以上) 3. switch (多重選擇兩種以上)

3.1.1 if…else 選擇陳述式 ( price>=1000)

If (price>=1000) { discount=0.8; } If (price>=1000) discount=0.8; If (條件式) 陳述式;

【例1】 若單價(price)大於等於1,000元,折扣(discount)八折, 否則折扣九折。 if ( price>=1000) { discount=0.8 ; // price大於等於1,000執行此敘述 } else discount=0.9 ; // price小於1,000 執行此敘述

年齡(age)是10歲(含)以下或60歲(不含)以上則票價(price)為100元,否則為200元。寫法如下: ☆【例2】 年齡(age)是10歲(含)以下或60歲(不含)以上則票價(price)為100元,否則為200元。寫法如下: if (age<=10 || age>60) { price=100 ; } else price=200 ;

巢狀if 若 if 或 else 程式區塊內,還有 if…else 陳述式。 試寫一個程式由鍵盤輸入兩個整數(num1和num2),  若num1=num2,則顯示 “num1=num2“。  若num1>num2,則顯示 “num1>num2“。  若num1<num2,則顯示 “num1<num2“。

// FileName: ifelse1.sln 01 namespace ifelse1 02 { 03 class Program 04 { 05 static void Main(string[] args) 06 { 07 int num1, num2; 08 Console.Write("請輸入第一個整數(num1) : "); 09 num1 = int.Parse(Console.ReadLine()); 10 Console.Write("請輸入第二個整數(num2) : "); 11 num2 = int.Parse(Console.ReadLine()); 12 if (num1 == num2) 13 { 14 Console.WriteLine("{0} = {1}", num1, num2); 15 }

else { 18 if (num1 > num2) 19 { 20 Console.WriteLine("{0} > {1}", num1, num2); 21 } 22 else 23 { 24 Console.WriteLine("{0} < {1}", num1, num2); 25 } 26 } 27 Console.Read(); 28 } 29 } 30 }

3.1.2 if…else if…else 多重選擇陳述式 有兩個以上的條件式,需要連續做判斷時

延續上一範例,改用if … else if … else多重選擇陳述式 來撰寫兩數比大小。

本週作業 // FileName: ifelseif1.sln 01 static void Main(string[] args) 02 { 03 int num1, num2; 04 Console.Write("請輸入第一個整數(num1) :"); 05 num1 = int.Parse(Console.ReadLine()); 06 Console.Write("請輸入第二個整數(num2) :"); 07 num2 = int.Parse(Console.ReadLine()); 08 if (num1 == num2) 09 { 10 Console.WriteLine("{0} = {1}", num1, num2); 11 } 12 else if (num1 > num2) 13 { 14 Console.WriteLine("{0} > {1}", num1, num2); 15 } 16 else 17 { 18 Console.WriteLine("{0} < {1}", num1, num2); 19 } 20 Console.Read(); 21 }

3.1.3 switch多重選擇陳述式 使用上差異  if … else if … else 可使用多個不同條件式。 使用太多 if 使得程式看起來複雜且不易維護, switch 多重選擇陳述式則不會。

Case 各種寫法

試使用 switch ,由鍵盤輸入現在的月份(1~12),  輸入5,表 5月份,由程式判斷 5月份 是屬於 哪一季? 顯示 ”現在是第二季”;  若輸入值超出範圍,則顯示 “... 輸入值超出範圍...”。

// FileName: switch1.sln 01 static void Main(string[] args) 02 { 03 string month; 04 Console.Write("=== 請輸入現在的月份: "); 05 month = Console.ReadLine(); 06 switch (month) 07 { 08 case "1": 09 case "2": 10 case "3": 11 Console.WriteLine(" \n ... 現在是第一季..."); 12 break; 13 case "4": 14 case "5": 15 case "6": 16 Console.WriteLine(" \n ... 現在是第二季..."); 17 break;

18 case "7": 19 case "8": 20 case "9": 21 Console.WriteLine(" \n ... 現在是第三季..."); 22 break; 23 case "10": 24 case "11": 25 case "12": 26 Console.WriteLine(" \n ... 現在是第四季..."); 27 break; 28 default: 29 Console.WriteLine(" \n ... 輸入值超出範圍...."); 30 break; 31 } 32 Console.Read(); 33 }

本週作業 練習把ifelseif1.sln程式,略作修改後(參考Page 3-8),儲存成學號,最後壓縮,並E-mail至jllioutw@hotmail.com Mail主旨(主題 ,Subject):學號

01 static void Main(string[] args) 02 { 03 int num1, num2; 04 Console.Write(“Please input first number :"); 05 num1 = int.Parse(Console.ReadLine()); 06 Console.Write(“Please input second number :"); 07 num2 = int.Parse(Console.ReadLine()); 08 09 if (num1 == num2) 10 { Console.WriteLine(“\n {0} = {1}", num1, num2); } 11 12 else if (num1 > num2) { Console.WriteLine(“\n {0} > {1}", num1, num2); } 14 15 else 16 { Console.WriteLine(“\n {0} < {1}", num1, num2); } 17 18 Console.Read(); 19 }

The End

3.2 重複結構 重複結構 是指設計程式時需要將某部份程式 區塊重複執行指定的次數,或 一直執行到不滿足條件為止。 重複結構亦稱 迴圈 (Loop)。 for陳述式 指定次數者稱為「計數器」控制迴圈。 while陳述依條件者稱為「條件式」控制迴圈。 三種結構的流程圖如下圖所示:

3.2.1 for 迴圈 計數器控制迴圈以 for 的 左大括號開始,以右大括號 結束。 語法: Count=count+1

For (count=1 ; count<=5 ; count++) { …… continue ; …... break ; } 使用 continue ,立即跳回 for 的開頭繼續執行。 中途欲離開 for 迴圈,使用 break 陳述式。 For (count=1 ; count<=5 ; count++) { …… continue ; …... break ; }

一般 for 迴圈的常用寫法:(Page 3-13 ,3-14) for ( k=1 ; k<= 5 ; k++)  { 程式區塊 } k = 1、2、3、4、5 共執行迴圈內的程式區塊5次。  for ( k=1 ; k<=5 ; k+=2) k = 1、3、5 共執行迴圈內的程式區塊3次。  初值、增值可為小數 for ( k=-0.5 ; k<=1.5 ; k+= 0.5) k = -0.5、0、0.5、1.0、1.5 共執行迴圈內程式區塊5次。 K = K + 1 K = K + 2 條件 K = K + 0.5

for (k=x ; k<=y+9 ;k+=2) 若x=1、y=-2,則 k = 1,3,5,7 共執行迴圈內的程式區塊 4 次。  增值採遞減 for ( k=6 ; k>=1 ; k-=2) k = 6、4、2 共執行迴圈內的程式區塊3次。  若初值、增值都有兩個以上,中間使用逗號分開: for (x=1, y=5 ; x<3 && y>2 ;x++ , y-- ) x=1 & y=5; x=2 & y=4; 共執行迴圈內的程式區塊2次。  初值和終值可以為運算式 for (k=x ; k<=y+9 ;k+=2) 若x=1、y=-2,則 k = 1,3,5,7 共執行迴圈內的程式區塊 4 次。  無窮迴圈 for ( ; ; ) 條件 K = K - 2 X = X + 1 , y = y - 1 K = 1 ; K <= 7 ; K = K + 2

試求下列級數的和。 = 3 + 5 + 7 + 9 + 11 = ? x=1 x=2 x=3 x=4 x=5

sum = sum + 2*X+1 x = 1 , sum = 0 + 3 = 3 x = 2 , sum = 3 + 5 = 8 // FileName: series.sln 01 static void Main(string[] args) 02 { 03 int x, sum = 0; 04 Console .WriteLine ("\n === 求級數的總和 ==== \n"); 05 Console.WriteLine (" x 2x+1 "); 06 Console .WriteLine (" ======= ======= "); 07 for (x = 1; x <= 5; x++) 08 { 09 Console .WriteLine (“ {0} {1} ”, x, 2 * x + 1); 10 sum += 2 * x + 1; 11 } 12 Console .WriteLine (" ---------------------------- "); 13 Console .WriteLine (" 此級數總和為 : {0} \n", sum); 14 Console.Read(); 15 } sum = sum + 2*X + 1

本週作業 3.2.2 巢狀迴圈 i=1 i=2 i=3 i=4 i=5 若迴圈內還有迴圈就構成巢狀迴圈,一般應用在二維資料列表。 (Page 3-16) 若迴圈內還有迴圈就構成巢狀迴圈,一般應用在二維資料列表。 下例外迴圈的變數,每個變數值印五次後,再將游標移到 下一列最前面,總共印五列。 for (int i = 1; i <= 5; i++) { for (int k = 1; k <= 5; k++) Console.Write("{0} ", i); } Console.WriteLine(); 外迴圈 i=1 i=2 i=3 i=4 i=5 內迴圈

3.2.3 前測式迴圈 前測式迴圈 就是將 條件式 放在迴圈的 最前面。 依條件式的真假決定是否進入迴圈:  若滿足條件將迴圈內的程式區塊執行一次,然後 再回迴圈最前面條件式。  不滿足時才離開迴圈。 前測式迴圈,若第一次進入迴圈時便不滿足條件式, 馬上離開迴圈,連一次都沒執行迴圈內的程式區塊。

3.2.4 後測式迴圈 後測式迴圈 就是將 條件式 放在迴圈的 最後面。 第一次不用檢查條件式,直接進入迴圈執行 裡面的程式區塊,才判斷條件式的真假:  若滿足條件會將迴圈內的程式碼執行一次, 再檢查位於迴圈最後面的條件式。  一直到不滿足條件時才離開迴圈。 此種架構迴圈內的程式區塊至少會執行一次。

試寫一個使用前測式迴圈計算階乘的程式,由使用者 先輸入一個整數,接著再計算該數的階乘值。 如下圖輸入5,結果計算出5!=120。

factorial = factorial * num num = 5 , factorial = 1 * 5 = 5 (Page 3-18) factorial = factorial * num num = 5 , factorial = 1 * 5 = 5 num = 4 , factorial = 5 * 4 = 20 num = 3 , factorial = 20 * 3 = 60 num = 2 , factorial = 60 * 2 = 120 num = 1 , factorial = 120 * 1 = 120 // FileName: factorial1.sln 01 static void Main(string[] args) 02 { 03 int keyin, num, factorial = 1; 04 Console.Write("請輸入整數: "); 05 keyin = int.Parse(Console.ReadLine()); 06 num = keyin; 07 while (num >= 1) 08 { 09 factorial *= num; 10 num - = 1; 11 } 12 Console.WriteLine("{0}! = {1} ", keyin, factorial); 13 Console.Read(); 14 } factorial = factorial * num num = num - 1

本週作業 練習把series.sln程式(參考Page 3-14, 3-15),略作修改後儲存成學號,最後壓縮,並E-mail至jllioutw@hotmail.com Mail主旨(主題 ,Subject):學號

The End

3.4 程式除錯 當一個程式在編譯時沒錯誤發生,在執行階段若無法得到預期的結果,表示發生邏輯上錯誤 邏輯錯誤 並不是語法錯誤,而是程式的流程、運算式、變數誤用等錯誤 此時就需要使用「區域變數」視窗來做逐行偵錯,觀察 每行執行結果是否正確?以找出發生錯誤的地方。

3.4.1 逐行偵錯 Visual C# 2010提供「區域變數」視窗來評估變數和運算式,並保存其結果。 可用「區域變數」視窗來編輯變數或暫存器的數值。 下例透過 for 迴圈來學習程式如何做逐行偵錯。

k = k + 5 sum = sum + i sum = 0+1+2+3 上面程式執行時,請按照下面步驟來對程式做逐行偵錯工作。 // FileName: debug1.sln 01 static void Main(string[] args) 02 { 03 int i, k, sum = 0; 04 k = 11; 05 for (i = 1; i <= 3; i++) 06 { 07 k += 5; 08 sum += i; 09 Console.WriteLine("i={0} , k={1}", i, k); 10 } 11 Console.WriteLine("i={0} , sum = {1} ", i, sum); 12 Console.Read(); } 上面程式執行時,請按照下面步驟來對程式做逐行偵錯工作。 k = k + 5 sum = sum + i sum = sum + i 1 = 0 + 1 3 = 1 + 2 6 = 3 + 3 sum = 0+1+2+3

Step1 先點選功能表的【偵錯(D)/逐步執行(I)】或直接按 鍵,此時在Main()方法的下一行 ”{” 會出現 向右箭頭, 表示下次執行由此行陳述式開始,進入逐行偵錯:

Step2 點選【偵錯(D)/視窗(W)/區域變數(L)】開啟「區域變數」監看視窗。

Step3 按 功能鍵三次,已執行過 k = 11,區域變數 監看視窗內的 K 值由 0  11。

Step4. 接著按 功能鍵六次,執行 sum += 1 和 Console Step4 接著按 功能鍵六次,執行 sum += 1 和 Console..., 此 時 區域變數監看視窗內的 sum 由 01, i 由 01, k 由1116。並執行Console陳述式, 此時會將 i 和 k 值 按照設定顯示格式顯示在主控台視窗。

Step5 接著按 功能鍵一次,跳回執行for Step5 接著按 功能鍵一次,跳回執行for...陳述式, 將i值12,以此類推下去,便可看到各陳述式中, 各變數的變化情形。 若要中斷逐行偵錯,將尚未執行的陳述式一次執行 完畢,可按 開始偵錯鈕,會顯示最後結果。

3.4.2 設定中斷點 上節逐行偵錯是屬於細部除錯。 C# 2010另提供中斷點設定做大範圍除錯。 設定中斷點做法: 在程式中欲監看的陳述式前面設定中斷點,程式每次執行到所設定的中斷點會停止執行,此時可透過區域變數監看視窗或移動滑鼠到該變數上會顯示該變數目前的值。

Step1設定中斷點 先移動滑鼠到下圖程式中有 中斷點圖示處按一下, 將指定的三行陳述式設成中斷點。有設定中斷點的 陳述式會預設紅色底顯示:

Step2 開始偵錯  功能表【偵錯(D)/開始偵錯(S)】或直接按 功能鍵, 開始執行到第一個中斷點處暫停。  此時 k+=5 前出現 向右箭頭,表下次由此陳述式開始 往下執行。 可從「區域變數」監看視窗觀看目前變數的值。 若螢幕未出現「區域變數」監看視窗,行功能表【偵錯(D)/視窗 (W)/區域變數(L)】開啟「區域變數」視窗。

Step3 直接觀看 直接移動滑鼠到編碼視窗任一個變數上停一會兒, 在該變數的右下方出現目前該變數的值。

Step4 繼續執行 按 功能鍵或 鈕,執行到 ”}” 符號便暫停執行。 各行陳述式中變數變化情形如下圖箭頭。

Step6 停止偵錯 若中途欲停止偵錯可以執行【偵錯(D)/停止偵錯(E)】 或直接按 停止偵錯圖示即可。

3.5 例外處理 例外(Exception) 就是指當程式在執行時期所發生的錯誤。 設計良好的錯誤處理程式碼區塊,可讓程式更為穩定,且更不易因應用程式處理此類錯誤而當機。

例外處理主要由 try、catch、throw、finally 四個關鍵字構成。  方式是將要監看是否發生錯誤的程式區塊放在 try 區塊內  當 try 區塊內的任何陳述式執行時發生錯誤,該例外會被丟出 throw,在程式碼中利用 catch 抓取此例外情況  C# 會由上而下逐一檢查每個 catch 陳述式,當找到符合的 catch 陳述式,會將控制權移轉到該 catch 陳述式內程式區塊 的第一列陳述式去執行。  當該 catch 程式區塊執行完畢,不再繼續往下檢查 catch 陳述式  直接跳到 finally 內執行 finally 程式區塊。  若未找到符合的 catch 陳述式,最後也會執行 finally 內的 finally 程式區塊後才離開 try。

try { [try程式區塊] // 需例外處理的程式區塊 } catch(exception1 變數ex) [catch程式區塊] // 當需例外處理的程式區塊發生錯誤, 符合exception1時 // 執行此程式區塊1; catch(exception2 變數ex) 符合exception2時 // 執行此程式區塊2; finally [finally程式區塊] //無論是否發生例外, 都會執行此程區塊

試寫一個會發生除數為零 DivideByZeroException 例外程式 或直接開啟下面 try1.sln 範例程式。本程式中先宣告i、k、p 為整數變數,並設定 i 初值為5,k 初值為0。 當執行 i/k 時會發生除數為零的 DivideByZeroException例外 此時程式即會終止執行。

// FileName: try2.sln 01 static void Main(string[] args) 02 { 03 int i, k, p; 04 i = 5; 05 k = 0; 06 try 07 { 08 p = i / k; 09 } 10 catch (Exception ex) 11 { 12 Console.WriteLine("發生例外"); 13 } 14 finally 15 { 16 Console.WriteLine(".... 結束程式執行!! ..."); 17 } 18 Console.Read(); 19 }

註:Message屬性會取得目前例外的訊息。 // FileName: try2.sln 01 static void Main(string[] args) 02 { 03 int i, k, p; 04 i = 5; 05 k = 0; 06 try 07 { 08 p = i / k; 09 } 10 catch (DivideByZeroException ex) 11 { 12 Console.WriteLine(ex.Message); 13 } 14 catch (Exception ex) 15 { 16 Console.WriteLine(ex.Message); 17 } 18 finally 19 { 20 Console.WriteLine(".... 結束程式執行!! ..."); 21 } 22 Console.Read(); 23 } 註:Message屬性會取得目前例外的訊息。 註:catch(Exception ex) 最好放在所有catch 陳述式的最後面及 finally 前面。

Take a Break ….

下表列出幾個例外物件常用的屬性與方法,透過 這些方法可供你了解一些例外的資訊。

// FileName: try3.sln 01 static void Main(string[] args) 02 { 03 int i, k, p; 04 i = 5; 05 k = 0; 06 try 07 { 08 p = i / k; 09 } 10 catch (DivideByZeroException ex) 11 { 12 Console.WriteLine("例外訊息:{0}", ex.Message); 13 Console.WriteLine("發生例外的函式:{0}", ex.StackTrace); 14 Console.WriteLine("發生例外的物件:{0}", ex.Source); 15 Console.WriteLine("發生例外的物件型別:{0}", ex.GetType()); 16 Console.WriteLine("發生例外的文字說明:{0}", ex.ToString()); 17 } 18 finally 19 { 20 Console.WriteLine(".... 結束程式執行!! ..."); 21 } 22 Console.Read(); 23 }