




已閱讀5頁(yè),還剩107頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2.8 switch語句,1問題的提出,例2-23所涉及的問題是一個(gè)多分支程序設(shè)計(jì)問題,如何使得多分支結(jié)構(gòu)更為簡(jiǎn)單和清晰?程序設(shè)計(jì)語言提供什么樣的支持了?請(qǐng)看下面的例子:,例2-24 用switch語句來實(shí)現(xiàn)例2-23所給的問題。,分析,例2-23 提出的問題屬于多分支問題,如果我們將百分 制成績(jī)除以10,那么在60100這一分?jǐn)?shù)段內(nèi),我們可以每十分一段,得到五個(gè)順序的整數(shù)值:6,7,8,9,10,也稱為開關(guān)值,它們代表五個(gè)分支。而成績(jī)小于60分則籠統(tǒng)地視為E,百分制和五分制的關(guān)系如下:,顯然,表達(dá)式“成績(jī)/10”把一個(gè)數(shù)值范圍轉(zhuǎn)換成若干個(gè)“單值”開關(guān)點(diǎn),這是問題的關(guān)鍵所在。,百分制成績(jī) 百分制成績(jī)/10 五級(jí)記分制成績(jī) 60 1-5 E 60-69 6 D 70-79 7 C 80-89 8 B 90-99 9 A 100 10 A,我們用switch語句來實(shí)現(xiàn)之:,問題的提出(2),#include void main() int grade1,s; char grade2; cout grade1; s=grade1/10; if (s6) /grade160 grade2=E; else,程序,switch (s) case 6: grade2=D; break; case 7: grade2= C; break; case 8: grade2=B; break; case 9: case 10: grade2=A; break; default cout “輸入的百分制成績(jī)有誤!“ endl; cout “五分制成績(jī)?yōu)椋骸?grade2endl; ,/ 60=grade70,/ 70=grade80,/80=grade90,/90=grade=100,關(guān)于程序的解釋,問題的提出(5), switch (s) case 6: grade2=D; break; case 7: grade2= C; break; case 8: grade2=B; break; case 9: case 10: grade2=A; break; default cout “輸入的百分制成績(jī)有誤!“ endl; cout “五分制成績(jī)?yōu)椋骸?grade2endl; ,case 6: case 10:分別代表分?jǐn)?shù)段為60100內(nèi)的5個(gè)分支。default表示預(yù)想之外的分支,例外情況很多,此處用于處理成績(jī)輸入錯(cuò)誤。,break是一個(gè)語句,用來跳過switch語句中,該語句所在的分支以下的所有分支,轉(zhuǎn)入switch語句的下一語句,也即結(jié)束switch語句的執(zhí)行。,2. switch語句的語法,switch (exp) case constant-exp1: statements1; case constant-exp2: statements2; case constant-expn: statementsn; default: statementn+1; ,exp:表達(dá)式,也稱為開關(guān)表達(dá)式,其運(yùn)算結(jié)果通常為整型或字符型或枚舉類型數(shù)據(jù)。,constant-exp:常量表達(dá)式(通常為單個(gè)常量)。switch語句中包含n個(gè)常量表達(dá)式,與case一起作為n組分支的標(biāo)號(hào)。,statements:語句組,是switch語句的分支部分,可以由一個(gè)到多個(gè)語句組成,當(dāng)語句組中出現(xiàn)新的switch語句,稱為switch的嵌套。,default:代表缺省分支(第n+1個(gè)分支),是對(duì)開關(guān)表達(dá)式取值超出正常取值范圍的一種特殊處理。,switch語句的語法(2),關(guān)于語法的幾點(diǎn)說明,(1)常量表達(dá)式(constant-exp)的值必須在開關(guān)表達(dá)式的取值范圍內(nèi),并且同一個(gè)switch語句中的n個(gè)常量表達(dá)式的值不能相同。,例如:例2-11所給程序中的switch語句的各個(gè)常量表達(dá)式的值分別為6,7,8,9,10,均在開關(guān)表達(dá)式gread/10的取值范圍內(nèi)。,(2)switch語句中最多包含n+1個(gè)語句組,作為n+1個(gè)可執(zhí)行分支。允許一個(gè)語句組對(duì)應(yīng)多個(gè)分支標(biāo)號(hào)(常量表達(dá)式),也即多個(gè)分支執(zhí)行相同的處理。,switch (exp) case constant-exp1: statements1; case constant-expn: statementsn; default: statementn+1; ,switch語句的語法(3),(3)語句組如果包含多個(gè)語句,其前后不用加花括號(hào)。,(4) default是任選項(xiàng)。,switch (exp) case constant-exp1: statements1; case constant-expn: statementsn; default: statementn+1; ,3. Switch語句的語義,(2)根據(jù)exp的值,選擇對(duì)應(yīng)的case constant-exp(標(biāo)號(hào)),并執(zhí)行其所代表的語句組。,(1)計(jì)算開關(guān)表達(dá)式exp ;,(3)若語句組中帶有break語句,當(dāng)執(zhí)行到該語句時(shí)跳轉(zhuǎn)至switch語句的下一語句,否則順序執(zhí)行該語句組以下的各個(gè)語句組(各個(gè)分支),直至最后一個(gè)語句組、或遇到break語句、跳出switch。,switch (exp) case constant-exp1: statements1; case constant-expn: statementsn; default: statementn+1; ,switch (exp) case constant-exp1: statements1; case constant-exp2: statements2; case constant-expn: statementsn; default: statementn+1; ,分析switch語句的語義可以看出:,switch語句的語義(2),case constant-exp:和default:只作為語句的入口標(biāo)號(hào),本身并不能改變控制流程,也即無法控制跳過switch語句的其它分支;,跳過switch語句的其它分支這一控制交由break語句實(shí)現(xiàn)。,程序段1: switch (color) case Red: cout “紅色“ endl; case Blue: cout “藍(lán)色“ endl; case Green: cout “綠色“ endl; ,為什么?,請(qǐng)比較下面的兩個(gè)程序段:它們有助于你了解break在switch語句中作用:,switch語句的語義(3),如果color的值是Blue,則輸出:藍(lán)色 、 綠色。,執(zhí)行結(jié)果:?,程序段2: switch (color) case Red: cout “紅色“ endl; break; case Blue: cout “藍(lán)色“ endl; break; case Green: cout “綠色“ endl; ,switch語句的語義(4),如果color的值是Blue,則僅輸出藍(lán)色。這是因分支中所包含的Break語句在起作用,所以case通常與break聯(lián)用,以保證多路分支的正確實(shí)現(xiàn)。,執(zhí)行結(jié)果:?,4switch語句的應(yīng)用,我們通過一個(gè)例子來進(jìn)一步闡述switch的用法:,例2-25 輸入兩個(gè)整型數(shù)和一個(gè)算術(shù)運(yùn)算符,輸出對(duì)應(yīng)的表達(dá)式及計(jì)算結(jié)果。,問題分析,(1)所輸入的兩個(gè)數(shù)按其輸入順序分別作為第一操作數(shù)(Value1)和第二操作數(shù)(Value2);,(2)算術(shù)運(yùn)算符op限制為+、-、*、/,四種;,(3)表達(dá)式表示為:Value1 Value2。,通過上面的分析,我們知道可以用switch語句來區(qū)分op的四種取值,以決定如何構(gòu)造并計(jì)算對(duì)應(yīng)的表達(dá)式。,switch語句的應(yīng)用(2),源程序,#include void main() int value1,value2; char op; cout value1 value2; cout op;,/輸入操作數(shù)1和操作數(shù)2,/輸入操作符到op變量中,switch (op) case +: cout value1 op value2 “=“ value1+ value2 endl; break; case -: cout value1 op value2 “=“ value1- value2 endl; break; case *: cout value1 op value2 “=“ value1* value2 endl;break; case /: cout value1 op value2 “=“ value1/ value2 endl; break; default: cout “輸入的操作符有誤!“ endl; ,2.9 break語句和continue語句,1. break語句,break和continue這兩個(gè)語句都可以用來改變程序的控制流程。,用途,可以出現(xiàn)在switch語句的分支語句組和各種循環(huán)語句的循環(huán)體中,用來終止switch語句、循環(huán)語句的執(zhí)行,轉(zhuǎn)入下一語句。,舉例,switch (color) case Red: cout “紅色“ endl; break; case Blue: cout “藍(lán)色“ endl; break; case Green: cout “綠色“ endl; ,break語句 (2),break;,語法,語義,使程序從switch語句中,或循環(huán)語句的循環(huán)體中跳出,繼續(xù)執(zhí)行邏輯上的下一條語句。,break語句 (3),2. continue語句,用途,與if語句聯(lián)合使用(作為if語句的一個(gè)分支),出現(xiàn)在循環(huán)語句的循環(huán)體中,用來終止本次循環(huán)。,while(exp) if (exp1) continue; ,語法,continue;,語義,結(jié)束本次循環(huán),也即跳過循環(huán)體中尚未執(zhí)行的語句,進(jìn)入是否執(zhí)行下一次循環(huán)的判斷。,注意,continue語句只能出現(xiàn)在循環(huán)結(jié)構(gòu)中,而且必須與if語句或switch語句聯(lián)合使用,否則會(huì)導(dǎo)致循環(huán)無效。,continue語句 (2),2.10 while語句,1. 循環(huán)問題的再提出,分析例2-25所給的程序,可以看出:該程序每運(yùn)行一次只能出一道算術(shù)題并求值,如果希望程序運(yùn)行過程中能不斷地重復(fù)出題、計(jì)算,如何做到這一點(diǎn)了?答案是惟一的:,用循環(huán)語句構(gòu)造循環(huán)結(jié)構(gòu)以控制出題、計(jì)算等動(dòng)作或處理的重復(fù)執(zhí)行。請(qǐng)看下面的例子:,例2-26 在例2-25所給程序的基礎(chǔ)增加循環(huán)出題、計(jì)算功能。,1. 循環(huán)問題的再提出 (2),#include void main() int value1,value2; char op; cout value1 value2; cout op; switch (op) case +: cout value1 op value2 “=“ value1+ value2 endl; break; case -: cout value1 op value2 “=“ value1- value2 endl; break; case *: cout value1 op value2 “=“ value1* value2 endl;break; case /: cout value1 op value2 “=“ value1/ value2 endl; break; default: cout “輸入的操作符有誤!“ endl; ,(1)引入循環(huán)語句,將原題所要求的輸入操作數(shù)、操作符,顯示計(jì)算結(jié)果等處理作為循環(huán)語句的重復(fù)部分(右圖紅框部分),即可控制上述操作的重復(fù)執(zhí)行。,實(shí)現(xiàn)方法要點(diǎn),(2)用op=e作為循環(huán)的終了條件。,程序,#include void main() int value1,value2; char op= ; while (op!=e) cout value1 value2; cout op; if (op=e) continue;,/循環(huán)語句,控制循環(huán)體的重復(fù)執(zhí)行,switch (op) case +: cout value1 op value2 “=“ value1+ value2 endl; break; case -: cout value1 op value2 “=“ value1- value2 endl; break; case *: cout value1 op value2 “=“ value1*value2 endl; break; case /: cout value1 op value2 “=“ value1/value2 endl; break; default: cout “輸入的操作符有誤!“ endl; /switch end /while end /main end,程序分析,1. 循環(huán)問題的再提出 (4),(1)我們對(duì)例3-13的程序增加一個(gè)while語句,該循環(huán)語句可以重復(fù)執(zhí)行到所輸入的操作符等于e,這樣就可保證該程序能重復(fù)出題、計(jì)算。,#include void main() int value1,value2; char op= ; while (op!=e) cout value1 value2; cout op; if (op=e) continue; switch (op) case +: cout value1 op value2 “=“ value1+ value2 endl; break; case -: cout value1 op value2 “=“ value1- value2 endl; break; case *: cout value1 op value2 “=“ value1*value2 endl; break; case /: cout value1 op value2 “=“ value1/value2 endl; break; default: cout “輸入的操作符有誤!“ endl; /switch end /while end /main end,(2)試問循環(huán)體中的 if (op=e )continue 語句起到什么作用?,2循環(huán)語句概述,重復(fù)結(jié)構(gòu)(循環(huán)結(jié)構(gòu))是十分重要的程序結(jié)構(gòu),分為“當(dāng)型”和“直到型”兩種控制形式。,c+提供三種循環(huán)語句(while語句、do while語句、for語句),用來實(shí)現(xiàn)循環(huán)結(jié)構(gòu)。,其中while語句和for語句用來實(shí)現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu),do while語句則用來實(shí)現(xiàn)“直到型”循環(huán)結(jié)構(gòu)。,3 while語句,while語句的語法,while (exp) statement;,例如: void main() int i=0,s=0; while (i=100) s=s+i;i+; ,語法解釋,()exp:表達(dá)式,可以是算術(shù)表達(dá)式、關(guān)系表達(dá)式和邏輯表達(dá)式等。其計(jì)算結(jié)果用來決定是否執(zhí)行下一次循環(huán),因此被稱為循環(huán)條件表達(dá)式。,()statement:可以是簡(jiǎn)單語句,也可以是復(fù)合語句。這些語句能被重復(fù)執(zhí)行,所以稱為:“循環(huán)體”。,注意,3 while語句(),(1)通常把參與循環(huán)條件表達(dá)式運(yùn)算的關(guān)鍵數(shù)據(jù)對(duì)象稱為循環(huán)變量或循環(huán)控制變量。,例2-26的op和前例的i均起到這種關(guān)鍵作用,它們都是循環(huán)控制變量。,具體實(shí)現(xiàn)是:通過輸入op來改變表達(dá)式op!=e的值。 while (op!=e) cin op; ,3 while語句(3),(2)循環(huán)體中必須含有能改變循環(huán)控制變量的運(yùn)算,否則會(huì)導(dǎo)致“死循環(huán)”。為什么?,(3)循環(huán)體如果包含多個(gè)語句,則必須用復(fù)合語句表示之。,問題:以下程序段能完成1+2+100的運(yùn)算嗎? void main() int i=0,s=0; while (i=100) s=s+i;i+; ,答案:不能; 理由:違背了(2)和(3) 的規(guī)定。,4while語句的語義,當(dāng)循環(huán)條件表達(dá)式的值為真,則執(zhí)行循環(huán)體,否則結(jié)束循環(huán)。故稱為“當(dāng)型”循環(huán)。,語義,執(zhí)行步驟,(1)設(shè)置循環(huán)控制變量初值;,(2) 計(jì)算exp;,(3)如果exp的值為真,則轉(zhuǎn)(4),否則轉(zhuǎn) (6);,(4)執(zhí)行statement;,(5)轉(zhuǎn)(2);,(6)結(jié)束循環(huán)語句的執(zhí)行,轉(zhuǎn)下一語句。,用自然語言描述這種邏輯結(jié)構(gòu)較為復(fù)雜的語句的語義顯然不夠清晰,我們可以改用用流程圖或N-S結(jié)構(gòu)圖來描述其語義。,5while語句的應(yīng)用,下面我們通過一個(gè)有關(guān)字符串處理的實(shí)際問題來講述while語句的應(yīng)用。,例2-27 求指定字符串的長(zhǎng)度。,解釋,所謂字符串就是一個(gè)字符序列,該序列以結(jié)束符(0)結(jié)束。例如“ abcde”。,所謂字符串長(zhǎng)度就是字符序列所包含的字符個(gè)數(shù)。例如“abcde”的長(zhǎng)度為5。,5while語句的應(yīng)用(2),實(shí)現(xiàn)方法,(1)將字符序列存放在字符數(shù)組中,該數(shù)組的每一元素存放一個(gè)字符。,例如:字符串“abcd”存放在s數(shù)組中,可以用右圖形象地表示:,(2)我們對(duì)字符串的n個(gè)字符逐個(gè)比較:si!=0(i=0,1,2,),直至找到結(jié)束符,即可判定該串結(jié)束,比較次數(shù)-1就是該串的長(zhǎng)度。,(3)n次比較過程可以用while語句來控制。,#include void main() char s30; int i; cout s; i=0; cout “所輸入的字符串長(zhǎng)度為:“ i endl; ,while (si!=0) i+;,程序,2.11 do while語句,1為什么要引入do while語句,while語句是先判斷循環(huán)條件再執(zhí)行循環(huán)體,這就存在著循環(huán)體一次都不執(zhí)行的可能,但是類似于例2-26這類問題,其特征是先出題,接著再判斷要不要出下一題,也即至少要執(zhí)行一次循環(huán)體。,這樣的循環(huán)問題屬于“直到型”循環(huán)問題。顯然不適合于用while語句來描述。所以我們引入do while語句來解決這類問題。,例2-28 將例2-26所給程序的循環(huán)部分由while循環(huán)改為do while循環(huán)。,#include void main() int value1,value2; char op,finish; do cout value1 value2; cout op; switch (op) cout finish; while(finish! = y); ,新增設(shè)的變量,其作用?,2do while語句的語法,語法,do statement while (exp);,exp:表達(dá)式,可以是算術(shù)表達(dá)式、關(guān)系表達(dá)式和邏輯表達(dá)式等。通常稱為稱為循環(huán)條件表達(dá)式,其計(jì)算結(jié)果用來決定是否執(zhí)行下一次循環(huán)。,statement:語句,可以是簡(jiǎn)單語句,也可以是復(fù)合語句。同while語句中的statement一樣,也稱為“循環(huán)體”。,注意,2do while語句的語法(2),循環(huán)體中必須含有能改變循環(huán)控制變量取值的運(yùn)算,否則會(huì)導(dǎo)致“死循環(huán)”。,例2-28中,通過cin finish(輸入finish),來改變finish!=y的值。,通常把參與循環(huán)條件表達(dá)式運(yùn)算的關(guān)鍵數(shù)據(jù)對(duì)象(變量)稱為循環(huán)變量或循環(huán)控制變量。, char op,finish; do cout finish; while(finish! = y);,3do while語句的語義,重復(fù)執(zhí)行循環(huán)體直至循環(huán)條件表達(dá)式(exp)的值為假。故稱為“直到型”循環(huán)。,語義,執(zhí)行步驟,(1)執(zhí)行statement,也即執(zhí)行循環(huán)體;,(2) 計(jì)算exp;,(3)如果exp的值為真,則轉(zhuǎn)(1),否則轉(zhuǎn)(4);,(4)結(jié)束循環(huán)語句的執(zhí)行,轉(zhuǎn)下一語句。,do while語句和while語句在許多應(yīng)用上是一致的,但并不完全等價(jià)。例如,例2-27的問題顯然不能直接用do while語句去替換while語句,為什么?,表示do while語句語義的流程圖和N-S圖如下:,#include void main() char s30; int i; cout s; i=0; cout “所輸入的字符串長(zhǎng)度為:“ i endl; ,do i+; while (si!=0);,因?yàn)檠h(huán)體至少執(zhí)行一次,所以當(dāng)s是空串時(shí),輸出1。,我們將例2-27所給的程序作如下修改:,實(shí)例,3do while語句的語義(4),例2-29 用do while語句實(shí)現(xiàn)數(shù)據(jù)輸入控制和合法性檢查。,問題分析,在數(shù)據(jù)處理程序中,通常需要通過鍵盤輸入數(shù) 據(jù),對(duì)一些數(shù)據(jù)進(jìn)行合法性判定是十分重要的。,例如對(duì)于性別這一數(shù)據(jù),如果用單個(gè)字母來表示,則要求輸入的字符必須是M或F。,下面的程序用一個(gè)do while來控制性別數(shù)據(jù)的輸入和校驗(yàn),其工作原理是:輸入后即進(jìn)行校驗(yàn),如不符合要求,再行輸入、校驗(yàn),直到符合要求為止。,#include void main() char sex; do cout sex; if (sex !=F ,程序,2.12 for語句,1 for語句應(yīng)用實(shí)例,前面討論的while語句和do while語句一般用于處理循環(huán)次數(shù)未知的循環(huán)問題,但實(shí)際上有很多的重復(fù)處理,其重復(fù)次數(shù)是事先可以確定的。請(qǐng)看下面的例子。,例2-30 計(jì)算s=1+2+3+100,前面已提到,這是一個(gè)重復(fù)99次加法運(yùn)算的問題。也即賦值表達(dá)式s=s+i須重復(fù)執(zhí)行99次。,問題分析,#include void main() int sum,i; sum=0; for (i=1,i=100;i+) sum = sum+i; cout “sum=:n“ sum emdl; ,程序,可以看出,對(duì)于重復(fù)次數(shù)已知的問題改用for語句來描述,將更為簡(jiǎn)潔、緊湊和嚴(yán)謹(jǐn)。,2for語句的語法,for (exp1;exp2;exp3) statement;,語法,語法解釋,(1)exp1:表達(dá)式1,用來設(shè)置循環(huán)控制變量初值,一般是賦值表達(dá)式或可以賦初值的說明語句;,(2)exp2: 表達(dá)式2、其計(jì)算結(jié)果可以作為循環(huán)條件,一般是關(guān)系表達(dá)式或邏輯表達(dá)式;,(3)exp3:表達(dá)式3、用來修改循環(huán)控制變量的值。一般是算術(shù)表達(dá)式或增、減量表達(dá)式(i+、i-);,(4)statement:可以是簡(jiǎn)單語句,也可以是復(fù)合語句,是for語句的“循環(huán)體”。,注意,(1)for語句將與循環(huán)控制有關(guān)的運(yùn)算(exp1,exp2,exp3)均放在循環(huán)頂部,統(tǒng)一表示,顯得更為直觀、更為一體化,可以確保不會(huì)因?yàn)槌绦蛑惺韬瞿承┭h(huán)控制而出現(xiàn)潛在錯(cuò)誤。,2for語句的語法(2),(2)exp1,exp2,exp3三個(gè)表達(dá)式之間必須用分號(hào)分隔。即使在某個(gè)表達(dá)式省略的情況下,分號(hào)也不能少。,for (exp1;exp2;exp3) statement;,(3)三個(gè)表達(dá)式都是任選項(xiàng),也即都可以省略。,2for語句的語法(3),for (exp1;exp2;exp3) statement;,省略exp1:表示無須設(shè)置循環(huán)控制變量初值,這種情 況下,應(yīng)在循環(huán)語句之前進(jìn)行初值設(shè)置。,例如,例2-30的for語句部分可以改為: i=2; sum=1; for (; i=100; i+) sum=sum+i;,省略exp2:意味著循環(huán)將可能無條件地進(jìn)行下去,因 此,必須在循環(huán)體內(nèi)設(shè)置能夠終止循環(huán)的語句,否則會(huì)導(dǎo)致死循環(huán)。,例如: for (i=2; ;i+) sum=sum+i; ;,2for語句的語法(4),for (exp1;exp2;exp3) statement;,2for語句的語法(5),for (exp1;exp2;exp3) statement;,省略exp3:如果在循環(huán)體中存在著修改循環(huán)控制變量 的操作,那么exp3就可以省略,否則同樣會(huì)導(dǎo)致“死循環(huán)”。,例如: for (i=2;i=100 ;) sum+=i+; ;,(4)for語句不但適用于循環(huán)次數(shù)已知的循環(huán)問題,同樣也適用于循環(huán)次數(shù)不確定的問題。它比while和do while語句更為靈活。,exp1、exp2、exp3均省略,則for語句變?yōu)椋?for (; ;),上面的結(jié)構(gòu)應(yīng)該說語法上是正確的,但語義上就有可能變成無限循環(huán)(如果循環(huán)體內(nèi)沒有相應(yīng)的終止循環(huán)的語句,勢(shì)必構(gòu)成死循環(huán))。,2for語句的語法(6),for (exp1;exp2;exp3) statement;,3for語句的語義,執(zhí)行過程,(1)計(jì)算exp1,通常用來設(shè)置循環(huán)變量的初值;,(2)計(jì)算exp2,如果其值為真則轉(zhuǎn)(3),否則轉(zhuǎn)(5);,(3)執(zhí)行statement,也即執(zhí)行循環(huán)體;,(4)計(jì)算exp3,轉(zhuǎn)(2);,(5)結(jié)束for語句的執(zhí)行。,3for語句的語義(2),(1)exp1雖然包含在for語句中,但僅執(zhí)行一次,而exp2、exp3卻必須循環(huán)執(zhí)行n次。,注意,(2)for語句與while是等價(jià)的(同構(gòu)的),3for語句的語義(3),for (exp1;exp2;exp3) statement;,exp1; while(exp2) statement; exp3; ,相比之下,似乎while結(jié)構(gòu)更易于理解,但for結(jié)構(gòu)則顯得更為簡(jiǎn)潔、更為嚴(yán)謹(jǐn)。,例2-31找出n1到n2之間不能被3整除的數(shù)并輸出之。設(shè)n1和n2都是整數(shù),并且n2=n1。,4for語句的簡(jiǎn)單應(yīng)用,問題分析,(1)假定n1=100,n2=200,則這一問題就是找出100到200這101個(gè)連續(xù)整數(shù)中不能被3整除的數(shù)。因?yàn)檠h(huán)次數(shù)已知,所以我們可以用for語句來處理這一問題。,(2)可以用for語句的exp1和exp3兩個(gè)表達(dá)式來生成n1到n2之間的n2-n1+1個(gè)連續(xù)整數(shù)。,exp1:i=n1; exp3:i+,程序,#include void main() int n1,n2,i,j=0; cout n1 n2; cout 10) cout endl; j=0; else cout “ “ i; / 外層的if結(jié)束 / for結(jié)束 cout endl “-n“; ,問題,(1)if (j10) 語句起什么作用?,(2)如何在每一輸出行下面增加一條表格橫線?,(3)如果 n2n1,程序應(yīng)如何處理?,4for語句的簡(jiǎn)單應(yīng)用(3),#include void main() int n1,n2,i,j=0; cout n1 n2; cout 10) cout endl; j=1; cout “ “ i; / 外層的if結(jié)束 / for結(jié)束 cout endl “-n“; ,2.13 多重循環(huán),1多重循環(huán)的概念,所謂多重循環(huán)是指某一循環(huán)語句的循環(huán)體內(nèi)包含其它的循環(huán)語句,這些內(nèi)嵌的循環(huán)語句的循環(huán)體內(nèi)又可以包含循環(huán)語句,依此類推,形成循環(huán)語句的嵌套結(jié)構(gòu),也稱為多重循環(huán)。,while、do while、for可以互相嵌套,例如while的循環(huán)體內(nèi)嵌套while、do while、for語句。,例如:for (;)for(;)while();.,2循環(huán)語句的幾種嵌套形式,程序中經(jīng)常出現(xiàn)的是直接多重嵌套和并列多重嵌套兩種形式。,直接多重嵌套,循環(huán)語句的循環(huán)體內(nèi)包含另一循環(huán)語句,內(nèi)嵌的循環(huán)語句的循環(huán)體內(nèi)又可以包含循環(huán)語句,依次類推,直至n重嵌套。如圖所示:,第1層,第2層,第n層,for ( ) for ( ) while ( ) ,循環(huán)語句的循環(huán)體內(nèi)包含另一循環(huán)語句,內(nèi)嵌的循環(huán)語句的循環(huán)體內(nèi)又可以包含循環(huán)語句,依次類推,直至n重嵌套。如圖所示:,直接多重嵌套,外層,內(nèi)層1,內(nèi)層2,內(nèi)層n,while ( ) while () for ( ) ,并列多重嵌套,循環(huán)語句的循環(huán)體內(nèi)包含一些循環(huán)語句(=2),內(nèi)嵌的循環(huán)語句的循環(huán)體內(nèi)又可以包含循環(huán)語句。依次類推,直至n重嵌套,如下圖所示:,循環(huán)體的執(zhí)行次數(shù),外循環(huán)的循環(huán)體執(zhí)行一次,被嵌套的循環(huán)語句執(zhí)行一遍(完成整個(gè)循環(huán)語句的執(zhí)行)。,例如: #include void main() int c1=0,c2=0; for (int i=0;i10;i+) c1+; for (int j=0;j10;j+) c2+; cout “c1=“c1“c2=“ c2endl; ,問題: (1)c1+;執(zhí)行幾次? (2)c2+;執(zhí)行幾次?,答案: c1+;執(zhí)行10次? c2+;執(zhí)行100次?,理由:?,3多重循環(huán)應(yīng)用實(shí)例,下面我們給出幾個(gè)多重循環(huán)的應(yīng)用實(shí)例,主要目的是為了加深對(duì)多重循環(huán)結(jié)構(gòu)的理解。,例2-32-1 判斷一個(gè)數(shù)是否為素?cái)?shù)。,問題分析,(1)只能被1和自身整除的數(shù)是素?cái)?shù),對(duì)于程序?qū)崿F(xiàn)而言,判斷條件可改為:如果整數(shù)m不能被2,3,4,m-1整除,則m是素?cái)?shù)。,可以看出這是重復(fù)判斷問題,也即對(duì)任何一個(gè)整數(shù)m,應(yīng)滿足m%i不為0(i=2m-1),才是素?cái)?shù)。,(2)我們對(duì)上述算法稍作如下改進(jìn),可以減少運(yùn)算量:,假定m不是素?cái)?shù),則可以表示為:m=i*j,i=sqrt(m)。也即i=2sqrt(m)。,3多重循環(huán)應(yīng)用實(shí)例(2),例2-32-1 判斷一個(gè)數(shù)是否為素?cái)?shù)。,(3)判斷過程可以用一個(gè)循環(huán)語句實(shí)現(xiàn).,for (i=2;i=sqrt(m);i+) m是否能被i整除?,程序,3多重循環(huán)應(yīng)用實(shí)例(3),例2-32-1 判斷一個(gè)數(shù)是否為素?cái)?shù)。,#include #include /*判斷一個(gè)數(shù)是否為素?cái)?shù)*/ void main() int i,m,sqrtm; cout m; sqrtm=sqrt(m); for (i=2;isqrtm) cout m“是素?cái)?shù)“endl; ,3多重循環(huán)應(yīng)用實(shí)例(4),例2-32-2 找出1到100之間的100個(gè)連續(xù)整數(shù)中的所有素?cái)?shù)。,問題分析,(1)解決這個(gè)問題,只須在2-32-1的基礎(chǔ)上,增加一個(gè)循環(huán)語句,控制生成100個(gè)連續(xù)整數(shù),并對(duì)所生成的整數(shù)調(diào)用判斷素?cái)?shù)的操作即可。,for (m=1;m=100;m+) 判斷m是否為素?cái)?shù);,3多重循環(huán)應(yīng)用實(shí)例(5),例2-32-1 找出1到100之間的100個(gè)連續(xù)整數(shù)中的所有素?cái)?shù)。,(2)素?cái)?shù)一定是奇數(shù),而n1到n2之間只有:(n2-n1+1)/2個(gè)奇數(shù)。這意味著從1到100的循環(huán),其步長(zhǎng)是2,而不是1。,因此可以用如下的循環(huán)語句來生成1100之間的連續(xù)整數(shù)中的所有奇數(shù):,m的取值為:1,3,5,7,9,,99。,for (m=1;m=100;m+=2);,#include #include #include /*/ /*找出1到100之間的100個(gè)連續(xù)整數(shù)中的所有素?cái)?shù) */ /*/ void main() int i,m,sqrtm; int l=0;,程序,3多重循環(huán)應(yīng)用實(shí)例(4),例2-32-2 找出1到100之間的100個(gè)連續(xù)整數(shù)中的所有素?cái)?shù)。,for (m=1;msqrtm) if (l+%10=0) cout endl; cout setw(5) m; ,/該數(shù)為素?cái)?shù),/m能被i整除,該程序包含一個(gè)二重循環(huán)結(jié)構(gòu),外循環(huán)用來生成1,3,5,99總共50個(gè)奇數(shù),內(nèi)循環(huán)用來確定某一奇數(shù)是否為素?cái)?shù)。,i*i*i+j*j*j+k*k*k=100*i+10*j+k,3多重循環(huán)應(yīng)用實(shí)例(5),例2-33 找出所有的三位數(shù),其值等于三個(gè)數(shù)字的立方和。例如,153是一個(gè)三位整數(shù),該數(shù)滿足:153=13+53+33。,問題分析,(1)設(shè)所求的三位數(shù),其百位數(shù)是i,十位數(shù)是j,個(gè)位數(shù)是k,顯然我們所要查找的數(shù)應(yīng)滿足:,i: 19;j: 09;k:09。,3多重循環(huán)應(yīng)用實(shí)例(5),例2-33 找出所有的三位數(shù),其值等于三個(gè)數(shù)字的立方和。例如,153是一個(gè)三位整數(shù),該數(shù)滿足:153=13+53+33。,(2)該程序應(yīng)該包含一個(gè)三重循環(huán),用來生成9*10*10=900個(gè)三位數(shù),并找出其中符合條件的數(shù)。,for (i=1;i=9;i+) for (j=0;j=9;j+) for (k=0;k=9;k+),問題:為什么i不從0開始?,#include void main() int i,j,k; for (i=1;i=9;i+) for (j=0;j=9;j+) for (k=0;k=9;k+) if (i*i*i+j*j*j+k*k*k=100*i+10*j+k) cout 100*i+10*j+k “ “; ,程序,輸出:153 370 371 407,3多重循環(huán)應(yīng)用實(shí)例(6),例2-34 編制一個(gè)程序輸出一個(gè)由M組成的直角三角形。(p40),輸出字符圖形,M MM MMM MMMM MMMMM MMMMMM MMMMMMM MMMMMMMM MMMMMMMMM MMMMMMMMMM,問題分析,(1)該圖形共十行,首行1個(gè)字母,第二行2個(gè)字母,第三行3個(gè)字母,依次類推。,(2)可以用二重循環(huán)來控制圖形生成,外循環(huán)控制輸出十行,內(nèi)循環(huán)控制一行輸出幾個(gè)字母。,3多重循環(huán)應(yīng)用實(shí)例(7),例2-34 編制一個(gè)程序輸出一個(gè)由M組成的直角三角形。,程序,#include void main() for (int i=1;i=10;i+) for (int j=1;j=i;j+) cout “M”; cout endl; ,問題,(1)應(yīng)如何改進(jìn)程序才能使之不局限于只輸出由M 組成的圖形?,(2)應(yīng)如何改進(jìn)程序才能改變輸出的圖形的行數(shù)?,程序的改進(jìn),(1)將輸出字符常量改為輸出字符變量。解決問題1。,(2)將循環(huán)條件由i=10改為i=n,n通過鍵盤輸入。解決問題2,#include void main() int n;char c; coutn; coutc; for (int i=1;i=n;i+) for (int j=1;j=i;j+) cout c; cout endl; ,3多重循環(huán)應(yīng)用實(shí)例(8),例2-35 編制一個(gè)程序輸出一個(gè)由字符組成的等腰三角形。,輸出字符圖形,MMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMM MMMMMMMMMMMMM MMMMMMMMMMM MMMMMMMMM MMMMMMM MMMMM MMM M,問題分析,(1)可以用二重循環(huán)來控制圖形生成,外循環(huán)控制輸出n行,內(nèi)循環(huán)1控制一行內(nèi)開頭輸出幾個(gè)空格,內(nèi)循環(huán)2控制在一行內(nèi)輸出幾個(gè)字母。,其循環(huán)結(jié)構(gòu)為: for (i=1;i=n;i+ 輸出若干空格;(內(nèi)循環(huán)1) 輸出若干字符;(內(nèi)循環(huán)2) 換行; ,(2)顯然:輸出若干空格和輸出若干字符都要用循環(huán)語句實(shí)現(xiàn),并且這兩個(gè)循環(huán)語句是并列的。,程序,#include void main() int n;char c; coutn; coutc; for (int i=1;i=n;i+) for (int j=1;j=i-1;j+) cout “ ”; /輸出空格 for (int k=1;k=2*n+1-2*i;k+) cout c; /輸出符號(hào) cout endl; ,(3)行首空格數(shù)與i的關(guān)系: 第i行的空格數(shù)為i-1個(gè)。,問題分析,(4)行內(nèi)非空字符數(shù)與i的關(guān)系:第i行的字符數(shù)為2*n+1-2*i, (n是總行數(shù)) 假如n=10,則第i行的字符數(shù)為: 21-2*i,2.14 I/O操作語句(I/O Statement),概念1I/O流,概念2I/O操作符,本節(jié)簡(jiǎn)單介紹I/O流的基本概念和基本功能,并討論利用I/O流實(shí)現(xiàn)輸入/輸出操作。,之前,我們經(jīng)常在程序中用到如下的I/O操作:,通過輸入操作符“”從cin流中抽取字符并進(jìn)行轉(zhuǎn)換與傳送 輸入操作;,通過輸出操作符“”將輸出量轉(zhuǎn)換成字符串并插入到cout流中 輸出操作。,上述操作涉及到兩個(gè)概念:,1標(biāo)準(zhǔn)I/O流(Standard I/O Stream),標(biāo)準(zhǔn)I/O流是標(biāo)準(zhǔn)字符設(shè)備上的一系列字符組成的字符串。,標(biāo)準(zhǔn)字符設(shè)備分為標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)和標(biāo)準(zhǔn)輸出設(shè)備(顯示器和打印機(jī))兩大類。,cin: 標(biāo)準(zhǔn)輸入設(shè)備(標(biāo)準(zhǔn)輸入流) ,即鍵盤;,cout:標(biāo)準(zhǔn)輸出設(shè)備(標(biāo)準(zhǔn)輸出流),即顯示器;,clog:標(biāo)準(zhǔn)輸出設(shè)備(標(biāo)準(zhǔn)輸出流),即打印機(jī)。,C+的標(biāo)準(zhǔn)I/O流類(iostream.h)定義了cin、cout、clog三個(gè)名稱來表示上述設(shè)備。,2I/O操作符,標(biāo)準(zhǔn)I/O流類提供多個(gè)I/O操作符和I/O操作函數(shù),其中最常用的I/O操作符有和。它們與cin、cout及輸入/輸出項(xiàng)構(gòu)成I/O表達(dá)式(或語句),實(shí)現(xiàn)輸入/輸出操作。,:輸入操作符,用來從cin流中抽取字符,所以也稱為抽取運(yùn)算符。,:輸出操作符,向cout或clog流中插入字符(串),所以也稱為插入運(yùn)算符。,例如:cin m;,例如:cout “i/o操作”;,3輸入表達(dá)式(語句),舉例,例2-36 從鍵盤上輸入三個(gè)數(shù)分別保存在i,j,k中。, int i; float j; long k; cin ijk; ,設(shè)輸入序列為:123 456.7 123456789123,則: i j k,輸入表達(dá)式的語法,3輸入表達(dá)式(語句)(續(xù)), . ,解釋,標(biāo)準(zhǔn)輸入流: cin ;,:輸入操作符,其操作對(duì)象必須是變量。, int i,j,k; cin ijk; ,一個(gè)“”后隨一個(gè)輸入量,輸入量只能是變量。,4輸出表達(dá)式(語句),舉例,例2-37 計(jì)算i+j+k,并在屏幕上顯示計(jì)算結(jié)果。, int i,j,k; cin ijk; cout “i+j+k=“i+j+kendl ; ,設(shè)輸入序列為:10 10 10 則屏幕上輸出:i+j+k=30,輸出表達(dá)式的語法, .,解釋,4輸出表達(dá)式(語句)(續(xù)),標(biāo)準(zhǔn)輸出流:cout或clog :, int i,j,k; cin i,j,k; cout “i+j+k=“i+j+kendl ; ,:輸出操作符;,輸出量:,常量,變量,表達(dá)式,函數(shù)調(diào)用,解釋,4輸出表達(dá)式(語句)(續(xù)), int i,j,k; cin i,j,k; cout “i+j+k=“i+j+kendl ; ,流狀態(tài),也稱為控制符,用來設(shè)定格式,將在下一小節(jié)介紹。,注意:同一輸出流中可以含有n個(gè)輸出量,并且這n個(gè)輸出量的數(shù)據(jù)類型可以相同也可以不同,最后都被轉(zhuǎn)換成字符串,插入到輸出流中。,#include void main() main() int a,b,c,d; d=(a=1,b=a+2,c=b+3); cout “ d=(a=1,b=a+2,c=b+3)的運(yùn)算結(jié)果是:“ d endl; ;,例2-38 下面的程序用來計(jì)算指定表達(dá)式,并輸出計(jì)算結(jié)果。,4輸出表達(dá)式(語句)(續(xù)),5 流狀態(tài)(Stream States),程序1: #include void main() double average = 9.40067; cout average endl; ,對(duì)雙精度類型數(shù)據(jù)average 按默認(rèn)格式輸出,結(jié)果顯示6位有效位:,9.40067,請(qǐng)比較以下兩個(gè)程序:,作用,流狀態(tài)符也稱為格式控制符,用來設(shè)置標(biāo)準(zhǔn)輸出流的輸出格式。,對(duì)average 按fixed控制符和setprecision(2)控制符指定的格式輸出。結(jié)果顯示:,程序2: #include #include using namespace std; void main() double average = 9.40067; cout fixed setprecision(2) average endl; ,設(shè)置固定的浮點(diǎn)表示格式,設(shè)置浮點(diǎn)數(shù)的數(shù)字位數(shù),9.40,5 流狀態(tài)(Stream States)(續(xù)),常用的流狀態(tài),5 流狀態(tài)常用流狀態(tài)(續(xù)),流狀態(tài)取消符,例2-39 請(qǐng)觀察下面程序中加入各種流狀態(tài)輸出流的格式。,5 流狀態(tài)常用流狀態(tài)(續(xù)),#include #include using namespace std; void main() cout 3)3)endl; coutnoshowposfixed12345.678endl; coutscientific123456.678endl; ,+12 12 0x12 ff FF +123 +123.000 0 false 12345.678000 1.234568e+005,注意,5 流狀態(tài)常用流狀態(tài)(續(xù)),(1)流狀態(tài)符必須插入在需要改變格式的輸出量之前,不能在之后。例如:,coutscientific123456.678endl;,設(shè)置科學(xué)記數(shù)法輸出格式的流狀態(tài)符必須置于輸出量123456.678之前,否則不起作用。,例如要按大寫16進(jìn)制數(shù)輸出一個(gè)整型數(shù),同時(shí)要使用hex和uppercase)兩個(gè)控制符。 int a1 = 42; cout hex uppercase a1 endl;,輸出:2A,(2)流狀態(tài)符經(jīng)常要成對(duì)合用方能收到效果 。,5 流狀態(tài)常用流狀態(tài)(續(xù)),(3)left與right是對(duì)立的,dec、oct、hex三者也是對(duì)立的。,帶參數(shù)的流狀態(tài),5 流狀態(tài)帶參數(shù)的流狀態(tài),例2-40 cout.width(5); cout.fill(s); cout23endl; cout23,輸出: sss23 23,注意,(2)width()為一次性操作,即一次設(shè)置的作用范圍僅局限于緊隨其后的一個(gè)輸出量,下一個(gè)輸出量無效。,(1)上述三個(gè)流狀態(tài)符必須通過cout捆綁調(diào)用。,5 流狀態(tài)帶參數(shù)的流狀態(tài)(續(xù)),例如:cout.width(3)。,例2-40 cout.width(5); cout.f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《世界古代建筑欣賞:大二藝術(shù)史教學(xué)教案》
- 《太陽(yáng)系八大行星的特點(diǎn):四年級(jí)地理教學(xué)教案》
- 新員工入職流程及操作系統(tǒng)使用指南
- 產(chǎn)品分銷與代理業(yè)務(wù)合作協(xié)議內(nèi)容
- 《走進(jìn)物理世界:高一物理實(shí)驗(yàn)課程教案》
- 鄉(xiāng)村旅游農(nóng)業(yè)開發(fā)方案
- 年度市場(chǎng)活動(dòng)策劃與執(zhí)行報(bào)告
- 公司采購(gòu)協(xié)議附件書
- 采購(gòu)居間合同例文
- 工作匯報(bào)與溝通渠道使用情況表
- 2024年國(guó)網(wǎng)電網(wǎng)金屬技術(shù)監(jiān)督專業(yè)知識(shí)題庫(kù)(典型題)
- SG-CIM模型建設(shè)及實(shí)踐
- 【零售超市促銷策略研究的文獻(xiàn)綜述及理論基礎(chǔ)4500字】
- 人教版二年級(jí)下冊(cè)數(shù)學(xué)《圖形的運(yùn)動(dòng)(解決問題)》說課稿
- 2024年中華人民共和國(guó)企業(yè)所得稅年度納稅申報(bào)表(帶公式)20240301更新
- 2024年江蘇省揚(yáng)州市中考數(shù)學(xué)真題(解析版)
- 中醫(yī)養(yǎng)生保健知識(shí)講座完整版
- 托福聽力課件
- 泰康集團(tuán)線上測(cè)評(píng)真題
- 運(yùn)動(dòng)損傷的預(yù)防與處理預(yù)防和處理舞蹈運(yùn)動(dòng)損傷
- 物流無人機(jī)項(xiàng)目企業(yè)運(yùn)營(yíng)實(shí)施方案
評(píng)論
0/150
提交評(píng)論