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

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
四資二甲 第三週作業 物件導向程式設計.
C#程序设计案例教程 第3章 程 序 结 构.
第 5 章 流程控制 (一): 條件分支.
第二章 JAVA语言基础.
File Access 井民全製作.
選擇 運算式 邏輯運算 if指令 流程圖基本觀念 程式註解 巢狀if指令 switch指令.
第三章 控制结构.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Chapter 5 迴圈.
程式設計實作.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
C#程序设计基础 $5 流程控制.
C#程序设计 c# programming 泛型 C#程序设计课程组.
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
C++Primer 3rd edition 中文版 Chap 5
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
第三章 C#面向对象初级编程 面向对象得程序设计越来越受到编程人员的喜爱。类和对象是面向对象程序设计中的重要概念。封装性、继承性和多态性是面向对象的特点,本章旨在全面说明C#编写面向对象程序设计的方法。
4B冊 認識公倍數和最小公倍數 公倍數和最小公倍數的關係.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
第9章 多线程 王德俊 上海交通大学继续教育学院.
PHP 程式流程控制結構.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
C#面向对象程序设计 $7 继承和多态性.
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
檔案讀寫與例外處理 (File IO and Exception Handling)
邏輯關係運算 == 等於 & 且 (logical and) ~= 不等於 | 或 (logical or) < 小於
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
類別與物件 I (Classes and Objects I)
第一單元 建立java 程式.
標籤、按鈕、工具列、狀態列 (Labels, Buttons, Tool Strips, and Status Strips)
第三章 C# 基础知识.
第二章Java基本程序设计.
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
C#程序设计基础 $3 成员、变量和常量.
第二章 Java基本语法 讲师:复凡.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
實作輔導 本周5/5(六)安排實作輔導 二時段: 周六 11:00~12:30 周六13:30~15:30.
第二章 Java语法基础.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
if (j…) printf ("… prime\n"); else printf ("… not prime\n");
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第2章 Java语言基础.
迴圈(重複性結構) for while do while.
C#快速導讀 流程控制.
判斷(選擇性敘述) if if else else if 條件運算子.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
10791: Minimum Sum LCM ★★★☆☆ 題組:Problem Set Archive with Online Judge
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
方法(Method) 函數.
Presentation transcript:

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

if 流程 false true

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

if-else 流程 true false

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

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

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

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

Switch 概念 . . .

switch 流程 true break false true break false default

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;

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");

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

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

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

for 流程 for condition false for condition true

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); }

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();

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

while 流程 false true

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); }

do-while 流程 false true

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);

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

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

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); }

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);

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

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);

結構化程式

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

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

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;

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

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

類別庫 NumberTheoryLibrary

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

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

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

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"); }

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

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

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

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

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

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

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());

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

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

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

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

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

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