版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向?qū)ο蟪绦蛟O(shè)計(jì)課程輔導(dǎo)(二)
--流程控制語(yǔ)句
徐孝凱
流程控制語(yǔ)句用來(lái)控制程序的執(zhí)行流程,它涉及選擇、循環(huán)和跳轉(zhuǎn)三類語(yǔ)句。
選擇類語(yǔ)句涉及if語(yǔ)句和switch語(yǔ)句兩利I用它們來(lái)解決實(shí)際應(yīng)用中按不同情
況進(jìn)行不同解決的問(wèn)題。如當(dāng)調(diào)整職工工資時(shí),應(yīng)按不同的級(jí)別增長(zhǎng)不同的工資;大學(xué)生交
納學(xué)費(fèi)時(shí),應(yīng)按不同的專業(yè)交納不同的學(xué)費(fèi)。
循環(huán)類語(yǔ)句涉及for循環(huán)語(yǔ)句、while循環(huán)語(yǔ)句和do循環(huán)語(yǔ)句三種,用它們來(lái)解決實(shí)
際應(yīng)用中需要反復(fù)解決的問(wèn)題。如當(dāng)記錄全體職工工資總和時(shí),就需要反復(fù)地做加法,依次
把每個(gè)人的工資累加起來(lái);當(dāng)從一批數(shù)據(jù)中查找具有最大值的一個(gè)數(shù)據(jù)時(shí),需要反復(fù)地做兩
個(gè)數(shù)的比較運(yùn)算,每次把上一次比較得到的大者同一個(gè)新(即未比較)的數(shù)據(jù)比較,當(dāng)同最后
一個(gè)新的數(shù)據(jù)比較后得到的大者就是所有數(shù)據(jù)中的最大值。
跳轉(zhuǎn)類語(yǔ)句涉及goto語(yǔ)句、continue語(yǔ)句、break語(yǔ)句和return語(yǔ)句四種,
用它們來(lái)改變順序向下執(zhí)行的正常順序,而轉(zhuǎn)向隱含或顯式給出的語(yǔ)句位置,接著從此位置
起向下執(zhí)行。如當(dāng)從一批數(shù)據(jù)中查找一個(gè)與給定值相等的數(shù)據(jù)時(shí),最簡(jiǎn)樸的方法是從前向后
使每一個(gè)數(shù)據(jù)依次同給定值進(jìn)行比較,若不等則繼續(xù)向下比較,若相等則表白查找成功,應(yīng)終
止比較過(guò)程,此時(shí)就需要使用跳轉(zhuǎn)語(yǔ)句轉(zhuǎn)移到其他地方執(zhí)行。
這一章將依次介紹每一種流程控制語(yǔ)句的語(yǔ)法格式、執(zhí)行過(guò)程和應(yīng)用舉例等內(nèi)容。
一、if語(yǔ)句
1.語(yǔ)句格式
if語(yǔ)句又稱條件語(yǔ)句,其語(yǔ)句格式為:
if(〈表達(dá)式〉)〈語(yǔ)句1>[else(語(yǔ)句2>]
if語(yǔ)句是一種結(jié)構(gòu)性語(yǔ)句,由于它又包具有語(yǔ)句,即〈語(yǔ)句1>和可選擇的〈語(yǔ)句2
>,這兩條語(yǔ)句稱為if語(yǔ)句的子句。
在if語(yǔ)句格式中,其后的保存字else和〈語(yǔ)句2》是任選項(xiàng),帶與不帶都是允許的。
if語(yǔ)句中的每個(gè)子句可以是任何可執(zhí)行語(yǔ)句或空語(yǔ)句,可執(zhí)行語(yǔ)句涉及表達(dá)式語(yǔ)句、復(fù)
合語(yǔ)句、以及任一種流程控制語(yǔ)句等。
2.語(yǔ)句執(zhí)行過(guò)程
if語(yǔ)句的執(zhí)行過(guò)程為:
(1)求〈表達(dá)式)的值,若它的值非0,則表白〈表達(dá)式〉(又稱為條件)為真或成立,
否則認(rèn)為條件為假或不成立;
(2)當(dāng)條件為真則執(zhí)行〈語(yǔ)句1>,為假則執(zhí)行〈語(yǔ)句2>,但若else部分被省略,
則不會(huì)執(zhí)行任何操作。
執(zhí)行if語(yǔ)句的過(guò)程可用圖1—1描述,其中菱形框表達(dá)判斷,矩形框表達(dá)解決,帶箭頭
的連線表達(dá)執(zhí)行走向。圖1-1(a)和(b)分別表達(dá)省略和帶有else部分的具體執(zhí)行流程。
圖1-1if語(yǔ)句執(zhí)行流程示意圖
3.語(yǔ)句格式舉例
(1)if(x!=T)c++;
(2)if(x<=a)s1+=x;elses2+=x;
(3)if(fabs(x)<=1)y=l+exp(x);
e1sey=l+2*x;
(4)if(grade>=60&&grade<=100)cout?J,pass,,?end1;
(5)if(grade<0IIgrade>100)cout?,,Scoreerror!5,<<end1;
(6)if(p&&a>b)cout?,,a>b,,?end1;
elsecout<<va<=b,)?endl;
(7)if(x*x+y*y==z*z){c++;w=x+y+z;}
(8)if(x){y=3*xT;z=sqrt(fabs(x))+2;}else{y=6;z=y*po
w(y,4)—3;)
在以上列舉的語(yǔ)句中,作為判斷條件的表達(dá)式有的為單個(gè)變量,有的為關(guān)系表達(dá)式,有
的為邏輯表達(dá)式,作為子句的語(yǔ)句1或語(yǔ)句2有的為簡(jiǎn)樸語(yǔ)句,有的為復(fù)合語(yǔ)句。每條語(yǔ)句
的執(zhí)行過(guò)程一目了然,如執(zhí)行第一條語(yǔ)句時(shí),若x不等于-1成立,則執(zhí)行C++操作,否則不
執(zhí)行任何操作;執(zhí)行第二條語(yǔ)句時(shí),若x小于等于a成立,則執(zhí)行sl+=x操作,否則執(zhí)行s2+
=X操作;執(zhí)行第八條語(yǔ)句時(shí),若x不為0,則執(zhí)行格式中(語(yǔ)句1>所相應(yīng)的復(fù)合語(yǔ)句,否則
執(zhí)行〈語(yǔ)句2〉所相應(yīng)的復(fù)合語(yǔ)句。
4.語(yǔ)句嵌套
if語(yǔ)句中的任何一個(gè)子句可認(rèn)為任何可執(zhí)行語(yǔ)句,當(dāng)然仍可以是一條if語(yǔ)句,此種情
況稱為if語(yǔ)句的嵌套。當(dāng)出現(xiàn)if語(yǔ)句嵌套時(shí),不管書(shū)寫(xiě)格式如何,else都將與它前面最
靠近的if相配對(duì),構(gòu)成一條完整的if語(yǔ)句。如:
(1)if(〈表達(dá)式1》)if(〈表達(dá)式2〉)<語(yǔ)句1>eIse〈語(yǔ)句2>
(2)1儀<表達(dá)式1>){if(〈表達(dá)式2〉)<語(yǔ)句1><語(yǔ)句2>}else(語(yǔ)句3>
(3)if((表達(dá)式1>)〈語(yǔ)句1>
elseif(〈表達(dá)式2〉)〈語(yǔ)句2>
else<語(yǔ)句3>
(4)if《表達(dá)式1>)〈語(yǔ)句1>
e1se1£(<表達(dá)式2>)〈語(yǔ)句2>
elseif(〈表達(dá)式3〉)(語(yǔ)句3>
eIse〈語(yǔ)句4>
注意:在第二條語(yǔ)句中,e1se不是同它前面復(fù)合語(yǔ)句中的if相配對(duì),而是與處在同
一層次的最前面的if相配對(duì)。
5.程序舉例
(1)#include<iostream.h>
voidmain()
(
intx,y;
cout<<”從鍵盤(pán)輸入一個(gè)整數(shù):";
。cin>>x;
if(x<0)y=l+2*x*x;
elsey=7*x-4;
cout?z,x=/z?x?","〈<"y="?y<<endl;
)
該程序的功能是:根據(jù)從鍵盤(pán)上輸入的x的值計(jì)算并輸出y的值,y的計(jì)算公式為:
-l+2x2(x<0)
Y
y=I
7x-4(x20)
(2)#include<iomanip.h>
#include<math.h>
voidmain()
doublex,y;
cin>>x;
if(x<0)y=fabs(x);
elseif(x<10)y=exp(x)*sin(x);
e1seif(x<20)y=pow(x,3);
elsey=(3+2*x)*log(x);
cout<<setw(10)?x?setw(10)?y<<end1;
〃分別使x和y的輸出寬度為10,即占有10個(gè)字符位置
)
該程序的功能是:根據(jù)x的值計(jì)算出分段函數(shù)y的值,y的計(jì)算公式為:
「|x|(X<0)
y=|e1sinx(0<x<10)
x3(10Wx(20)
(3+2x)Inx(x220)
#include<iostream.h>
voidmain()
(
inta,b,c,temp;
cout?"輸入三個(gè)整數(shù):〃;
cin?a>>b>>c;
if(a<b){temp=a;a=b;b=temp;}
if(a<c){temp=a;a=c;c=temp;}
if(b<c){temp=b;b=c;c=temp;}
cout?a'<<b<〈''<<c<<endl;
該程序的功能是把從鍵盤(pán)上輸入的按任意順序排列的三個(gè)整數(shù)轉(zhuǎn)變?yōu)榘磸拇蟮叫〉捻?/p>
序排列(即a2b'c)并輸出出來(lái)。
注意:對(duì)于每條if語(yǔ)句中的復(fù)合語(yǔ)句,其作用是互換兩個(gè)變量的值,它一方面把第一
個(gè)變量的值暫存到temp變量中,接著把第二個(gè)變量的值賦給第一個(gè)變量,最后把temp變量
的值,即第一個(gè)變量的原值賦給第二個(gè)變量中。若不通過(guò)中間變量temp,而是直接把第一個(gè)
變量的值賦給第二個(gè)變量,再把第二個(gè)變量的值賦給第一個(gè)變量,則不可以達(dá)成互換兩個(gè)變
量值的目的,請(qǐng)讀者思考!
二、switch語(yǔ)句
1.語(yǔ)句格式
switch語(yǔ)句又稱情況語(yǔ)句或開(kāi)關(guān)語(yǔ)句,它也是一種結(jié)構(gòu)性語(yǔ)句,其語(yǔ)句格式為:
switch(〈表達(dá)式〉)<語(yǔ)句〉
該語(yǔ)句中所包含的〈語(yǔ)句>通常是一條復(fù)合語(yǔ)句,并在內(nèi)部的一些語(yǔ)句前加有特殊的語(yǔ)
句標(biāo)號(hào)“case〈常量表達(dá)式>或“defau1t:”,因此,switch語(yǔ)句的實(shí)際使用格式為:
switch(〈表達(dá)式〉){
case〈常量表達(dá)式1>:〈語(yǔ)句1-1>
〈語(yǔ)句1-2>
case〈常量表達(dá)式2>:<語(yǔ)句2T>
〈語(yǔ)句2-2>
[defau1t:〈語(yǔ)句n-1>
〈語(yǔ)句n-2>
]
)
該語(yǔ)句中可以使用一次或多次case標(biāo)號(hào),但只能使用一次default標(biāo)號(hào),或者省略
掉整個(gè)default部分。止匕外,多個(gè)case標(biāo)號(hào)也允許使用在同一條語(yǔ)句的前面。
注意:語(yǔ)句標(biāo)號(hào)只起到標(biāo)記語(yǔ)句位置的作用,對(duì)語(yǔ)句的執(zhí)行不會(huì)產(chǎn)生任何影響。
2.語(yǔ)句執(zhí)行過(guò)程
switch語(yǔ)句的執(zhí)行過(guò)程為:
(1)計(jì)算出〈表達(dá)式》的值,假定為此若它不是整型,系統(tǒng)將自動(dòng)舍去其小數(shù)部分,只
取其整數(shù)部分作為結(jié)果值;
(2)依次計(jì)算出每個(gè)常量表達(dá)式的值,假定它們的值依次為Ml,M2,…,同樣若它們的
值不是整型,則自動(dòng)轉(zhuǎn)換為整型;
(3)讓M依次同Ml,M2,…進(jìn)行比較,一旦碰到M與某個(gè)值相等,則就從相應(yīng)標(biāo)
號(hào)的語(yǔ)句開(kāi)始向下執(zhí)行,若碰不到跳轉(zhuǎn)語(yǔ)句的話,將一直執(zhí)行到右花括號(hào)為止才結(jié)束整個(gè)
switch語(yǔ)句的執(zhí)行,若M與所有值都不同,則當(dāng)帶有default部分時(shí),就從該標(biāo)號(hào)位置
起向下執(zhí)行,否則不執(zhí)行任何操作。
在實(shí)際使用switch語(yǔ)句時(shí),通常規(guī)定當(dāng)執(zhí)行完某個(gè)語(yǔ)句標(biāo)號(hào)后的一組語(yǔ)句后,就結(jié)束
整個(gè)語(yǔ)句的執(zhí)行,而不讓它繼續(xù)執(zhí)行下一個(gè)語(yǔ)句標(biāo)號(hào)后面的語(yǔ)句序列,為此,可通過(guò)使用bre
ak語(yǔ)句來(lái)實(shí)現(xiàn)。該語(yǔ)句只有保存字break,而沒(méi)有其他任何成分。它是一條跳轉(zhuǎn)語(yǔ)句,在
switch語(yǔ)句中執(zhí)行到它時(shí),將跳轉(zhuǎn)到所屬的switch語(yǔ)句的后面位置,系統(tǒng)將接著向下執(zhí)行
其他語(yǔ)句。
3.語(yǔ)句格式舉例
(1)switch(a){
case1:c1++;break;
case2:c2++;break;
case3:c3++;break;
case4:c4++;break;
default2:c++;break;
)
(2)switch(cr){
casered:cout<<uredv?end1;break;
caseyellow:cout?<4yellow,,<<endl;break;
caseblue:cout<<ublue,,?endl;break;
)
(3)switch(ch){
case'a':
case'A':dl=(x+y)/2;
d2=x*y—2;
break;
case'b':
case'B':dl=(a+b)/2;
d2=a*b-2;
break;
defauIt:cout?4€Inputerror!”VVendl;
exit(1);
}
第一條語(yǔ)句執(zhí)行時(shí),將按照a的取值使相應(yīng)的變量增1,具體地說(shuō),當(dāng)a取1時(shí)cl增1,
a取2時(shí)c2增1,a取3時(shí)c3增1,取4時(shí)c4增1,a取其他任何值時(shí)則使變量c增1,每
執(zhí)行增1操作后,都接著執(zhí)行一條break語(yǔ)句,使執(zhí)行流程轉(zhuǎn)出整個(gè)switch語(yǔ)句,否則
將會(huì)順序執(zhí)行后面的增1語(yǔ)句。
執(zhí)行第二條語(yǔ)句時(shí),將按照具有枚舉類型color的變量cr的值決定輸出哪一個(gè)常量
標(biāo)記符,當(dāng)ch取值為red(即0)時(shí)輸出red標(biāo)記符,取值為yellow(即1)時(shí)輸出yellow
標(biāo)記符,取值為blue(即2)時(shí)輸出blue標(biāo)記符。輸出最后一個(gè)常量標(biāo)記符雖然沒(méi)有使
用break語(yǔ)句轉(zhuǎn)出去,但由于它后面就是語(yǔ)句結(jié)束標(biāo)志,右花括號(hào),所以也會(huì)自然地結(jié)束該
語(yǔ)句。
當(dāng)執(zhí)行第三條語(yǔ)句時(shí),若ch值為小寫(xiě)字母a或大寫(xiě)字母A,則執(zhí)行3?5行的語(yǔ)句,若
ch值為小寫(xiě)字母b或大寫(xiě)字母B,則執(zhí)行7?9行的語(yǔ)句,若ch不是上述取值,則執(zhí)行10
行后結(jié)束整個(gè)程序的運(yùn)營(yíng)。
在switch語(yǔ)句所含的復(fù)合語(yǔ)句中,可以包含任何語(yǔ)句,當(dāng)然仍可以是switch語(yǔ)
句,所以switch語(yǔ)句也允許出現(xiàn)嵌套的情況。
4.程序舉例
(1)ttinclude<iostream.h>
voidmain()
!
。intweekday;
cout?H今天星期幾(0—6)?〃;
。cin>>weekday;
switch(weekday){
。case0:cout<<"sunday〃<〈endl;break;
case1:coonday〃<Xend1;break;
。case2:cout<<z,Tuesdayz,<<end1;break;
。case3:cout<<z/Wednesday*'?endl;break;
case4:cout<V〃Thursdayv<<endl;break;
。case5:cout?/zFriday"<<end1;break;
case6:cout<〈"Saturday,VVendl;break;
default:cout?"Inputerror!"<<endl;
)
)
該程序的功能是:根據(jù)從鍵盤(pán)上輸入的表達(dá)星期兒的數(shù)字,相應(yīng)輸出它的英文名稱。
(2)#inc1ude<iostream.h>
#inc1ude<stdlib.h>
voidmain()
(
efloatscore;
cout<<〃輸入一個(gè)人的成績(jī):〃;
。cin>>score;
。if(score<0||score>l00){
。cout〈V”輸入數(shù)據(jù)有誤!〃<Xend1;
。exit(1);
0)
switch(int(score)/10){
。case9:
。case10:cout?score<<":優(yōu)〃<<end1;break;
case8:cout<<score<<〃:良“<<endl;break;
case7:cout<<score<<°:中“<Vend1;break;
。case6:cout?score<<n:及格“<Vendl;break;
。default:cout?scoreV<〃:不及格"<Vend1;break;
}
}
該程序的功能是:根據(jù)從鍵盤(pán)上輸入的一個(gè)人的成績(jī)判斷并輸出它所屬的等級(jí)。等級(jí)分
為優(yōu)、良、中、及格和不及格等五個(gè)級(jí)別,相應(yīng)的分?jǐn)?shù)段依次為[90,100],[80,89],[70,
79],[60,69]和[0,59]o
(3)#inc1ude<iostream,h>
#inc1ude<stdlib.h>
#include<time.h>
voidmain()
(
charmark;
intx,y,z;
boo1b=false;
srand(time(0));〃初始化系統(tǒng)中的隨機(jī)數(shù)序列
x=rand()%50+1;
y=rand()%10+1;
cout<<〃輸入一個(gè)算術(shù)運(yùn)算符(+,/,%):〃;
cin>>mark;
cout<<x?mark<<y?,;
cin?z;
switch(mark){
case'+':if(z==x+y)b=true;break;
case'-':if(z==x—y)b=true;break;
case':if(z二二x*y)b=true;break;
case'/':if(z==x/y)b=true;break;
case'%:if(z二二x%y)b=true;break;
defauIt:coutVV〃運(yùn)算符輸入錯(cuò)!"<<endl;
exit(1);
)
if(b)cout<<z,right!,z<<end1;
。elsecout<<"error!”<<end1;
)
該程序的功能是:一方面讓計(jì)算機(jī)產(chǎn)生出兩個(gè)隨機(jī)整數(shù)x和y,x在1-50以內(nèi),y在1~
10以內(nèi);接著由用戶輸入一個(gè)運(yùn)算符,再由用戶輸入對(duì)x和y的運(yùn)算結(jié)果;然后判斷用戶
的計(jì)算是否對(duì)的,若對(duì)的則置b為true,即1,否則保持原值0不變;程序最后輸出相應(yīng)的信
息表達(dá)計(jì)算對(duì)的或錯(cuò)誤。
三、for語(yǔ)句
1.語(yǔ)句格式
for語(yǔ)句又稱for循環(huán),它也是一種結(jié)構(gòu)性語(yǔ)句,其語(yǔ)句格式為:
for(〈表達(dá)式1〉;〈表達(dá)式2>:〈表達(dá)式〉)〈語(yǔ)句〉
其中<語(yǔ)句>是for語(yǔ)句的循環(huán)體,它將按條件被反復(fù)執(zhí)行多次;〈表達(dá)式1》,(表達(dá)式2>
和〈表達(dá)式〉都可以被省略,但它們之間的分隔符(即分號(hào))必須保存;此外,〈表達(dá)式1》除了
可以是一個(gè)表達(dá)式外,還可以兼有對(duì)變量進(jìn)行定義的功能,此變量在離開(kāi)此循環(huán)后仍然可以
使用。如i=1和inti=l都可以作為<表達(dá)式1>使用,當(dāng)使用i=l時(shí),i必須被定義過(guò),
當(dāng)使用inti=l時(shí),i在此之前必須沒(méi)有定義,此表達(dá)式同時(shí)具有定義變量i和給它賦
初值這兩種功能。
2.語(yǔ)句執(zhí)行過(guò)程
for語(yǔ)句的執(zhí)行過(guò)程為:
(1)計(jì)算(表達(dá)式1>,當(dāng)然若此項(xiàng)被省略則無(wú)須計(jì)算;
(2)計(jì)算〈表達(dá)式2>得到一個(gè)值,假定為M,若該表達(dá)式被省略則當(dāng)作數(shù)值1看待;
(3)若M為非0,則執(zhí)行一遍循環(huán)體,否則結(jié)束整個(gè)for語(yǔ)句的執(zhí)行;
(4)計(jì)算(表達(dá)式3>,當(dāng)然若此項(xiàng)被省略則無(wú)須計(jì)算;
(5)自動(dòng)轉(zhuǎn)向第(2)執(zhí)行。
3.語(yǔ)句格式舉例
(1)for(i=l;i<10;i++)cout<<i<<'';
。⑵for(inti=1;i++<=1000;);
o(3)for(inti=0,j=0;i+j<20;i++,j+=2)x=i*i+j*j;
°(4)for(;;){i++;if(i>100)break;}
(5)for(i=0,y=0;i<n;i++){
cin>>x;
。y+=x;
}
。(6)for(intk=2;k<sqrt(m);k++)
oif(m%k==0)break;
(7)for(;b;a=b,b=r)r=a%b;
。(8)for(k=20;k!=0;k—){
。。a-rand()%100;
。。cout<<a<<<';
if(a%2)c1++;elsec2++;
0)
上述第(1)條語(yǔ)句使循環(huán)體反復(fù)執(zhí)行9次,每次輸出i的當(dāng)前值和一個(gè)空格。
第(2)條語(yǔ)句省略了〈表達(dá)式3>,并且循環(huán)體是一條空語(yǔ)句,該循環(huán)體被反復(fù)執(zhí)行
1000次,同時(shí)進(jìn)行1000次i++<=1000表達(dá)式的計(jì)算。
第(3)條語(yǔ)句中的〈表達(dá)式1〉分別給i和j賦初值為0,并對(duì)它們進(jìn)行變量說(shuō)明,<
表達(dá)式2>和〈表達(dá)式3〉分別為關(guān)系表達(dá)式和逗號(hào)表達(dá)式,循環(huán)體是一條賦值語(yǔ)句。
第(4)條語(yǔ)句中省略了所有三個(gè)表達(dá)式,循環(huán)體是一條復(fù)合語(yǔ)句。
第(5)條語(yǔ)句中的〈表達(dá)式1>為逗號(hào)表達(dá)式,循環(huán)體是一條復(fù)合語(yǔ)句,該循環(huán)語(yǔ)句完畢
從鍵盤(pán)上輸入n個(gè)常數(shù),并把它們依次累加到y(tǒng)上的任務(wù)。
第(6)條語(yǔ)句中的循環(huán)體是一條條件語(yǔ)句,它將被反復(fù)執(zhí)行,直到k<sqrt(m)不成立
時(shí)為止。
第(7)條語(yǔ)句中省略了〈表達(dá)式1〉,〈表達(dá)式2》為一個(gè)簡(jiǎn)樸變量b,〈表達(dá)式3>是一個(gè)逗
號(hào)表達(dá)式,循環(huán)體是一條賦值語(yǔ)句。
第(8)條語(yǔ)句的循環(huán)體將被循環(huán)執(zhí)行20次,每次一方面得到0~99之間的一個(gè)隨機(jī)數(shù)a
并輸出它,接著若a為奇數(shù)就使cl增1,否則使c2增1。該循環(huán)的功能是得到并輸出0~99
之間的20個(gè)隨機(jī)數(shù),并分別記錄出奇數(shù)和偶數(shù)的個(gè)數(shù)。
在for循環(huán)的循環(huán)體中允許使用break語(yǔ)句,其作用是:當(dāng)執(zhí)行到該語(yǔ)句時(shí),就使執(zhí)
行流程轉(zhuǎn)出所屬的for循環(huán)語(yǔ)句,然后再向下順序執(zhí)行。
4.語(yǔ)句嵌套
for循環(huán)體可認(rèn)為任何可執(zhí)行語(yǔ)句,當(dāng)然也可以直接為一條for語(yǔ)句,或者在作為循
環(huán)體的復(fù)合語(yǔ)句內(nèi)使用for語(yǔ)句,并且嵌套的層數(shù)不受限制。如:
(1)for(i=l;i<=5;i++)
for(j=1;j<=6;j++)s+=i*_j;
(2)for(i=1;i<=5;i++){
ofor(j=l;j〈=i;j++)cout?***;
。cout?endl;
0}
(3)for(i=0;i<m;i++)
for(j=0;j<n;j++)
?if(aa[i][j]>max){
°°0°max=aa[i][j];
。。row=i;co1=j;
d6}
以上每一條語(yǔ)句都是f。r雙重循環(huán)語(yǔ)句,處在外面的稱為外循環(huán),內(nèi)部的稱為內(nèi)循環(huán)。
如對(duì)于第(1)條語(yǔ)句,外循環(huán)控制循環(huán)體(即內(nèi)循環(huán))執(zhí)行5次,每次執(zhí)行內(nèi)循環(huán)時(shí)又控制
內(nèi)循環(huán)體執(zhí)行6次,所以內(nèi)循環(huán)共被執(zhí)行5*6=30次。同理,第(2)條語(yǔ)句的內(nèi)循環(huán)體(即c
o語(yǔ)句)共被執(zhí)行1+2+3+4+5=15次,第(3)條語(yǔ)句的內(nèi)循環(huán)體(即if語(yǔ)句)
共被執(zhí)行m*n次。
5.程序舉例
(1)#include<iomanip.h>
voidmain()
doublex,y;
。cout<<〃從鍵盤(pán)上同一行輸入6個(gè)常數(shù):〃;
。for(inti=0;i<6;i++){
a。cin>>x;
。y=4*x*x-2*x+5;
cout<<〃x="<<setw(5)?x;
。。cout<<setw(10)<<z/y=z,<<setw(5)<<y?endl;
。)
)
在這個(gè)程序的主函數(shù)中,第一行定義了兩個(gè)雙精度變量x和y,第二行給出提醒信息,
規(guī)定用戶從鍵盤(pán)上輸入6個(gè)常數(shù)后回車,第三行至第八行為一條for循環(huán)語(yǔ)句,其循環(huán)體是一
條復(fù)合語(yǔ)句,將被反復(fù)執(zhí)行6次,相應(yīng)控制循環(huán)的變量i的取值依次為0,1,2,3,4和5,每次
循環(huán)一方面從鍵盤(pán)緩沖區(qū)讀入一個(gè)常數(shù)并賦給x,接著計(jì)算出y的值,然后按一定格式輸出x
和y的值。若程序運(yùn)營(yíng)后,從鍵盤(pán)上輸入的6個(gè)常數(shù)為2,5,10,3.6,8.25,24.66,則得到
的輸出結(jié)果為:
從鍵盤(pán)上同一行輸入6個(gè)常數(shù):25103.68.2524.66
x=2y=17
x=5y=95
x=10y=385
x=3.6y=49.64
x=8.25y=260.75
x=24.66y=2388.14
(2)#include<iostream.h>
voidmain()
inti,n;doub1ep=l;
。cout<<〃輸入一個(gè)正整數(shù),求其階乘:〃;
。cin>>n;
for(i=l;i<=n;i++)p*=i;
。cout<<n<</z!=zr?p?endl;
}
在這個(gè)程序中定義了三個(gè)變量,用i作為控制循環(huán)的變量,簡(jiǎn)稱循環(huán)變量,用D保存從
鍵盤(pán)輸入的一個(gè)正整數(shù),用P計(jì)算和保存n的階乘值,p的初值為1,每次進(jìn)行循環(huán)計(jì)算時(shí)都
使P累乘循環(huán)變量i的值,循環(huán)結(jié)束后P的值就是n的階乘值。假定程序運(yùn)營(yíng)時(shí)輸入的n值
為10,則運(yùn)營(yíng)結(jié)果為:
輸入一個(gè)正整數(shù),求其階乘:10
10!=3.6288e+006
(3)nclude<iostrearn.h>
#include<stdlib.h>
voidmain()
(
。intn,x,max,min;
CoutVV〃輸入待解決數(shù)據(jù)的個(gè)數(shù):〃;
cin?n;
。if(n<=0){cout?"n<=0!,z<<endl;exit(1);}
o。。11僅〈〃輸入”《水<〃個(gè)待解決的數(shù)據(jù):〃;
cin>>x;max=min=x;
for(;-n;){
cin>>x;
if(x>max)max=x;
。if(x<min)min=x;
?)
cout?"maax<<endl;
"cout<<//min:"<<min<<end1;
}
在程序的主函數(shù)中,第一行同時(shí)定義了四個(gè)整型變量n,x,max和min,用它們分別
保存待解決數(shù)據(jù)的個(gè)數(shù)、當(dāng)前被解決的一個(gè)數(shù)據(jù)、已解決數(shù)據(jù)中的最大值和已解決數(shù)據(jù)中的
最小值。第二行和第三行用來(lái)從鍵盤(pán)上給n輸入一個(gè)整數(shù).第四行用來(lái)解決數(shù)據(jù)個(gè)數(shù)n小于
等于0的不正常情況。第五行給出請(qǐng)用戶輸入n的數(shù)據(jù)的提醒信息。第六行用來(lái)從鍵盤(pán)緩沖
區(qū)讀入第一個(gè)被解決數(shù)據(jù)并用它作為max和min這兩個(gè)變量的初值。第7至11行為一個(gè)for
循環(huán),循環(huán)體共需執(zhí)行n-1次,每次一方面從鍵盤(pán)緩沖區(qū)讀入一個(gè)數(shù)據(jù)到x中,接著分別同
當(dāng)前最大值max和當(dāng)前最小值min相比較,若x較大則用它修改max的值,若x較小則用
它修改min的值,使max和min始終保持已解決數(shù)據(jù)中的最大值和最小值,當(dāng)此循環(huán)結(jié)束
后,max和min中就分別存有n個(gè)數(shù)據(jù)中的最大值和最小值。最后兩行語(yǔ)句輸出所求得的最
大值和最小值。
假定需解決6個(gè)數(shù)據(jù),這6個(gè)數(shù)據(jù)為:48,62,30,24,55,36,則程序運(yùn)
營(yíng)結(jié)果為:
輸入待解決數(shù)據(jù)的個(gè)數(shù):6
輸入6個(gè)待解決的數(shù)據(jù):486230245536
max:62
min:24
(4)#include<iostream.h>
voidmain()
for(inta=0,b=1;b<100;){
。cout?a<<7><<b<<';
。ea=a+b;
of>b-a+b;
0)
cout<<end1;
。cout<<a?**<<b?z'<<endl;
)
該程序的主函數(shù)中包具有一個(gè)for循環(huán),〈表達(dá)式1〉分別給變量a賦初值為0和給
變量b賦初值為1,由于這兩個(gè)變量在此之前沒(méi)有被定義,所以在此使用時(shí)必須定義,〈表達(dá)
式2>是一個(gè)關(guān)系表達(dá)式b<100,〈表達(dá)式3》被省略,循環(huán)體中一方面輸出a和b的值,接著
根據(jù)a和b的當(dāng)前值求出a的新值,再運(yùn)用a和b的當(dāng)前值求出b的新值,然后判斷b<10
。是否成立,若是則執(zhí)行下一次循環(huán),否則結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行后面的輸出語(yǔ)句。該程序的運(yùn)
營(yíng)結(jié)果為:
01123581321345589
144233
該程序的功能是輸出一個(gè)數(shù)列的前若干項(xiàng),其中第一項(xiàng)為0,第二項(xiàng)為1,以后每一項(xiàng)等
于其前兩項(xiàng)之和。如第10項(xiàng)為34,它等于第8項(xiàng)13和第9項(xiàng)34之和。
(5)#include<iostream.h>
constintM=4,N=5;
voidmain()
(
。inti,j,s=0;
。for(i=1;i<=M;i++)
for(j=1;j<=N;j++)
s+=i*j;
。cout<<s?end1;
}
主函數(shù)中使用了一個(gè)雙重for循環(huán),外循環(huán)變量i初值為1,終值為整數(shù)常量M,每執(zhí)
行一次外循環(huán)體(即內(nèi)循環(huán))后其值增長(zhǎng)1,內(nèi)循環(huán)變量初值為1,終值為整數(shù)常量N,每執(zhí)行
一次內(nèi)循環(huán)體(即s+=i*j;語(yǔ)句)后其值也增長(zhǎng)1,內(nèi)循環(huán)體共需執(zhí)行MxN次。該程序的功
MN
能是計(jì)算*j)的值。程序運(yùn)營(yíng)結(jié)果為150。
i=\j=\
6.應(yīng)用舉例
例1.編一程序計(jì)算1+2、4、62+…+5()2的值。
分析:此題所給的計(jì)算公式是一個(gè)和式,它除第一項(xiàng)外,其余項(xiàng)為從2至50的每一個(gè)偶
數(shù)的平方,因此可采用循環(huán)累加的方法來(lái)計(jì)算,即依次把每個(gè)數(shù)據(jù)項(xiàng)(在此為偶數(shù)的平方)累
加到一個(gè)變量中。設(shè)循環(huán)變量為i,它的初值、終值和步長(zhǎng)(即每次循環(huán)后循環(huán)變量的增長(zhǎng)
值)應(yīng)分別為2、50和2,設(shè)用于累加的變量為s,它的初值應(yīng)為和式中的第一項(xiàng)1,由于
它不可以通過(guò)有規(guī)律的循環(huán)累加到s上。在循環(huán)體中通過(guò)賦值語(yǔ)句每次把i的平方值累加到
s上,當(dāng)循環(huán)結(jié)束后,s的值就是所求的結(jié)果。根據(jù)分析編寫(xiě)出程序如下:
#include<iostream.h>
voidmain()
(
。inti,s=l;
。for(i=2;i<=50;i+=2)s+=i*i;
cout?,,s=n<<s<<end1;
)
10..2
例2.編一程序計(jì)算z(_iy+ijx的值,其中x值由鍵盤(pán)輸入。
分析:此題是一個(gè)累加求和問(wèn)題,適合使用for循環(huán)來(lái)實(shí)現(xiàn)?設(shè)循環(huán)變量為和式中的
i,它從1取值到10,每次增長(zhǎng)1,每次計(jì)算出一個(gè)數(shù)據(jù)項(xiàng)并把它累加起來(lái)。為了計(jì)算一個(gè)
數(shù)據(jù)項(xiàng)中的X,和i!,還需要設(shè)定兩個(gè)累乘變量,假定分別用P1和p2表達(dá),它們的初值應(yīng)
均為1,在循環(huán)體中需要分別向P1和p2累乘x和i的值。為了把每個(gè)數(shù)據(jù)項(xiàng)的值累加起來(lái),
需要設(shè)定一個(gè)累加變量,假定用s表達(dá),它的初值為0,每次向它累加(-1)"bl/P2的值。
當(dāng)和式中的所有10個(gè)數(shù)據(jù)項(xiàng)都累加到s之后,s的值就是所求的結(jié)果。根據(jù)分析編寫(xiě)出程
序如下:
#include<iostrearn.h>
voidmain()
(
?doub1ex,pl=l,p2=1,s=0;
inti,j=1;
cout<〈”輸入x的值:";
cin>>x;
。for(i=1;i<=10;i++){
。pl*=x;//1的值為*1
p2*=i;//p2的值為i!
s+=j*pl/p2;//j的值為(-1)i+1
。j=-j;//j取反,為下一數(shù)據(jù)項(xiàng)計(jì)算做準(zhǔn)備
0}
cout?s<<endl;
)
xx
例3.已知yk=l+e,ykl產(chǎn)+e~一,其中x從。開(kāi)始取值,每次增長(zhǎng)的步長(zhǎng)為0.25,
V2tz+1V2a-1
直到3,a的值由鍵盤(pán)輸入,并規(guī)定大于0,編一程序依次求出x每一取值所相應(yīng)的山和yz
的值。
分析:設(shè)i為循環(huán)變量,讓它的初值、終值和步長(zhǎng)分別為0,12和1,則x的每次取值
可表達(dá)為0.25i。在循環(huán)體中計(jì)算力和y2的公式應(yīng)分別表達(dá)為:
yl=(l+exp(x))/(sqrt(2*a)+1)
y2=(l+exp(x))/(sqrt(2*a)-1)
每次根據(jù)x的值(即0.25)求出相應(yīng)的yl和y2后都要輸出出來(lái)。根據(jù)分析編寫(xiě)出程
序程序如下:
#include<iomanip.h>
#include<math.h>
voidmain()
(
doub1ex,a,yl,y2;
cout?MInputa(a〉0):";cin?a;〃也可把a(bǔ)設(shè)定為數(shù)值常量
。for(inti=0;i<=12;i++){
x=0.25*i;
ooyl=(l+exp(x))/(sqrt(2*a)+l);
。。y2=(1+exp(—x))/(sqrt(2*a)-1);
cout?setw(10)<<x?setw(10)<<y1<<setw(10)<<y
2<<end1;
)
)
例4,已知一組實(shí)驗(yàn)數(shù)據(jù):3.62,2.93,3.16,3.73,2.86,3.40,2.86,3.07,3.29,3.24,
編一程序分別求出它們的平均值、方差和均方差,規(guī)定每一結(jié)果只保存兩位小數(shù)。
分析:設(shè)它們的平均值、方差和均方差分別用變量v,f和t表達(dá),由數(shù)學(xué)知識(shí)可知,相
應(yīng)的計(jì)算公式為:
1〃1
t="
v
ni=]
其中n表達(dá)數(shù)據(jù)個(gè)數(shù),x,表達(dá)第i個(gè)數(shù)據(jù)。
此題需要一方面求出Li和£石2,然后才可以求出V,f和t。而求所有數(shù)之和以及
z=lZ=1
求所有數(shù)平方之和需要采用循環(huán)累加的方法。為此設(shè)循環(huán)變量為i,它的初值、終值和步長(zhǎng)
應(yīng)分別為1,n和1,設(shè)輸入變量為x,每次從鍵盤(pán)緩沖區(qū)得到一個(gè)實(shí)驗(yàn)數(shù)據(jù),設(shè)累加數(shù)據(jù)之
和的變量為s1,累加數(shù)據(jù)平方之和的變量為s2o每次分別向s1和s2累加X(jué)i和婷的值。
根據(jù)以上分析編寫(xiě)出程序如下:
#include<iostrearn,h>
ttinclude<math.h>
constintn=10;//n等于待解決數(shù)據(jù)的個(gè)數(shù)
voidmain()
(
。doublex,s1,s2;
。sl=s2=0;
。cou〃從鍵盤(pán)上輸入〃。水〈〃個(gè)實(shí)驗(yàn)數(shù)據(jù):”;
。for(inti=1;i<=n;i++){
。cin>>x;
。。sl+=x;
。s2+=x*x;
。)
doublev,f,t;
v=sl/n;
。f=s2/n-v*v;
。t=sqrt(f);
。v=floor(v*100)/100;
f=f1oor(f*100)/100;
t=f1oor(t*100)/100;
。cout?,zv="<<v?endl;
cout?zzf=,z<<f?endl;
。coutt?endl;
}
該程序上機(jī)運(yùn)營(yíng)后,按所給數(shù)據(jù)輸入,則運(yùn)營(yíng)結(jié)果為:
從鍵盤(pán)上輸入10個(gè)實(shí)驗(yàn)數(shù)據(jù):
3.622.933.163.732.863.402.863.073.293.24
v=3.21
f=0.08
t=0.28
例5.由勾股定理可知,在一個(gè)直角三角形中,兩條直角邊a和b與斜邊C的關(guān)系為
aZ+bJc;編一程序求出每條直角邊均不大于30的所有整數(shù)組解。如(3,4,5),(5,1213)
等都是該題的解。
分析:根據(jù)題意,需要使用二重循環(huán)來(lái)解決,設(shè)外循環(huán)變量用a表達(dá),它的初值、終值
和步長(zhǎng)應(yīng)分別取1,30和1,內(nèi)循環(huán)變量用b表達(dá),它的初值、終值和步長(zhǎng)應(yīng)分別取a+1,30
和1。內(nèi)循環(huán)變量的初值若取1,而不是取a+1,則會(huì)出現(xiàn)象(3,4,5)和(4,3,5)這樣的反復(fù)
組,為了避免反復(fù)組的出現(xiàn),所以讓b從a+1開(kāi)始,即使第二條直角邊大于第一條直角邊。
根據(jù)分析編寫(xiě)出程序如下:
#include<iostream.h>
#include<math.h>
constn=30;
voidmain()
inta,b;
doublec;
for(a=l;a<=n;a++)
for(b=a+l;b<=30;b++){
c=sqrt(a*a+b*b);〃q求出斜邊的長(zhǎng)度
if(floor(c)==c)〃若斜邊同為整數(shù)則輸出
。。cout?'('?a'?b?','?€?*),?end1;
)
)
該程序運(yùn)營(yíng)后,將得到如下輸出結(jié)果:
(3,4,5)
(5,12,13)
(6,8,10)
(7,24,25)
(8,15,17)
(9,12,15)
(10,24,26)
(12,16,20)
(15,20,25)
(16,30,34)
(18,24,30)
(20,21,29)
(21,28,35)
例6.編一程序打印出2至99之間的所有素?cái)?shù)。
分析:由數(shù)學(xué)知識(shí)可知,若一個(gè)自然數(shù)是素?cái)?shù)(又稱質(zhì)數(shù)),則它必然不能被1和它自身
之外的任何自然數(shù)整除。由于任何一個(gè)自然數(shù)都不也許被比它大的自然數(shù)整除,所以要判斷
一個(gè)自然數(shù)是否為素?cái)?shù),只要看它能否被比它小的自然數(shù)(當(dāng)然除1之外)整數(shù),若能則不是
素?cái)?shù),否則是素?cái)?shù)。另一方面,若一個(gè)自然數(shù)n不是素?cái)?shù),則必然能表達(dá)成兩個(gè)自然數(shù)nl
和n2之積,并且若nl小于等于冊(cè),n2必然大于等于品。所以要判斷一個(gè)自然數(shù)n是
否為素?cái)?shù),可簡(jiǎn)化為判斷它能否被2至〃之間的自然數(shù)整除即可。由于若一個(gè)自然數(shù)n不
能被2至至冊(cè)之間的自然數(shù)整除,則不然也不能被冊(cè)至n-1之間的自然數(shù)整除。
由以上分析可知,判斷一個(gè)自然數(shù)n是否為素?cái)?shù)的過(guò)程是一個(gè)循環(huán)過(guò)程,設(shè)循環(huán)變量
為i,它的初值、終值和步長(zhǎng)應(yīng)分別為2,floor(sqrt(n)和1,在循環(huán)體內(nèi)要判斷n是
否能被i整除,若能則表白n不是素?cái)?shù),應(yīng)結(jié)束循環(huán),若不能則繼續(xù)循環(huán)。當(dāng)整個(gè)循環(huán)正常結(jié)
束(即因〈表達(dá)式2>的值為0而結(jié)束
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年贍養(yǎng)老人個(gè)人所得稅分?jǐn)傌?zé)任書(shū)范本3篇
- 二零二五個(gè)人公司股權(quán)投資風(fēng)險(xiǎn)控制合同3篇
- 二零二五年度航天器關(guān)鍵技術(shù)研發(fā)合作合同3篇
- 二零二五年度個(gè)人企業(yè)經(jīng)營(yíng)抵押借款合同
- 2025版通信管材采購(gòu)與施工監(jiān)理服務(wù)合同3篇
- 二零二五年電影廣告植入融資居間合同3篇
- 沙漠光伏基座施工方案
- 二零二五版協(xié)警勤務(wù)用車聘用合同樣本3篇
- 二零二五年度個(gè)人股東對(duì)外股權(quán)轉(zhuǎn)讓協(xié)議范本與股權(quán)交易監(jiān)管3篇
- 二零二五年度網(wǎng)絡(luò)直播平臺(tái)內(nèi)容合作與分成合同4篇
- 第1課 隋朝統(tǒng)一與滅亡 課件(26張)2024-2025學(xué)年部編版七年級(jí)歷史下冊(cè)
- 2025-2030年中國(guó)糖醇市場(chǎng)運(yùn)行狀況及投資前景趨勢(shì)分析報(bào)告
- 【歷史】唐朝建立與“貞觀之治”課件-2024-2025學(xué)年統(tǒng)編版七年級(jí)歷史下冊(cè)
- 冬日暖陽(yáng)健康守護(hù)
- 產(chǎn)業(yè)園區(qū)招商合作協(xié)議書(shū)
- 水處理藥劑采購(gòu)項(xiàng)目技術(shù)方案(技術(shù)方案)
- 2024級(jí)高一上期期中測(cè)試數(shù)學(xué)試題含答案
- 盾構(gòu)標(biāo)準(zhǔn)化施工手冊(cè)
- 天然氣脫硫完整版本
- 山東省2024-2025學(xué)年高三上學(xué)期新高考聯(lián)合質(zhì)量測(cè)評(píng)10月聯(lián)考英語(yǔ)試題
- 不間斷電源UPS知識(shí)培訓(xùn)
評(píng)論
0/150
提交評(píng)論