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

Slides:



Advertisements
Similar presentations
现代电子技术实验 ——综合实验之单片机部分
Advertisements

鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
勇闖「卡勒居」 學長姐經驗分享(文組).
高三學長姐繁星及個人申請上榜 經驗分享(理組)
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
迴圈 迴圈基本觀念 while迴圈 do 迴圈 for迴圈 巢狀迴圈 迴圈設計注意事項 其他控制指令 迴圈與選擇的組合.
C#程序设计案例教程 第3章 程 序 结 构.
第一章 C语言概述 计算机公共教学部.
“Your Passion, We Support”
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
第 5 章 流程控制 (一): 條件分支.
新世代計算機概論 第14章 程式語言.
趙靖宇時間-專治你的Monday blue
選擇 運算式 邏輯運算 if指令 流程圖基本觀念 程式註解 巢狀if指令 switch指令.
第三章 控制结构.
程式設計實作.
控制流程 邏輯判斷 迴圈控制.
Class 2 流程控制-選擇敘述與迴圈.
.NET 程式設計入門(使用 C#) 講師:鄧智鴻.
第二章 C# 基础知识.
C++Primer 3rd edition 中文版 Chap 5
流程控制結構 4-1 流程控制與UML活動圖 4-2 程式區塊與主控台基本輸入 4-3 條件控制敘述 4-4 迴圈控制敘述 4-5 巢狀迴圈
第3章 C 語言的基本知識.
结构体和共用体 2 梁春燕 华电信息管理教研室.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C 語言簡介 - 2.
第十三章 其他的C語言課題.
條件判斷指令 -if 指令 -switch 指令 迴圈指令 - for 迴圈 - while迴圈 - break、continue 指令
PHP 程式流程控制結構.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
C++语言程序设计 第二章 C++简单程序设计.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
第四章 PL/SQL控制结构 If-then:如果条件为true,则执行一行或多行代码,如果条件为假,转到end if之后。
陳維魁 博士 儒林圖書公司 第五章 控制結構 陳維魁 博士 儒林圖書公司.
第2章 C++流程控制语句 if 语句 switch语句 for语句 while语句 do - while语句 break语句
第三章 C# 基础知识.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
软件测试 (四)静态测试与动态测试.
C语言程序设计.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
第二章Java基本程序设计.
程式結構&語法.
2011 邀请中国姐妹学校韩国语研修团项目 申请时间: ~5月 27日 / 项目地点: 汉阳大学 安山校区 / 项目时间: (星期日) ~ 7.22(星期五) 费用: 100万元(韩币/人 (包含项目 - 学费, 教材费, 宿舍费, 接机费用及所有文化体验活动项目费用)
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第三章 C++的语句和简单的程序设计 主要内容:
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
第二章 Java基本语法 讲师:复凡.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
PHP程式設計 五、程式流程控制結構 建國科技大學 資訊管理學系 饒瑞佶.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
Thanksgiving Day 4-1.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第2章 Java语言基础.
第6章 PHP基本語法介紹.
多重條件選擇敘述
C#快速導讀 流程控制.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
Presentation transcript:

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

綱要 巢狀if 與if-else if敘述 switch 敘述 列舉型別 for 迴圈 while 迴圈 do-while 迴圈 continue與break

綱要 變數生命週期與有效範圍 無窮迴圈應用 結構化程式設計 應用虛擬碼設計結構化程式

綱要 巢狀if 與if-else if敘述 switch 敘述 列舉型別 for 迴圈 while 迴圈 do-while 迴圈 continue與break

巢狀if流程 true false true false score < 60 score < 80 輸出”不及格” 輸出”成績優良” 輸出”成績中等”

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

懸置else if ( score >= 60 ) if( score >= 80 ) Console.WriteLine(“成績優良”); else Console.WriteLine(“請注意, 成績不及格”); ============================================

避免懸置else if ( score >= 60 ) { if( score >= 80 ) Console.WriteLine(“成績優良”); } else Console.WriteLine(“請注意, 成績不及格”);

if-else if 敘述 false false true false true false true true score >= 90 false score >= 80 true false score >= 70 true false score >= 60 true true grade = ‘F’ grade = ‘D’ grade = ‘C’ grade = ‘B’ grade = ‘A’

UsingIfElseIf.Program片段 if (score >= 90) { grade = ‘A’; } . . . . . . else if (grade >= 60) grade = ‘D’; else grade = ‘F’;

練習 西元年份被4整除, 但不被100整除,就是閏年;能被400整除的話, 也算閏年 寫一個程式,輸入西元年份,輸出該年是否閏年 可以先畫流程圖澄清概念

綱要 巢狀if 與if-else if敘述 switch 敘述 列舉型別 for 迴圈 while 迴圈 do-while 迴圈 continue與break

同一變數之有限多個值作為條件之連續判斷 false false true false true false true false true grade == ‘A’ false grade == ‘B’ true false grade == ‘C’ true false grade == ‘D’ true false grade == ‘F’ true true 輸出 “成績錯誤” 輸出 “不及格” 輸出 “成績尚可” 輸出 “成績中等” 輸出 “成績良好” 輸出 “成績優異”

Switch 流程 default ‘F’ ‘D’ ‘C’ ‘B’ ‘A’ grade 輸出 “成績錯誤” 輸出 “不及格” 輸出 “成績尚可” 輸出 “成績中等” 輸出 “成績良好” 輸出 “成績優異”

UsingSwitch.Program 片段(1/2) Console.Write("請輸入成績:A, B, C, D, F: "); char grade = Console.ReadLine().ToCharArray()[0]; switch (grade) { case 'A': Console.WriteLine("成績優異"); break; case 'B': Console.WriteLine("成績良好");

UsingSwitch.Program 片段(2/2) case 'C': Console.WriteLine("成績中等"); break; case 'D': Console.WriteLine("成績尚可"); case 'F': Console.WriteLine("不及格"); default: Console.WriteLine("成績錯誤"); }

switch 流程 true break false break true false true break false break grade==‘A’ 輸出”成績優異” false break grade==‘B’ true 輸出”成績良好” false grade==‘C’ true break 輸出”成績中等” false break grade==‘D’ true 輸出”成績尚可” false grade==‘F’ true break 輸出”成績錯誤” 輸出”不及格” false

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

綱要 巢狀if 與if-else if敘述 switch 敘述 列舉型別 for 迴圈 while 迴圈 do-while 迴圈 continue與break

示範程式UsingEnum重要片段(1/2) enum WeekDay { SUN = 1, MON = 2, TUE = 3, WED = 4, THU = 5, FRI = 6, SAT = 7 }

示範程式UsingEnum重要片段(2/2) WeekDay day = WeekDay.TUE; switch (day) { case WeekDay.SUN: Console.WriteLine("星期日為一週的第{0}天!!", (int)WeekDay.SUN); break; case WeekDay.TUE: Console.WriteLine("星期二為一週的第{0}天!!", (int)WeekDay.TUE); default: Console.WriteLine("一週的第{0}天!!", (int)day); }

列舉型別 (Enumeration) 組織整數常數與程式維護 省略數值指定 應用列舉型別

練習 宣告並測試列舉型別Season,其中包括常數Spring、Summer、Fall、Winter

練習 宣告列舉型別Grade,其可能值包括A、B、C、D、F 成績變數grade宣告為Grade型別,其值由Grade.A到Grade.F 以列舉型別改寫程式UsingSwitch.Program

綱要 巢狀if 與if-else if敘述 switch 敘述 列舉型別 for 迴圈 while 迴圈 do-while 迴圈 continue與break

1加到10 int sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10; int sum = 0;

1加到100 int sum = 1 + 2 + 3 + 4 + . . . + 100; int sum = 0; sum += 1;

1加到100的流程 sum = 0 i> 100 i = 1 i <= 100 ++i i <= 100 sum += i

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

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

關於迴圈(Loops) 迴圈之基本要素 控制變數初值設定 檢驗條件 控制變數改變 常見錯誤 邊界值錯誤, Off-by-one 無窮迴圈

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

迴圈執行效率 迴圈中不改變的敘述 編譯建置過程的最佳化 兩種版本的CIL檔 Release Debug

綱要 巢狀if 與if-else if敘述 switch 敘述 列舉型別 for 迴圈 while 迴圈 do-while 迴圈 continue與break

1加到100的流程 sum = 0 i = 1 false i <= 100 true sum += i ++i 輸出 sum

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

常見錯誤 控制變數未設初值 迴圈內控制變數未改變 無窮迴圈

使用時機 迴圈繼續執行之條件比較複雜 很不容易以一個控制變數表現迴圈繼續執行之條件 例如,檔案讀取未結束

綱要 巢狀if 與if-else if敘述 switch 敘述 列舉型別 for 迴圈 while 迴圈 do-while 迴圈 continue與break

1加到100的流程 sum = 0 i = 1 sum += i ++i false i <= 100 true 輸出 sum

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

for, while, do-while的主要差別

綱要 巢狀if 與if-else if敘述 switch 敘述 列舉型別 for 迴圈 while 迴圈 do-while 迴圈 continue與break

畢氏數 x2 + y2 = z2 前10組畢氏數 (3, 4, 5)、(5, 12, 13)、(6, 8, 10)、(7, 24, 25)、(8, 15, 17)、(9, 12, 15)、(9, 40, 41)、(10, 24, 26)、(11, 60, 61)、(12, 16, 20)

Pythagoras.Program重要片段 for (x = 1; x <= 100; ++x) { for (y = x; y <= 100; ++y) { for (z = 1; z <= 150; ++z) { if (x * x + y * y == z * z) { ++n; if (n <= 10) { Console.WriteLine( "{0}: {1}*{1} + {2}*{2} = {3}*{3}", n, x, y, z); }

UsingBreak.Program重要片段 for (x = 1; x <= 100; ++x) { for (y = x; y <= 100; ++y) { for (z = 1; z <= 150; ++z) { if (x * x + y * y == z * z) { ++n; Console.WriteLine( "{0}: {1}*{1} + {2}*{2} = {3}*{3}", n, x, y, z); break; } if (n == 10) break;

UsingContinueAndBreak.Program片段 for (x = 1; x <= 100; ++x){ for (y = x; y <= 100; ++y){ for (z = 1; z <= 150; ++z){ if (x * x + y * y != z * z) continue; ++n; Console.WriteLine( "{0}: {1}*{1} + {2}*{2} = {3}*{3}", n, x, y, z); break; } if (n == 10) break;

綱要 變數生命週期與有效範圍 無窮迴圈應用 結構化程式設計 應用虛擬碼設計結構化程式

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

綱要 變數生命週期與有效範圍 無窮迴圈應用 結構化程式設計 應用虛擬碼設計結構化程式

CheckingInput.Program 片段 Console.Write("輸入成績: "); grade = Convert.ToInt16(Console.ReadLine()); while (grade <0 || grade > 100) { Console.Write("成績須在0到100之間, 請重新輸入: "); } Console.WriteLine("成績為: " + grade);

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

UsingInfiniteLoop.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學生成績,直到輸入為負時為止。印出學生總人數及平均成績

綱要 變數生命週期與有效範圍 無窮迴圈應用 結構化程式設計 應用虛擬碼設計結構化程式

FORTRAN-IV程式片段 SUM = 0 I = 1 100 IF( I > 100 ) GOTO 200 SUM = SUM + I I = I + 1 GOTO 100 200 WRITE(6, 300) SUM 300 FORMAT(1X, I6)

goto敘述 允許使用者由程式某處任意跳到另一處 容易產生通心麵狀程式碼(spaghetti code) 極少數情況下仍需使用

通心麵狀程式碼(Spaghetti Code) 流程

結構化程式

綱要 變數生命週期與有效範圍 無窮迴圈應用 結構化程式設計 演算法虛擬碼

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

Euclid 輾轉相除法尋找最大公因數 在正整數x與y都不是0的情況下,持續以較大的數除以較小的數,並將除數與餘數分別設給x與y。最後的x便是原先兩數的最大公因數。

Euclid 輾轉相除法虛擬碼 1. x = 較大的輸入值; 2. y = 較小的輸入值; 3. while( y不等於0) { 3.1 remainder = x 除以y的餘數; 3.2 x = y; 3.3 y = remainder; } 4. 最大公因數 = x;

紙筆測試 GCD(1, 5)=1 GCD(12, 18)=3 GCD(17, 13)=1

Euclid.Program 程式片段 if (x < y) // x 較小時, 需交換x 與 y { int temp = x; y = temp; } while (y != 0) remainder = x % y; y = remainder;

練習 用下一頁的演算法, 撰寫虛擬碼, 進行紙筆測試, 並完成C#程式

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