Microsoft Word - Chap05.doc

Similar documents
Microsoft Word - Chap05.doc

Microsoft PowerPoint - 06_迴圈2.pptx

碩命題橫式

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

Microsoft Word C-A卷.docx

C/C++基礎程式設計班

Microsoft Word - ACL chapter02-5ed.docx

Microsoft Word - AEL0124-CH05

PowerPoint 簡報

Microsoft PowerPoint - C_Structure.ppt

CC213

Microsoft PowerPoint - STU_C_Lang_CH05

C

If Close[Length]!= 0 Then B Close[Length] 是 Length 日前的 Close 不是 0 的話則執行 B % Number 以 Divisor 來求取除法並傳回剩下的部份和 Divisor 具備相同的符 號 格式 :Number % Divisor Numb

Java 程式設計初階 第 5 章:基本輸出入 & 流程控制

<4D F736F F D DA5BFA6A1C476C1C92DBEC7ACECB8D5A8F728B57BB35D292E646F63>

Microsoft Word - part doc

目次 CONTENTS 1 數列與級數 幾何圖形 三角形的基本性質 平行與四邊形

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

Microsoft Word - 第3章.doc

Learning by debugging

國立北斗家商 107 學年度第 2 學期第二次期中考科目 : 計算機應用 計算機概論 IV 班級 : 商二 1 2 貿二 資二 綜二 1 作答方式 : 答案卡 選擇題共 33 題, 除第 1 題 4 分, 其餘每題 3 分, 注意作答時間 1. ( ) 使用 Visual Basic 程式語言 (

C C

Microsoft PowerPoint - ds-1.ppt [兼容模式]

Visual C# 2005程式設計

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

C/C++ - 函数

untitled

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

######## First set of commands x <- 0.5; y <- 0 if (x>3) y <- 1 else y <- 2 ######## Second set of commands x <- 0.5; y <- 0 if (x>3) y <- 1 else ###

C/C++ - 字符输入输出和字符确认

untitled

C 語言—陣列及字串

Python_02

C/C++语言 - 分支结构

PHP與MySQL 入門學習指南

zt

! "#$% & ())*! ++, +- +.)! ++ ())* / 0!!""#!

untitled

C/C++ 语言 - 循环

ACI pdf

填 写 要 求 1. 以 word 文 档 格 式 如 实 填 写 各 项 2. 表 格 文 本 中 外 文 名 词 第 一 次 出 现 时, 要 写 清 全 称 和 缩 写, 再 次 出 现 时 可 以 使 用 缩 写 3. 本 表 栏 目 未 涵 盖 的 内 容, 需 要 说 明 的, 请 在

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

Ps22Pdf

Microsoft PowerPoint - Class2.pptx

untitled

Microsoft PowerPoint - ch04_AEL0080.ppt

DF-syllabus

CC213

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

迴圈控制 : for, while, repeat Textbook reading: Chapter 7. 固定次數迴圈 : for 指令. 假設有 k 個指令 C(1),..., C(k), 而我們要依序完成其中的 C(m),..., C(n), 語法為 for ( i in m:n) { C(

Microsoft Word - C-pgm-ws2010.doc

2. S 輸入一個整數 n, 求出從 1 ~ n 所有可以被 3 整除及又可以被 7 整除所有 的數字的總和的程式 ( 請上傳 Sum_3_7.py 檔 ) Sum_3_7.py 程式樣版 n = int(input()

Microsoft Word - 6.doc

CHAPTER VC#

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

C/C++语言 - 运算符、表达式和语句

Microsoft PowerPoint - 07b1 Max and Sum.ppt [相容模式]

<4D F736F F D B0D3B77EC3FEA7DEC3C0C476C1C9A5BFA6A1B8D5C3442DB57BA6A1B35DAD702DBEC7ACEC2E646F6378>

Java 程式設計初階 第 5 章:基本輸出入 & 流程控制

Microsoft Word - ch03.doc

untitled

Microsoft Word - _m30.doc

¥¼©R¦W-5

PowerPoint 簡報

第 15 章遞迴呼叫 本章學習目標 說明遞迴函式呼叫概念 透過範例介紹遞迴函式呼叫與應用 本章重點概述 本章主要介紹如何使用遞迴函式呼叫進行計算 1

CC213

Microsoft Word - NEWch (P5-15).doc

資料結構之C語言重點複習

Microsoft Word - administrative-law-08.doc

Chapter 3 Camera Raw Step negative clarity +25 ] P / Step 4 0 ( 下一頁 ) Camera Raw Chapter 3 089

Microsoft PowerPoint - FS720-Ch06.ppt

1

此運算子具有的優先順序高於下一個區段且低於前一個區段 請注意, 您可以按一下運算子以移至內附範例的詳細資料頁面 x && y 邏輯 AND 如果第一個運算元為 false,c# 就不會評估第二個運算元 條件 OR 運算子 此運算子具有的優先順序高於下一個區段且低於前一個區段 請注意, 您可以按一下運

封面-12

nooog

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

新・解きながら学ぶC言語

p.2 1. a. b. c. (i) (ii)

第3章.doc

Excel VBA Excel Visual Basic for Application

Java 程式設計入門

Microsoft Word - ACI chapter00-1ed.docx

新版 明解C言語入門編


新・明解C言語入門編『索引』

2. S 輸入一個整數 n, 求出從 1 ~ n 所有可以被 3 整除及又可以被 7 整除所有 的數字的總和的程式 ( 請上傳 Sum_3_7.class 檔 ) Sum_3_7.java 程式樣版 public cla

90 課程 大綱 條件判斷 : if ( 表 示式 ) {... } [P.91] 如果表 示式成 立就... if ( 表 示式 ) {... } else {... } [P.93] 如果表 示式成 立就... 否則就.. C / C++ 的複合指定與遞增遞減運算 子 [P.96] 重複執 行

2007年普通高等学校招生全国统一考试

Microsoft PowerPoint - ch2.pptx

Microsoft Word - Chap02.doc

C

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

_汪_文前新ok[3.1].doc

Object-Oriented Programming, Mid-term Test, 11/21/2000

Ps22Pdf

基本數學核心能力測驗_行為觀察記錄紙_G2版本

untitled

<4D F736F F F696E74202D ABE1A4A420A4A4C2E5BEC7B7A7BDD720C2E5BEC7B7BDAC79BB50B56FAE6920ADD9B0B7AFE82E BACDBAE65BCD2A6A15D>

Transcription:

迴圈敘述 5-1 for 迴圈 5-2 while 迴圈 5-3 do...while 迴圈 5-4 巢狀迴圈 5-5 break 與 continue 5-6 ++ 附加於條件運算式 5-7 關鍵字 5-8 問題演練 5-9 程式實作

C 語言除錯高手 迴圈敘述 (loop statement) 的功能就是可以重複執行敘述 迴圈敘述主要有 for while 和 do...while 三種不同語法迴圈敘述 5-1 for 迴圈 我們先來介紹 for 迴圈, 其語法如下 : for ( 初值設定 ; 條件運算式 ; 更新運算式 ) 條件運算式為真時, 執行的主體敘述 ; 此迴圈由三個部份所組成, 分別為初值設定 條件運算式及更新運算式, 茲說明如下 : for 迴圈的功用 初值設定 條件運算式 更新運算式 設定變數的初值 若為真, 則執行其所對應的敘述 ; 若為假, 則結束迴圈 更新變數值 此三部份是用分號 (;) 隔開, 而不是逗號 (,) 注意,for 敘述小括弧 ( ) 的後面不可加分號 (;), 若執行敘述的部份為單一敘述時, 則大括弧 是可以省略的, 若是複合敘述時, 則不可以省略 但有些人不管單一敘述或是複合敘述, 皆加上大括號, 如範例 5-1a 所示 範例 5-1a /* ex5-1a.c */ int num; 5-2

第 5 章迴圈敘述 for(num = 0; num <= 5; num++) printf("num is %d\n", num); 輸出結果 Num is 0 Num is 1 Num is 2 Num is 3 Num is 4 Num is 5 程式剖析 for 迴圈先將 num 的初值設為 0, 判斷 num 是否小於等於 5, 若是, 則印出 num 值 之後, 再對 num 加 1, 再判斷 num 是否小於等於 5 若是, 則印出 num 值 週而復始, 直到 num 不是小於等於 5, 結束迴圈為止 注意! 迴圈結束時,num 的值是 6 以流程圖表示如下: 以下我們來探討 for 迴圈一些變形的寫法 程式中 num 變數的初值設定, 可以在定義變數就給定之, 此時 for 迴圈內的初值設定敘述就可以省略, 但其後面的 ; 不可省略 如範例 5-1b 所示 5-3

C 語言除錯高手 範例 5-1b /* ex5-1b.c */ int num = 0; /* 設定 num 初值為 0 */ for( ; num <= 5; num++) /* 省略初值的設定 */ printf("num is %d\n", num); 輸出結果 Num is 0 Num is 1 Num is 2 Num is 3 Num is 4 Num is 5 程式剖析 此程式在定義變數時, 也同時設定其初值 其次, 也可以將 for 迴圈的更新運算式移至它處, 如範例 5-1c 所示 範例 5-1c /* ex5-1c.c */ int num = 0; for( ; num <= 5; ) printf("num is %d\n", num); num++; 5-4

第 5 章迴圈敘述 輸出結果 Num is 0 Num is 1 Num is 2 Num is 3 Num is 4 Num is 5 程式剖析 for 迴圈的更新運算式移至執行的主體敘述內, 但不可以省略前面的分號 輸出結果同上一範例 與上一章的 if...else 敘述一樣, 當 for 迴圈所要執行的主體敘述是複合敘述 ( 指兩個或兩個以上的敘述 ), 必須以左 右大括號括起來 上一範例的 for 迴圈若沒加左 右大括號, 將會形成無窮迴圈, 如範例 5-1d 所示 範例 5-1d /* ex5-1d.c */ int num = 0; for( ; num <= 5; ) printf("num is %d\n", num); num++; 輸出結果 這是一無窮迴圈, 請您親身體驗一下 5-5

C 語言除錯高手 程式剖析 因為 for 迴圈只對它的下一條敘述有效而已, 所以並沒有執行 num++; 敘述, 導致 num 都是 0, 因此, 形成了無窮迴圈 在 for 迴圈中, 若省略條件運算式, 其結果將會如何? 因為 C 語言認為人性本善, 所以視此條件永遠為真, 導致形成無窮迴圈, 此時必須利用 break 敘述來終止迴圈的執行, 如範例 5-1e 所示 有關 break 敘述的詳細說明, 請參閱 5-5 節 範例 5-1e /* ex5-1e.c */ /* 將範例 5-1a 的設定初值 條件判斷式及更新運算式省略 */ int num = 0; for( ; ; ) if(num > 5) /* 若 num 大於 5, 則執行 break, 以結束 for 迴圈 */ break; printf("num is %d\n", num); num++; 輸出結果 Num is 0 Num is 1 Num is 2 Num is 3 Num is 4 Num is 5 5-6

第 5 章迴圈敘述 程式剖析 在 for 迴圈中, 省略了條件判斷式, 表示其條件為真, 所以是一無窮迴圈 此時必須利用 if 敘述, 判斷 num 是否大於 5, 若是, 則執行 break, 以結束迴圈 上述幾個範例都已給定迴圈所要執行的次數, 此稱為定數迴圈 若沒有給定所要執行次數, 則稱之為不定數迴圈, 這種迴圈由使用者決定是否要繼續執行 範例 5-1f 就是一典型不定數迴圈的寫法 範例 5-1f /* ex5-1f.c */ /* 要求使用者不斷輸入數字, 直到數字為負 */ int num = 0; for( ; num >= 0; ) printf(" 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): "); scanf("%d", &num); printf(" 輸入結束!!"); 輸出結果 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): 77 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): 30 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): 25 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): 66 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): 12 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): -20 輸入結束!! 5-7

C 語言除錯高手 程式剖析 在 for 迴圈中只有條件運算式, 其它都省略了, 當輸入 num 的數值為負時, 將結束迴圈 最後, 我們撰寫一程式, 從 1 加到 100, 每次遞增 1, 如範例 5-1g 所示 範例 5-1g /* ex5-1g.c */ int i, total = 0; for (i = 1; i<=100; i++) printf("1 + 2 + 3 +... + 100 = %d\n", total); 輸出結果 1 + 2 + 3 +... + 100 = 5050 程式剖析 程式中的累加動作, 是以遞增的方式 (++) 來處理, 同時 for 迴圈執行的主體敘述是單一敘述, 所以左 右大括號省略了 如下所示 : for (i = 1; i<=100; i++) 當然也可以用遞減的方式 (--) 來處理, 如下所示 : for (i = 100; i>=1; i--) 5-8

第 5 章迴圈敘述 先將初值設為 100, 而條件運算式為 i>=1, 這樣就可以算出 1 加到 100 的總和 以此類推, 可以很容易的將 1 到 100 的奇數或偶數做累加 如 for (i = 2; i<=100; i+=2) 就是執行偶數的累加, 而奇數的累加, 則可以下列的片段程式表示之 for (i = 1; i<=100; i+=2) 小蔡老師上完 for 迴圈之後, 請大家計算 1 到 100 的偶數和 1. 以下是小王寫的程式, 請您更正之 /* bugs5-1a.c */. int i, total = 0; for(i=2; i<=100;) i += 2; printf("1 到 100 的偶數和是 %d\n", total); 2. 以下是小張寫的程式, 請您更正之 /* bugs5-1-2.c */ 5-9

C 語言除錯高手 int i, total; for(i=2; i<=100;) i += 2; printf("1 到 100 的偶數和是 %d\n", total); 3. 以下是小美女寫的程式, 請您更正之 /* bugs5-1-3.c */ int i, total=0; for(i=2; i<100;) i += 2; printf("1 到 100 的偶數和是 %d\n", total); 4. 以下是小帥哥寫的程式, 請您更正之 /* bugs5-1-4.c */ int i, total=0; for(i=1; i<100; i+=2) printf("1 到 100 的偶數和是 %d\n", total); 5-10

第 5 章迴圈敘述 5. 以下是小王子寫的程式, 請您更正之 /* bugs5-1-5.c */ int i, total=0; for(i=2; i<100; i+=2); printf("1 到 100 的偶數和是 %d\n", total); 6. 以下是小英寫的程式, 請您更正之 /* bugs5-1-6.c */ int i, total=0; for(i=1; i<100;) i += 2; printf("1 到 100 的偶數和是 %d\n", total); 1. 要求使用者利用 for 迴圈輸入一些數字, 當輸入 -9999 時結束輸入, 接著輸出這些數字的總和與平均 2. 利用 for 迴圈計算 1 + 3 + 5 +... + 99 的和 5-11

C 語言除錯高手 5-2 while 迴圈 接下來介紹 while 迴圈, 其語法如下 : while( 條件運算式 ) 條件運算式為真時, 執行的主體敘述 ; 若條件運算式為真, 則重覆執行其所對應的敘述 如範例 5-2a 所示 範例 5-2a /* ex5-2a */ int num = 0; while(num >= 0) printf(" 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): "); scanf("%d", &num); printf(" 結束 "); 輸出結果 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): 55 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): 75 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): 32 請輸入一整數 ( 當此數為負時, 將結束迴圈 ): -11 結束 5-12

第 5 章迴圈敘述 程式剖析 上例是將範例 5-1f 中的 for 迴圈, 改用 while 迴圈來執行 您有沒有發現, 其實只是將範例 5-1f 中的 for 改為 while, 並去掉分號而已 以流程圖表示如下 : 接下來, 我們以 while 迴圈完成 1 + 2 + 3 +... + 100 如範例 5-2b 所示 範例 5-2b /* ex5-2b.c */ int i = 1, total = 0; while (i<=100) i++; printf("1 + 2 + 3 +... + 100 = %d\n", total); 輸出結果 1 + 2 + 3 +... + 100 = 5050 5-13

C 語言除錯高手 程式剖析 這是將範例 5-1g 改寫的 輸出結果也是 5050 範例 5-2c 是要求使用者輸入一單字, 最後輸出此單字有多少字元 範例 5-2c /* ex5-2c.c */ /* 要求使用者輸入單字, 計算字數 */ char letter; int count = 0; printf(" 請輸入一行文字 : "); scanf("%c", &letter); while(letter!= '\n') count++; scanf("%c", &letter); printf(" 此行共有 %d 字 \n", count); 輸出結果 請輸入一行文字 : computer science 此行共有 16 字 程式剖析 利用 while 迴圈將輸入的字元加以讀取, 並加以累計之, 直到 '\n' 為止 5-14

第 5 章迴圈敘述 小蔡老師上完 while 迴圈之後, 請大家自己做一次 1 加到 100, 以下是幾個同學做的程式, 請你幫忙看一下 1. 以下是 Linda 撰寫的程式, 請您更正之 /* bugs5-2-1.c */ int main() int i = 1, total = 0; while (i<=100) i++; printf("1 + 2 + 3 +... + 100 = %d\n", total); 2. 以下是 Jennifer 撰寫的程式, 請您更正之 /* bugs5-2-2.c */ int main() int i = 1, total = 0; while (i<=100); i++; printf("1 + 2 + 3 +... + 100 = %d\n", total); 5-15

C 語言除錯高手 3. 以下是 Amy 撰寫的程式, 請您更正之 /* bugs5-2-3.c */ int main() int i = 1, total; while (i<=100) i++; printf("1 + 2 + 3 +... + 100 = %d\n", total); 4. 以下是 Wendy 撰寫的程式, 請您更正之 /* bugs5-2-4.c */ int main() int i = 1, total=0; while (i<100) i++; printf("1 + 2 + 3 +... + 100 = %d\n", total); 1. 請利用 while 迴圈, 要求使用者不斷輸入數字, 直到輸入的數字為 0 時停止, 試計算所輸入數字的總和與平均 2. 利用 while 迴圈, 修改範例 5-1e 5-16

第 5 章迴圈敘述 5-3 do...while 迴圈 do...while 迴圈的語法如下 : do 執行敘述 ; while( 條件運算式 ); 執行完大括弧 內的執行敘述後, 再判斷條件運算式是否為真, 若為真, 則繼續執行敘述, 直到條件運算式為假 所以迴圈內的敘述至少會被執行一次, 而 for 與 while 迴圈, 兩者皆要先判斷, 再決定是否要執行迴圈內的敘述 我們說 for 和 while 迴圈是理性的迴圈, 而 do...while 迴圈, 則是屬於衝動型的迴圈 注意, 在 do...while 的條件運算式後要加上分號 (;), 表示敘述的結束點 範例 5-3a /* ex5-3a.c */ int height; double inch; do printf(" 請問您的身高幾公分? "); scanf("%d", &height); while(height < 0); /* 身高若負, 則要求重新輸入 */ height /= 2.54; /* 將公分轉為公吋 */ printf(" 你的身高是 %d 呎 %d 吋 \n", height/12, height%12); /* 一呎等於 12 吋 */ 輸出結果 1 請問您的身高幾公分? 180 你的身高是 5 呎 10 吋 5-17

C 語言除錯高手 輸出結果 2 請問您的身高幾公分? -15 請問您的身高幾公分? 160 你的身高是 5 呎 2 吋 程式剖析 若您輸入的身高是負的, 則會要求您重新再輸入 其流程圖如下所示 : 接下來, 我們以 do...while 完成 1 + 2 + 3 +... + 100 的計算 如範例 5-3b 所示 範例 5-3b /* ex5-3b.c */ int i = 1, total = 0; do i++; while (i<=100); printf("1 + 2 + 3 +... + 100 = %d\n", total); 5-18

第 5 章迴圈敘述 輸出結果 1 + 2 + 3 +... + 100 = 5050 程式剖析 此程式的輸出結果, 如同利用 for 與 while 迴圈, 撰寫 1 加到 100 的程式 注意!do...while 迴圈內的敘述是先加總, 再對 i 加 1, 此順序是很重要的, 請您將這兩個敘述對調, 看看其輸出結果為何? 範例 5-3c 將建立一選單, 讓使用者選擇他想做的項目, 這個方法常常會用到, 請您細心的研讀之 範例 5-3c /* ex5-3c.c */ /* 建立選單, 讓使用者輸入選項完成該選項工作 */ int option, no1, no2; /* 此選單有三個功能 :1 為加法,2 為減法,3 則跳出程式 */ do printf("\n"); printf("1 => 加的運算 \n"); printf("2 => 減的運算 \n"); printf("3 => 結束 \n"); printf(" 請選擇 (1-3): "); scanf("%d", &option); switch(option) /* 使用 switch 選擇敘述來執行各項功能 */ case 1: printf(" 請輸入兩個整數 : "); scanf("%d %d", &no1, &no2); printf("%d + %d is %d\n", no1, no2, no1+no2); break; case 2: printf(" 請輸入兩個整數 : "); scanf("%d %d", &no1, &no2); printf("%d - %d is %d\n", no1, no2, no1 - no2); break; case 3: printf(" 再見!!"); break; 5-19

C 語言除錯高手 default: printf(" 錯誤的選擇!!\n"); while(option!= 3); /* 使用者輸入 3 則結束迴圈 */ 輸出結果 1 => 加的運算 2 => 減的運算 3 => 結束請選擇 (1-3): 1 請輸入兩個整數 : 25 64 25 + 64 is 89 1 => 加的運算 2 => 減的運算 3 => 結束請選擇 (1-3): 2 請輸入兩個整數 : 75 33 75-33 is 42 1 => 加的運算 2 => 減的運算 3 => 結束請選擇 (1-3): 4 錯誤的選擇!! 1 => 加的運算 2 => 減的運算 3 => 結束請選擇 (1-3): 3 再見!! 程式剖析 利用 switch 敘述, 讓使用者以選單方式選擇它想做的事, 當選項為 3 時, 則結束迴圈 5-20

第 5 章迴圈敘述 小蔡老師上完 do...while 迴圈後, 出了一題實作題, 請計算 100+99+98+...+1 等於多少? 以下是幾個同學所撰寫的程式, 請大家看一下 1. 以下是小庭寫的程式, 若有錯誤, 請您更正之 /* bugs5-3-1.c */ int i = 100, total = 0; do i++; while (i<=1); printf("100+99+98+...+1 = %d\n", total); 2. 以下是真古意寫的程式, 若有錯誤, 請您更正之 /* bugs5-3-2.c */ int i = 100, total = 0; do i--; while (i<=1); printf("100+99+98+...+1 = %d\n", total); 3. 以下是真古錐寫的程式, 若有錯誤, 請您更正之 /* bugs5-3-3.c */ 5-21

C 語言除錯高手 int i = 100, total = 0; do i--; while (i>=1) printf("100+99+98+...+1 = %d\n", total); 4. 以下是真臭屁寫的程式, 若有錯誤, 請您更正之 /* bugs5-3-4.c */ int i = 100, total = 0; do i--; while (i>=1); printf("100+99+98+...+1 = %d\n", total); 1. 使用 do...while 迴圈改寫範例 5-1e 2. 利用 do...while 計算 1 到 100 的偶數和 5-4 巢狀迴圈 在迴圈敘述中, 又出現迴圈敘述, 則稱此為巢狀迴圈 (nested loop) 小學生的墊板常常有印出以下的九九乘法表, 如下圖所示 : 5-22

第 5 章迴圈敘述 我們就以此來解說巢狀迴圈 請參閱範例 5-4a 範例 5-4a /* ex5-4a.c */ /* 以巢狀 for 迴圈輸出九九乘法表 */ int i, j; printf("%44s", "<< 九九乘法表 >>\n"); for(i=1; i<=9; i++) /* 此為外迴圈 */ for(j=1; j<=9; j++) /* 此為內迴圈 */ printf("%d*%d=%2d ", j, i, i*j); printf("\n"); 輸出結果 如同上圖 程式剖析 此程式利用巢狀迴圈輸出上圖九九乘法表 其中迴圈部份共執行了 9 乘以 9, 共 81 次 外迴圈 i 從 1 執行到 9, 而內迴圈 j 從 1 執行到 9 當 i 等於 1 時,j 會執行 9 次, 再回到外迴圈將 i 加 1, 等於 2, 由於 i 還是小於等於 9, 5-23

C 語言除錯高手 所以再執行外迴圈的 j, 從 1 到 9 共 9 次, 週而復始, 直到 i 大於 9 結束 程式利用欄位寬控制輸出的格式 我們再看下一範例 範例 5-4b /* ex5-4b.c */ /* 以巢狀 for 迴圈輸出九九乘法表 */ int i, j; printf("%44s", "<< 九九乘法表 >>\n"); for(i=1; i<=9; i++) /* 此為外迴圈 */ for(j=1; j<=9; j++) /* 此為內迴圈 */ printf("%d*%d=%2d ", i, j, i*j); printf("\n"); 輸出結果 程式剖析 此一範例和範例 5-4a 的輸出結果不太一樣, 請仔細觀察 printf 的敘述, 您找到不一樣的地方了嗎? 5-24

第 5 章迴圈敘述 小蔡老師請大家自已動手撰寫屬於九九乘法表的程式, 以下是幾位同學所撰寫的程式, 請大家一起來 debug 一下 1. 下一個程式是阿宏寫的程式, 請您修改一下 /* bugs5-4-1.c*/ int i, j; for(i = 1; i <=9; i++) for(j = 1; j <=9; j++) printf("%d*%d=%2d ", j, i, i*j); 2. 下一個程式是阿呆寫的程式, 請您修改一下 /* bugs5-4-2.c*/ int i, j; for(i = 1; i <=9; i++) for(j = 1; j <=9; j++) printf("%d*%d=%2d ", j, i, i*j); printf("\n"); 3. 下一個程式是阿志寫的程式, 請您修改一下 /* bugs5-4-3.c*/ int i, j; for(i = 1; i <=9; i++) 5-25

C 語言除錯高手 for(j = 1; j <=9; j++) printf("%d*%d=%2d\n", j, i, i*j); 4. 下一個程式是阿吉寫的程式, 請您修改一下 /* bugs5-4-4.c*/ int i, j; for(i = 1; i <=9; i++); for(j = 1; j <=9; j++) printf("%d*%d=%2d ", j, i, i*j); printf("\n"); 1. 以巢狀迴圈計算 1 * 1 + 1 * 2 +... + 1 * 9 + 2 * 1 + 2 * 2 +... + 9 * 9 5-5 break 與 continue break 和 continue 使用說明, 請參閱下表 敘述說明 break continue 強制結束迴圈或 switch...case 敘述 放棄執行 continue 以下的敘述, 但不會結束迴圈 5-26

第 5 章迴圈敘述 break 敘述 break 敘述的功能, 是結束迴圈或 switch...case 敘述的執行 但有一限制是 break 只能結束一層迴圈, 若 break 敘述是在巢狀迴圈的內層, 則它只能結束內層迴圈, 而不會結束整個迴圈 範例 5-5a /* ex5-5a.c */ /* 要求輸入一個單字, 顯示並計算字元個數 */ char letter; int count = 0; printf(" 請輸入一個單字 : "); scanf("%c", &letter); while(letter!= '\n') if(letter == 'a') /* 若遇到字元為 a, 則強迫跳離 */ break; if(letter!= '\n') count++; printf("%c", letter); scanf("%c", &letter); printf(" 共有 %d 字元 \n", count); 輸出結果 1 請輸入一個單字 : computer computer 共有 8 個字元 輸出結果 2 請輸入一個單字 : software softw 共有 5 字元 5-27

C 語言除錯高手 程式剖析 當遇到輸入字元為 a, 則使用 break 強制結束迴圈, 所以輸出結果 1 中, 能正確計算並顯示, 而輸出結果 2, 只顯示字元 a 之前的字元 再來看範例 5-5b, 它是利用不定數迴圈和 break 若輸入的整數值是 -999 時, 則結束迴圈, 否則, 將此整數值加總起來 範例 5-5b /* ex5-5b.c*/ int main() int i, num, total=0; printf(" 輸入 10 個整數, 累加正整數, 當輸入的值是負的, 則結束迴圈 \n"); for(i=1; i<=10; i++) printf(" 請輸入第 %2d 個整數 : ", i); scanf("%d", &num); if ( num >= 0) total += num; else break; printf("total=%d\n", total); 輸出結果 1 輸入 10 個整數, 累加正整數, 當輸入的值是負的, 則結束迴圈請輸入第 1 個整數 : 1 請輸入第 2 個整數 : 2 請輸入第 3 個整數 : 3 請輸入第 4 個整數 : 4 請輸入第 5 個整數 : 5 請輸入第 6 個整數 : 6 請輸入第 7 個整數 : 7 請輸入第 8 個整數 : 8 5-28

第 5 章迴圈敘述 請輸入第 9 個整數 : 9 請輸入第 10 個整數 : 10 Total = 55 輸出結果 2 輸入 10 個整數, 累加正整數, 當輸入的值是負的, 則結束迴圈請輸入第 1 個整數 : 1 請輸入第 2 個整數 : 2 請輸入第 3 個整數 : 3 請輸入第 4 個整數 : 4 請輸入第 5 個整數 : 5 請輸入第 6 個整數 : 6 請輸入第 7 個整數 : -90 Total = 21 程式剖析 使用者最多只能輸入十個整數, 如輸出結果 1 所示 當輸入的值是負的時候, 則不管您有沒有輸入十個數 迴圈主體內使用 break 來結束迴圈, 最後, 將 total 印出 如輸出結果 2 所示 continue 敘述 continue 敘述的功能是不執行 continue 以下的敘述, 而是再次的回到迴圈, 以執行適當的敘述 請參閱範例 5-5c 範例 5-5c /* ex5-5c.c */ /* 要求輸入一個單字, 顯示並計算字元個數 */ char letter; int count = 0; printf(" 請輸入一個單字 : "); scanf("%c", &letter); 5-29

C 語言除錯高手 while(letter!= '\n') if(letter == 'a') /* 若遇到字元為 a, 不列入顯示及計算 */ scanf("%c", &letter); continue; if(letter!= '\n') count++; printf("%c", letter); scanf("%c", &letter); printf(" 共有 %d 字元 \n", count); 輸出結果 1 請輸入一個單字 : software softwre 共有 7 字元 輸出結果 2 請輸入一個單字 : hardware hrdwre 共有 6 字元 程式剖析 將範例 5-5c 與範例 5-5a 比較, 就可以很明顯的發現 break 與 continue 的差別了, 使用 break 時, 遇到字元 a 後所有的字元皆不列入計算, 這是因為遇到字元 a 就跳出迴圈了 ; 而使用 continue, 只是放棄計算及顯示字元 a 的敘述而已, 但沒有結束迴圈, 所以除了 a 以外的字元, 皆能顯示並加以計算之 再來看範例 5-5d 5-30

第 5 章迴圈敘述 範例 5-5d /* ex5-5d.c*/ int main() int i, num, total=0; printf(" 輸入 10 個整數, 累加正整數 \n"); for(i=1; i<=10; i++) printf(" 請輸入第 %2d 個整數 : ", i); scanf("%d", &num); if ( num >= 0) total += num; else continue; printf("total=%d\n", total); 輸出結果 輸入 10 個整數, 累加正整數請輸入第 1 個整數 : 1 請輸入第 2 個整數 : 2 請輸入第 3 個整數 : 3 請輸入第 4 個整數 : 4 請輸入第 5 個整數 : 5 請輸入第 6 個整數 : -1 請輸入第 7 個整數 : 6 請輸入第 8 個整數 : 7 請輸入第 9 個整數 : 8 請輸入第 10 個整數 : 9 Total = 45 程式剖析 使用者一定要輸入十個整數, 但只累加正整數, 而忽略負整數 此範例與範例 5-5b 類似, 只是將 break 改為 continue 而已 5-31

C 語言除錯高手 1. 以下程式是小張以範例 ex5-5d 為基礎所寫出來的, 他將 for 迴圈改為 while 迴圈而已, 試問這樣寫是對嗎? 若不對, 請您修改一下囉! /* bugs5-5-1.c*/ int main() int i=1, num, total=0; printf(" 輸入 10 個整數, 只累加正整數 \n"); while(i<=10) printf(" 請輸入第 %2d 個整數 : ", i); scanf("%d", &num); if ( num >= 0) total += num; else continue; printf("total=%d\n", total); 2. 以下的程式是在加總您所輸入的整數值, 直到輸入 -999 為止 以下是小李子寫的程式, 請問他這樣寫對嗎? 若不對, 請加以修正之 /* bugs5-5-2.c */ int num, total=0; for(;;) printf("please input a number (-999 to quit): "); scanf("%d", &num); if ( num!= -999) total += num; printf("total=%d\n", total); 5-32

第 5 章迴圈敘述 3. 2008 年的總統大選, 假設有 3 個候選人, 分別是 1 號 : 謝長停,2 號 : 馬應久,3 號 : 宋安安 今有 10 張選票, 分別投給某位候選人, 最後請印出每位候選人的得票數及廢票 以下是小張寫的程式, 請你幫他改一下 感謝你 /* bugs5-5-3.c */ int i, number, a1=0, a2=0, a3=0, others=0; for(i=1; i<=10; i++) printf(" 候選人 : 1 號謝長停,2 號馬應久,3 號林痔嘉 \n"); printf(" 你要投那一個候選人 : "); scanf("%d", &number); switch (number) case 1: a1++; case 2: a2++; case 3: a3++; default: others++; printf("a1=%d, a2=%d, a3=%d, and others=%d\n", a1, a2, a3, others); 1. 請撰寫一程式, 至多輸入十個整數, 若輸入的值是偶數, 則將它加總起來, 若不是偶數, 則結束迴圈 最後將總和印出 2. 請撰寫一程式, 一定會輸入十個整數, 若輸入的值是偶數, 則將它加總起來 最後將總和印出 5-33

C 語言除錯高手 5-6 ++ 附加於條件運算式 當 ++ 附加於條件運算式時, 會使程式更加精簡, 但不易了解 例如, 我們可以將範例 5-2b 的以下片段程式 int i = 1, total = 0; while (i<=100) i++; 改寫為以下的片段程式 int i = 0, total = 0; while (++i <= 100) 這樣也可以達到相同的效果 值得注意的是, 現在 i 的初值是 0, 且 while 迴圈的條件運算式為 ++i <= 100 此運算式有兩個運算子 ++ 和 <=, 所以會執行兩件事 由於 ++ 運算優先順序高於 <=, 因此, ++ 先處理 這一運算式可視為先將 i 加 1, 再判斷 i 是否小於等於 100; 若為真, 則執行 total += i 若為假, 則結束迴圈 如範例 5-6a 所示 範例 5-6a /* ex5-6a.c */ int i = 0, total = 0; 5-34

第 5 章迴圈敘述 while (++i <= 100) printf("1 + 2 + 3 +... + 100 = %d, i=%d\n", total, i); 輸出結果 1 + 2 + 3 +... + 100 = 5050, i=101 程式剖析 從輸出結果得知, 當 i 的值為 101, 則會結束迴圈 若將上述的前置加改為後繼加, 則下列的片段程式 int i = 0, total = 0; while (i++ < 100) 也可達成相同的效果, 但值得注意的是, 此處 while 迴圈的條件運算式為 i++ < 100 此條件運算式也有兩個運算子 ++ 和 <, 雖然 ++ 運算優先順序高於 <, 但由於它是後繼加, 所以會先處理 < 的運算子 此敘述可視為先判斷 i 是否小於 100, 不管此條件運算式為真或為假, 皆會執行 i 加 1, 這一點要特別注意 若條件運算式為真, 則會執行 若為假, 則不處理累加的動作 注意, 迴圈結束點是 i 等於 101 如範例 5-6b 所示 : 範例 5-6b /* ex5-6b.c */ 5-35

C 語言除錯高手 int i = 0, total = 0; while (i++ < 100) printf("1 + 2 + 3 +... + 100 = %d, i=%d\n", total, i); 輸出結果 1 + 2 + 3 +... + 100 = 5050, i=101 上述的觀念也可以 do...while 迴圈撰寫之, 請參閱範例 5-6c 與 5-6d, 其輸出結果同上 範例 5-6c /* ex5-6c.c */ int i=1, total=0; do while (++i <= 100); printf("1 + 2 + 3 +... + 100 = %d, i=%d\n", total, i); 範例 5-6d /* ex5-6d.c */ int i=1, total=0; do while (i++ < 100); printf("1 + 2 + 3 +... + 100 = %d, i=%d\n", total, i); 5-36

第 5 章迴圈敘述 程式剖析 這兩個範例程式的差異是小於等於 100, 或是小於 100 當使用前置加時, 條件運算式為 ++i <= 100, 而當使用後繼加時, 條件運算式則為 i++ < 100 小蔡老師請大家將 1 加至 100, 並輸出 Total = 5050 以下是班上幾位同學所撰寫的程式, 請您 debug 一下 1. /* bugs5-6-1.c*/ int i = 0, total = 0; while (i++ <=100) printf("total = %d\n", total); 2. /* bugs5-6-2.c*/ int i = 0, total = 0; while (++i < 100) printf("total = %d\n", total); 5-37

C 語言除錯高手 3. /* bugs5-6-3.c*/ int i = 1, total = 0; while (++i <= 100) printf("1 + 2 + 3 +... + 100 = %d\n", total); printf("i=%d\n", i); 4. /* bugs5-6-4.c*/ int i = 1, total = 0; do total +=i; while(i++<=100); printf("1 + 2 + 3 +... + 100 = %d\n", total); printf("i=%d\n", i); 1. 試問下列片段程式的輸出結果為何? (a) int i=1,total=0; do while(i++<=100); printf("total = %d\n",total); 5-38

第 5 章迴圈敘述 (b) int i=1,total=0; do while(++i<=100); printf("total = %d\n", total); (c) int i=1, total=0; do while(i++ < 100); printf("total = %d\n", total); 5-7 關鍵字 迴圈敘述 (loop statement) for while do...while 巢狀迴圈 (nested loop) continue 5-8 問題演練 1. 試問下一程式的輸出結果為何? int i = 0; while (i < 3 ) switch (i++) case 0: printf("merry"); case 1: printf("merr"); break; case 2: printf("mer"); default: printf("christmas"); 5-39

C 語言除錯高手 2. 試問下一程式的輸出結果為何? 請以下列資料測試之 1, 1, 1, 2, 3, 0, 1, 4, 1, 3 int i = 0, num = 0, total = 0; printf("input 10 numbers, or type 0 to quit\n"); while(i++ < 10) printf(" %2d:", i); scanf("%d", &num); if (num ==0) break; total = total + num; printf("total = %d\n", total); 3. 試問下一程式的輸出結果為何? 請以下列資料測試之 1, 1, 1, 2, 3, 0, 1, 4, 1, 3 int i = 0, num = 0, total = 0; printf("input 10 numbers, or type 0 to continue\n"); while(i++ < 10) printf(" %2d:", i); scanf("%d", &num); if (num == 0) continue; total = total + num; printf("total = %d\n", total); 5-40

第 5 章迴圈敘述 4. 試問下一程式的輸出結果為何? int main() int i, num, total=0; printf(" 累加正整數 \n"); for(i=1; i<=10; i++) printf(" 請輸入 #%d 個整數 : ", i); scanf("%d", &num); if ( num >= 0) total += num; else continue; printf("total=%d\n", total); 5. 試問下列片段程式的輸出結果為何? (a) int x=0; while(++x<3) printf("%4d\n", x); (b) int x=100; while(x++<103) printf("%4d\n", x); printf("%4d\n", x); (c) char ch='s'; while(ch<'w') printf("%c", ch); ch++; printf("%c\n", ch); 5-41

C 語言除錯高手 6. 試問下列程式的輸出結果為何? (a) int main() int i,i1=0, i2=0, i3=0, i4=0, others=0, k; for(k=1; k<=5; k++) printf("please input a number : "); scanf("%d", &i); switch(i) case 1: i1++; break; case 2: i2++; break; case 3: i3++; break; case 4: i4++; break; default: others++; printf("i1=%d, i2=%d, i3=%d, i4=%d, others=%d\n",i1,i2,i3,i4,others); 試問分別輸入 1, 2, 3, 4, 5 的結果為何? (b) int main() int i,i1=0,i2=0,i3=0,i4=0,others=0, k; for(k=1; k<=5; k++) printf("please input a number:"); scanf("%d",&i); switch(i) case 1: i1++; case 2: i2++; break; case 3: i3++; case 4: i4++; break; 5-42

第 5 章迴圈敘述 default: others++; printf("i1=%d,i2=%d,i3=%d,i4=%d,others=%d\n",i1,i2, i3,i4,others); 試問分別輸入 1,2,3,4,5 的結果為何? 5-9 程式實作 1. 利用迴圈敘述, 印出以下的圖形 (a) * *** ***** ******* ********* ******* ***** *** * (b) * ** *** **** ***** ****** ******* ******** 2. 先要求使用者輸入等差數列的首項與公差, 再輸入項數, 最後, 利用迴圈敘述計算該數列的和 3. 利用迴圈敘述, 印出攝氏溫度與華氏溫度的對照表 從攝氏溫度 -50 到 100, 每間隔 10 印出 ( 提示 : 華氏溫度 =9/5 攝氏溫度 +32.0) 4. 印出費氏數列 (Fibonacci) 的前 15 次 ( 提示 : 某一項是其前兩項之和, 第一項為 1, 第二項為 1) 5-43

C 語言除錯高手 5. 以 16 進位印出 15 15 之乘法表, 輸出格式如下所示 5-44