版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系廈門理工學(xué)院高級(jí)語言程序設(shè)計(jì)教學(xué)課件
第3章程序的控制結(jié)構(gòu)--循環(huán)結(jié)構(gòu)(重復(fù)結(jié)構(gòu))廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系
2023/2/6教師:謝小竹E-Mail:xzxie@
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系2本章主要內(nèi)容3.1算法3.2C語句概述3.3順序結(jié)構(gòu)3.5循環(huán)結(jié)構(gòu)3.6綜合例子3.4選擇結(jié)構(gòu)
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系0循環(huán)的必要性intresult1,result2,result3;intresult4,result5;result1=1*10;printf("1×10=
%d\n",result1);result2=2*10;printf("2×10=
%d\n",result2);result3=3*10;printf("3×10=
%d\n",result3);result4=4*10;printf("4×10=
%d\n",result4);result5=5*10;printf("5×10=
%d\n",result5);
1×10=102×10=203×10=304×10=405×10=50輸出結(jié)果重復(fù)語句
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系0循環(huán)的必要性1×10=102×10=203×10=304×10=405×10=500+11+12+1上個(gè)數(shù)字
+1...重復(fù)
(上個(gè)數(shù)字
+1)×10
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系53.5循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)又稱重復(fù)結(jié)構(gòu),可用來完成重復(fù)性、規(guī)律性的操作。是結(jié)構(gòu)化程序設(shè)計(jì)的基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。循環(huán)結(jié)構(gòu)的特點(diǎn)是:在給定條件成立時(shí),反復(fù)執(zhí)行某程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。C語言主要提供了while、do-while和for三種循環(huán)語句,來組成各種不同形式的循環(huán)結(jié)構(gòu)。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系C語言中的各種循環(huán)whiledo-whilefor需要多次重復(fù)執(zhí)行一個(gè)或多個(gè)任務(wù)的問題考慮使用循環(huán)來解決
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系73.5.1while語句while語句的一般形式為:
while(表達(dá)式)語句其中表達(dá)式是循環(huán)條件,語句為循環(huán)體。while語句的語義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí),執(zhí)行循環(huán)體語句。其執(zhí)行過程如圖3-9(a)、(b)所示。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系#include<stdio.h>voidmain(){intnum=1,result;while(num<=10){result=num*10;printf("%d×10=
%d\n",num,result);num++;}}while循環(huán)示例內(nèi)存numresult1null102輸出:1×10=102×10=203×10=304×10=405×10=506×10=607×10=708×10=809×10=9010×10=10011100
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系【例】用while語句求1~100的累計(jì)和。
#include<stdio.h>voidmain(){inti=1,sum=0;
while(i<=100){sum+=i; i++; }printf("sum=%d\n",sum);}循環(huán)初值循環(huán)終值循環(huán)條件循環(huán)體循環(huán)變量增值運(yùn)行結(jié)果:sum=5050
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系10例題3-14例3-14用while語句求n!=1*2*3*…*n的值。分析:這是一個(gè)累乘求積的問題,與累加求和類似。引入變量fac和i分別表示被乘數(shù)和乘數(shù),積也用變量fac表示,則求n!=1*2*3*…*n可以轉(zhuǎn)化為對(duì)語句:
fac=fac*i;的多次反復(fù)運(yùn)行即可。令fac的初值為1,并讓i從1變化到n,即可得到n!的值了。用傳統(tǒng)流程圖表示算法,如圖3-10所示:#include<stdio.h>main(){inti=1,n;/*定義i和n變量,并為i賦初值*/longintfac=1;printf(“Pleaseinputn:”);scanf(“%d”,&n);/*輸入n值*/while(i<=n)/*先判斷后執(zhí)行,循環(huán)n次。本行為循環(huán)控制部分*/{fac=fac*i;/*做累乘運(yùn)算*/i++;/*累乘次數(shù)計(jì)數(shù)器加1。本行為循環(huán)條件的修改語句*/}printf(“%ld\n”,fac);}運(yùn)行情況如下:Pleaseinputn:6720思考:若把循環(huán)體中的兩個(gè)語句:第10和11行對(duì)調(diào),對(duì)結(jié)果有什么影響?若要保持原結(jié)果不變,應(yīng)把前面的程序段作何修改?
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系11說明:(1)從上例中可以看出,一個(gè)循環(huán)的基本組成應(yīng)該有三大部分:①循環(huán)的初始化部分:建立循環(huán)首次執(zhí)行所必需的條件,包括循環(huán)操作中的初值和控制循環(huán)的初值兩部分。②循環(huán)控制部分:其核心為一個(gè)條件判斷。這個(gè)條件一般是關(guān)系表達(dá)或邏輯表達(dá)式,只要表達(dá)式的值為真(非0)即表示條件成立,可繼續(xù)循環(huán)。③循環(huán)體部分:循環(huán)中要反復(fù)執(zhí)行的操作,同時(shí)包括控制循環(huán)條件的修改語句,以保證循環(huán)正常結(jié)束,避免出現(xiàn)死循環(huán)(若把第10行i++;去掉,則出現(xiàn)死循環(huán),此時(shí)只能按Ctrl+Break組合鍵終止程序運(yùn)行)。(2)注意到初始化部分中第5行:longintfac=1中的fac的若定義為整型int,則可能出現(xiàn)數(shù)據(jù)溢出現(xiàn)象,因?yàn)檎蚷nt的取值范圍為-32768~32767。當(dāng)然如果定義為longint仍有可能出現(xiàn)數(shù)據(jù)溢出現(xiàn)象,還可以定義其數(shù)據(jù)類型為float,甚至為double。另外,因?yàn)閒ac充當(dāng)累乘器,一般初始化為1,而累加器,一般初始化為0。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系12說明:
(3)while語句的特點(diǎn)是先判斷表達(dá)式,后執(zhí)行語句。即先計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí),執(zhí)行循環(huán)體語句。因此如果表達(dá)式的值一開始就為“假”,循環(huán)體一次也不執(zhí)行。
(4)循環(huán)體如果包括有一個(gè)以上的語句,則必須用{}括起來,組成復(fù)合語句。請(qǐng)大家在[例3-14]的基礎(chǔ)上完成下列各題:(1)求1*3*5*7*…*(2n+1)(2)求1!+2!+3!+…+n!(3)求1!+3!+5!+…+(2n+1)!
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系13例題3-15
例3-15角度的余弦值可以利用下面的無窮級(jí)數(shù)計(jì)算出來:cos(x)≈1-x2/2!+x4/4!-x6/6!+x8/8!-…編程序從鍵盤讀取一個(gè)角度x(單位為弧度)計(jì)算cos(x)的近似值,直到最后一項(xiàng)的絕對(duì)值小于10-5為止。分析:通過觀察,我們可把此級(jí)數(shù)看成是對(duì)若干項(xiàng)的累加求和,其中每一項(xiàng)由符號(hào)、分子和分母組成。因此編程的基本思想是:不斷求級(jí)數(shù)的部分和,直到后面準(zhǔn)備加進(jìn)去的項(xiàng)的絕對(duì)值小于1e-5為止,否則加進(jìn)去后計(jì)算下一項(xiàng)。#include<math.h>/*包含使用數(shù)學(xué)庫(kù)函數(shù)所對(duì)應(yīng)的頭文件*/#include<stdio.h>main(){floata=1.0,b=1.0,x,term=1.0,s=0.0;
/*a、b、term分別代表分子、分母及某一項(xiàng)*/intm=2,sign=1;/*sign代表符號(hào)*/printf("Pleaseinputthevalueofx:");scanf("%f",&x);/*角度x的單位為弧度*/while(fabs(term)>=1e-5){s=s+term;sign=-sign;a=a*x*x;b=b*m*(m-1);term=sign*a/b;m=m+2;}printf("cos(%f)=%f\n",x,s);}運(yùn)行結(jié)果如下:Pleaseinputthevalueofx:0cos(0.000000)=1.000000Pleaseinputthevalueofx:3.141593cos(3.141593)=-1.000004Pleaseinputthevalueofx:1.570796cos(1.570796)=-0.000000
思考:(1)分母b是否可以定義為int類型?(2)循環(huán)中語句s=s+term;能否移到語句term=sign*a/b;的后面。說明:本例的上述解法具有一般性,即適用于類似的級(jí)數(shù)求和問題。但本例比較特殊:后一項(xiàng)與前一項(xiàng)的比為一個(gè)與項(xiàng)數(shù)i有關(guān)的數(shù)據(jù)(-1)*x*x/(2*i-1)/(2*i),這樣在求出前一項(xiàng)的基礎(chǔ)上可以很容易地推導(dǎo)出后一項(xiàng)。本例的第二種解法代碼如下:#include<math.h>#include<stdio.h>main(){floats=0.0,term=1.0,x;inti=1;printf("Pleaseinputthevalueofx:");scanf("%f",&x);while(fabs(term)>=1e-5){s+=term;term=term*(-1)*x*x/(2*i-1)/(2*i);i++;}printf("cos(%f)=%f\n",x,s);}
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系14例題3-16例3-16將從鍵盤輸入的一串字符(用#結(jié)束輸入)按如下規(guī)則進(jìn)行轉(zhuǎn)換:(1)如果輸入的字符為大寫字母,則先轉(zhuǎn)換為對(duì)應(yīng)的小寫字母。(2)將a轉(zhuǎn)換為c、b轉(zhuǎn)換為d、…、x轉(zhuǎn)換為z、y轉(zhuǎn)換為a、z轉(zhuǎn)換為b。(3)其他字符不轉(zhuǎn)換。分析:用語句“if(ch>=‘A’&&ch<=‘Z’)ch=ch+32;”可將大寫字母轉(zhuǎn)換為對(duì)應(yīng)的小寫字母;用語句“if(ch>=‘a(chǎn)’&&ch<=‘z’)ch=ch+2;”可將大寫字母轉(zhuǎn)換為其后第2個(gè)字母;對(duì)字母y和z通過“ch=ch+2;”后,其ASCII碼已超出小寫字母的取值范圍,因此必須在此基礎(chǔ)上再減去26才能得到a和b。源程序如下:#include<stdio.h>main(){charch;printf("Inputdata:");
ch=getchar();while(ch!='#'){if(ch>='A'&&ch<='Z')/*如果是大寫字母*/ch=ch+32;/*轉(zhuǎn)換成小寫字母,其他字符不變*/if(ch>='a'&&ch<='z')/*如果是小寫字母*/{ch=ch+2;/*轉(zhuǎn)換成其后第2個(gè)字母*/if(ch>'z')ch=ch-26;
/*處理對(duì)’y’和’z’加后超范圍的情況*/}
putchar(ch);ch=getchar();}}運(yùn)行結(jié)果如下:Inputdata:UfYr'q2yLb3?#what's2and3?說明:(1)程序中的第6、7、16行可以用while((ch=getchar())!=’#’)來代替放在原來第6行的位置,其他保持不變。注意上面式子中ch=getchar()必須在兩邊加上圓括號(hào)。(2)本例屬于解密碼的問題,即將原來的字符串按照一定的規(guī)則轉(zhuǎn)換后能夠閱讀。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系
(1)如果while后的表達(dá)式的值一開始就為假,循環(huán)體將一次也不執(zhí)行。
(2)循環(huán)體中的語句可為任意類型的C語句。
(3)遇到下列情況,退出while循環(huán):
表達(dá)式為假(為0)。循環(huán)體內(nèi)遇到break、return語句。
while語句注意事項(xiàng):inta=0,b=0;while(a>0)//a>0為假,b++不可能執(zhí)行
b++;intnum=0;//字符計(jì)數(shù)while(1){if(getche()=='\n')//如果輸入的字符是回車符,則返回
return;num++;}當(dāng)執(zhí)行循環(huán)體內(nèi)部語句return時(shí),它不僅要退出循環(huán),而且還要終止return后面的語句的運(yùn)行,將該循環(huán)所在的函數(shù)返回。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系
(4)在執(zhí)行while語句之前,循環(huán)控制變量必須初始化,否則執(zhí)行的結(jié)果將是不可預(yù)知的。
(5)要在while語句的某處(表達(dá)式或循環(huán)體內(nèi))改變循環(huán)控制變量,否則極易構(gòu)成死循環(huán)。
(6)允許while語句的循環(huán)體又是while語句,從而形成雙重循環(huán)。
while語句注意事項(xiàng):例:計(jì)算10!#include<stdio.h>voidmain(){inti;//i應(yīng)賦初始值10longs=1;while(i>=1)s*=i--;printf("10!=%ld\n",s);}i=1;while(i<100)//死循環(huán),因?yàn)閕的值沒變化,永遠(yuǎn)小于100sum+=i;printf("sum=%d\n",sum);
i=1;while(i<=9){j=1;
while(j<=9){printf("%d*%d=%d\n",i,j,i*j);j++;}i++;}
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系173.5.2do-while語句do-while語句的一般形式為:do{
循環(huán)體語句
}while(表達(dá)式);這個(gè)循環(huán)與while循環(huán)的不同在于:它先執(zhí)行循環(huán)中的語句,然后再判斷表達(dá)式是否為真,如果為真則繼續(xù)循環(huán);如果為假,則終止循環(huán)。因此,do-while循環(huán)至少要執(zhí)行一次循環(huán)語句。其執(zhí)行過程可用圖3-11(a)、(b)表示。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系【例】用do_while語句求1~100的累計(jì)和。
#include<stdio.h>voidmain(){inti=1,sum=0;
do{sum+=i; i++; }while(i<=100);printf("sum=%d\n",sum);}運(yùn)行結(jié)果:sum=5050
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系19例題3-17do-while語句求n!=1*2*3*…*n的值。用傳統(tǒng)流程圖表示算法,見圖3-12。源程序如下:#include<stdio.h>main(){inti=1,n;/*定義i和n變量,并為i賦初值1*/longintfac=1;/*因階乘值取值范圍較大,故fac定義為長(zhǎng)整型,并賦初值1*/printf("Pleaseinputn:");scanf("%d",&n);/*輸入n值*/do{fac=fac*i;/*做累乘運(yùn)算*/i++;/*累乘次數(shù)計(jì)數(shù)器加1*/}while(i<=n);/*先判斷后執(zhí)行,循環(huán)n次*/
printf("%ld\n",fac);}
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系20說明:
(1)while后的分號(hào)“;”不能少。
(2)當(dāng)循環(huán)體只有一個(gè)語句時(shí),花括號(hào)“{}”可以省略,但為了避免與while語句混淆,建議保留。
(3)上述問題既可以用while語句處理,也可以用do-while語句處理。并且在兩種語句中其組成循環(huán)結(jié)構(gòu)的三個(gè)部分相同,得到的結(jié)果也相同,可以認(rèn)為對(duì)上述問題while語句與do-while語句是完全等價(jià)的。其實(shí)do-while結(jié)構(gòu)是由一個(gè)語句加一個(gè)while結(jié)構(gòu)構(gòu)成的。見流程圖3-13,其中虛線框部分就是一個(gè)while結(jié)構(gòu)。這是不是意味著在任何情況下兩者都是等價(jià)的?除了下列這種特殊情況之外的其他情況是等價(jià)的,即當(dāng)兩種語句在第一次進(jìn)入循環(huán)時(shí)條件就不滿足的特殊情況下是不等價(jià)的。如下列兩個(gè)程序段是不等價(jià)的:程序段1:k=11;while(k<=10){printf(“k=%d”,k);}程序段2:k=11;do{printf(“k=%d”,k);}while(k<=10);
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系比較while和do-while循環(huán)while(循環(huán)條件){循環(huán)體;}do{
循環(huán)體;}while(循環(huán)條件);do-while循環(huán)是先執(zhí)行后判斷,所以,即使開始條件為假,循環(huán)體也至少會(huì)被執(zhí)行一次。while循環(huán)是先判斷后執(zhí)行,所以,如果條件為假,則循環(huán)體一次也不會(huì)被執(zhí)行。
比較while和do-while循環(huán)的工作原理
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系22例題3-18
[例3-18]不斷輸入三角形的三邊長(zhǎng),求三角形面積,直到用戶按’Y’或’y’鍵程序結(jié)束。分析:本例中要不斷輸入多組線段進(jìn)行處理,這是一個(gè)重復(fù)操作問題,可考慮使用循環(huán)結(jié)構(gòu)。并且可以先讓用戶輸入第一組數(shù)據(jù)進(jìn)行處理,然后再由用戶來決定是否要繼續(xù)輸入下一組數(shù)據(jù),因此本題采用do-while語句來編程。源程序如下:#include<stdio.h>#include<ctype.h>#include<conio.h>#include<math.h>main(){doublea,b,c,s,area;do{printf("Pleaseinputa,b,c:");scanf("%lf,%lf,%lf",&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a) {s=1.0/2*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("area=%7.2lf\n",area); } elseprintf("itisnotatrilateral\n”);printf("按‘Y’或‘y’鍵退出,按其它鍵繼續(xù)…\n");}while(toupper(getch())!='Y');}運(yùn)行結(jié)果如下:Pleaseinputa,b,c:3,4,5area=6.00按‘Y’或‘y’鍵退出,按其它鍵繼續(xù)…
(設(shè)按‘n’鍵,繼續(xù)下列操作)Pleaseinputa,b,c:1,2,3itisnotatrilateral按‘Y’或‘y’鍵退出,按其它鍵繼續(xù)…
(設(shè)按‘y’鍵,則退出程序)思考:while(toupper(getch())!='Y');中的getch()若改為getchar(),運(yùn)行結(jié)果如何?為什么?說明:(1)toupper(getch())函數(shù)調(diào)用的作用是將getch()函數(shù)從鍵盤上獲得的字符轉(zhuǎn)化為大寫字母。它的等價(jià)為:getch()!='Y'&&getch()!='y'
。(2)getch()、getche()和getchar()三者雖然都需從鍵盤輸入字符,但是輸入方式有所不同。在getchar()的原始形式中,輸入字符先被放到緩沖隊(duì)列中,直到鍵入回車鍵時(shí)才返回。
getche()函數(shù)和getch()函數(shù)的共同點(diǎn)是每次按鍵后字符被立即送往程序并立即輸出相應(yīng)的結(jié)果,不再需要行緩沖。不同的是在接收字符時(shí),getch()函數(shù)在屏幕上不回顯鍵入的字符,而getche()函數(shù)向屏幕回顯鍵入的字符。在交互式程序中,當(dāng)需要從鍵盤輸入字符時(shí),常用getch()或getche()來代替getchar()進(jìn)行字符輸入。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系233.5.3for語句在C語言中,還提供了更為靈活、更為常用的for語句,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以取代while語句。它的一般形式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句
它的執(zhí)行過程如下:①先求解表達(dá)式1。②求解表達(dá)式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行第③步;若其值為假(0),則結(jié)束循環(huán),執(zhí)行for語句下面的一個(gè)語句。③解表達(dá)式3,轉(zhuǎn)回上面第②步繼續(xù)執(zhí)行。其執(zhí)行過程可用圖3-14表示。從for語句的執(zhí)行過程可以看出,for語句與while語句是完全等價(jià)的,對(duì)于for循環(huán)中語句的一般形式,就是如下的while循環(huán)形式:表達(dá)式1;
while(表達(dá)式2)
{語句;表達(dá)式3;}for語句最簡(jiǎn)單的應(yīng)用形式也是最容易理解的形式如下:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語句
#include<stdio.h>main(){inti=1,n;/*定義i和n變量,并為i賦初值*/longintfac=1;printf(“Pleaseinputn:”);scanf(“%d”,&n);/*輸入n值*/while(i<=n)/*先判斷后執(zhí)行,循環(huán)n次。本行為循環(huán)控制部分*/{fac=fac*i;/*做累乘運(yùn)算*/i++;/*累乘次數(shù)計(jì)數(shù)器加1。本行為循環(huán)條件的修改語句*/}printf(“%ld\n”,fac);}
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系24例題3-19用for語句求n!=1*2*3*…*n的值#include<stdio.h>main(){inti,n;/*定義i和n變量*/longintfac=1;printf(“Pleaseinputn:”)scanf(“%d”,&n);/*輸入n值*/for(i=1;i<=n;i++)/*先判斷后執(zhí)行,循環(huán)n次*/{fac=fac*i;/*做累乘運(yùn)算*/}printf("%ld\n",fac);/*以長(zhǎng)整型格式輸出n的階乘值*/}
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系25for語句的使用說明(1)在for語句中任何表達(dá)式都可以缺省,但分號(hào)“;”不能缺省。缺省部分的功能,可以由其他的語句來完成。
用前面例子的for語句:for(fac=1,i=1;i<=n;i++)fac=fac*i;為例,說明如下幾種等價(jià)的缺省形式;①省略了初始化表達(dá)式,表示在for語句中不對(duì)循環(huán)控制變量賦初值??筛膶憺椋篺ac=1;i=1;for(;i<=n;i++)fac=fac*i;
(2)表達(dá)式1和表達(dá)式3既可以是一個(gè)簡(jiǎn)單表達(dá)式也可以是逗號(hào)表達(dá)式。
for(i=0,j=100;i<=100;i++,j--)k=i+j;(3)表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非零,就執(zhí)行循環(huán)體。例如:
for(i=0;(c=getchar())!=‘\n’;i+=c);又如:
for(;(c=getchar())!=‘\n’;) printf(“%c”,c);(4)循環(huán)體語句可以為空語句,此時(shí)也稱為空循環(huán)。如把上面第(1)點(diǎn)中的for語句改為:for(fac=1,i=1;i<=n;fac=fac*i,i++);
空循環(huán)還常用來產(chǎn)生延時(shí),以達(dá)到某種特定要求。如:for(t=0;t<time;t++);
由于循環(huán)體為空語句,所以上面的循環(huán)只做了一件事,就是將循環(huán)變量從0增加到設(shè)定的數(shù)time,然后退出循環(huán),讓循環(huán)變量空循環(huán)了time次,占用了一定時(shí)間,起到了延時(shí)的作用。②省略了循環(huán)條件表達(dá)式,則不做其它處理時(shí)便成為死循環(huán)。例如:
for(fac=1,i=1;;i++)fac=fac*i;可改寫為:
for(fac=1,i=1;;i++){if(i>n)break;/*用break來強(qiáng)迫退出循環(huán)*/fac=fac*i;}③省略了變量增值表達(dá)式,則不對(duì)循環(huán)控制變量進(jìn)行操作??筛膶憺椋篺or(fac=1,i=1;i<=n;){fac=fac*i;i++;}④3個(gè)表達(dá)式中同時(shí)省略其中2個(gè)或3個(gè)都省略的情況?
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系26例題3-20
[例3-20]求斐波納契(Fibonacci)數(shù)列:1,1,2,3,5,8,13,……的前四十個(gè)數(shù),這個(gè)數(shù)列有如下特點(diǎn):前兩個(gè)數(shù)都為1,從第3個(gè)數(shù)開始,每一個(gè)數(shù)是其前面兩個(gè)數(shù)之和。即:
F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n>=3)
法一:根據(jù)斐波納契數(shù)列的規(guī)律,可以畫出如圖3-15的求解過程:這是一種遞推算法,應(yīng)采用循環(huán)實(shí)現(xiàn)。設(shè)變量f1、f2和f,并為f1和f2賦初值1,令f=f1+f2得到第3項(xiàng);將f1←f2,f2←f,再求f=f1+f2得到第4項(xiàng);依此類推求第5項(xiàng)、第6項(xiàng)…,程序流程圖如圖3-16所示。#include<conio.h>#include<stdio.h>main(){longintf,f1,f2;inti;clrscr();/*清屏函數(shù)*/f1=f2=1;printf("%12ld%12ld",f1,f2);for(i=3;i<=40;i++){f=f1+f2;f1=f2;f2=f;printf("%12ld",f);if(i%4==0)printf("\n")/*控制一行輸出4個(gè)數(shù)*/}}
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系27方法二:法二:根據(jù)斐波納契數(shù)列的規(guī)律,還可以畫出如圖3-17的求解過程:源程序如下:#include<stdio.h>main(){longintf1,f2;inti;clrscr();f1=f2=1;for(i=1;i<=20;i++)/*每循環(huán)一次輸出2個(gè)數(shù),共需循環(huán)20次*/{printf("%12ld%12ld",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+f1;}}運(yùn)行結(jié)果為:1123581321345589144233377610987159725844181676510946177112865746368750251213931964183178115142298320401346269217830935245785702887922746514930352241578173908816963245986102334155
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系
for語句注意事項(xiàng):例:計(jì)算1*2+3*4+5*6+…+99*100。
inti,j;longsum=0;for(i=1,j=2;i<=99;i=i+2,j=j+2)sum+=i*j;printf("sum=%ld\n",sum);
(1)表達(dá)式1、表達(dá)式2、和表達(dá)式3可以是任何類型的表達(dá)式。比方說,這三個(gè)表達(dá)式都可以是逗號(hào)表達(dá)式,即每個(gè)表達(dá)式都可由多個(gè)表達(dá)式組成。
逗號(hào)表達(dá)式逗號(hào)表達(dá)式
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系#include<stdio.h>voidmain(){inti,sum=0;i=1;for(;i<=100;i++)sum+=i;printf("sum=%d\n",sum);}#include<stdio.h>voidmain(){inti,sum=0;i=1;for(;i<=100;)sum+=i++;printf("sum=%d\n",sum);}省掉表達(dá)式1,3省掉表達(dá)式1
(2)表達(dá)式1、表達(dá)式2、和表達(dá)式3都是任選項(xiàng),可以省掉其中的一個(gè)、兩個(gè)或全部,但其用于間隔的分號(hào)是一個(gè)也不能省的。#include<stdio.h>voidmain(){inti,sum=0;i=1;for(;;){if(i>100)break;sum+=i++;}printf("sum=%d\n",sum);}省掉表達(dá)式1,2,3
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系for(a=1;;a++)printf("&d\n",a);
(3)表達(dá)式2如果為空則相當(dāng)于表達(dá)式2的值是真。死循環(huán)!
(4)循環(huán)體中的語句可為任意類型的C語句。
(5)for語句也可以組成多重循環(huán),而且也可以和while語句和do-while語句相互嵌套。
(6)循環(huán)體可以是空語句。例:計(jì)算用戶輸入的字符數(shù)(當(dāng)輸入是回車符時(shí)統(tǒng)計(jì)結(jié)束)。
#include<stdio.h>voidmain(){intn=0;printf("inputastring:\n");for(;getchar()!='\n';n++);
printf("%d",n);}表示循環(huán)體為空語句,并非表示for語句結(jié)束
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系313.5.4循環(huán)的嵌套一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套。三種循環(huán)(whi1e循環(huán)、do-whi1e循環(huán)和for循環(huán))可以互相嵌套。利用循環(huán)的嵌套可以來解決相對(duì)比較復(fù)雜的問題,如矩陣的運(yùn)算,二維圖形的打印等。
嵌套循環(huán)執(zhí)行時(shí),先由外層循環(huán)進(jìn)入內(nèi)層循環(huán),即外層循環(huán)執(zhí)行一次,內(nèi)層循環(huán)從頭到尾執(zhí)行一遍。并在內(nèi)層循環(huán)終止之后接著執(zhí)行外層循環(huán),再由外層循環(huán)進(jìn)入內(nèi)層循環(huán),當(dāng)外層循環(huán)全部終止時(shí),程序結(jié)束。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系32例題3-21演示嵌套循環(huán)的執(zhí)行過程#include<stdio.h>main(){inti,j;for(i=0;i<3;i++)/*i控制外循環(huán)執(zhí)行3次*/{printf("i=%d:",i);for(j=0;j<4;j++)/*j控制內(nèi)循環(huán)執(zhí)行4次*/ printf("j=%-4d",j);printf("\n");}}運(yùn)行結(jié)果如下:i=0:j=0j=1j=2j=3i=1:j=0j=1j=2j=3i=2:j=0j=1j=2j=3請(qǐng)觀察語句:printf(“j=%-4d”,j);的執(zhí)行次數(shù)。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系33例題3-22編程序,輸出以下圖形。****************
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系34例題3-22#include<conio.h>#include<stdio.h>main(){inti,j;clrscr();for(i=1;i<=4;i++){for(j=1;j<=i;j++) printf("");for(j=1;j<=8-(2*i-1);j++)printf("*");printf("\n");}}
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系353.5.5三種循環(huán)的比較三種循環(huán)都可用來解決同一問題,一般情況下可以互相代替。1.while和do-whi1e循環(huán),只在while后面指定循環(huán)條件,在循環(huán)體中包含應(yīng)反復(fù)執(zhí)行的操作語句,包括使循環(huán)趨于結(jié)束的語句(如:i++或i+=1等)。
for循環(huán)可以在表達(dá)式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達(dá)式3中。因此for語句的功能更強(qiáng),凡用while循環(huán)能完成的,用for循環(huán)都能實(shí)現(xiàn)。
2.用while和do-while循環(huán)時(shí),循環(huán)變量初始化的操作應(yīng)在while和do-whi1e語句之前完成。而for語句可以在表達(dá)式1中實(shí)現(xiàn)循環(huán)變量的初始化。3.while和for循環(huán)是先判斷表達(dá)式,后執(zhí)行語句;而do-while循環(huán)是先執(zhí)行語句,后判斷表達(dá)式。4.對(duì)while循環(huán)、do-while循環(huán)和for循環(huán),可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán)。
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系
3.5.6流程控制語句
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系break語句功能:在循環(huán)語句和switch語句中,終止并跳出循環(huán)體或開關(guān)體說明:(1)break不能用于循環(huán)語句和switch語句之外的任何其它語句之中。(2)break只能終止并跳出最近一層的結(jié)構(gòu)。while(表達(dá)式1){
……if(表達(dá)式2)break;……}語句……do{
……if(表達(dá)式2)break;……}while(表達(dá)式1);語句……for(;表達(dá)式1;){……if(表達(dá)式2)break;……}語句……
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系38例題3-23編程判斷從鍵盤輸入的自然數(shù)m(大于1)是不是素?cái)?shù)。素?cái)?shù)(質(zhì)數(shù))是指除了1和它本身外,沒有其他因子的大于1的數(shù)。程序的流程圖如圖3-20所示。#include<stdio.h>#include<math.h>main(){intm,i,k;printf("Inputm(>1):");scanf("%d",&m);k=sqrt(m);/*取m的算術(shù)平方根*/for(i=2;i<=k;i++)/*用2、3、…、k去試*/if(m%i==0)break;/*若找到因子提前退出循環(huán)*/if(i>=k+1)printf("%disaprimenumber\n",m);/*若i>=k+1,表明循環(huán)正常結(jié)束,即沒找到因子*/elseprintf("%disnotaprimenumber\n",m);/*若i<=k,表明循環(huán)提前結(jié)束,即有找到因子*/}
運(yùn)行結(jié)果如下:Inputm(>1):3030isnotaprimenumberInputm(>1):1919isaprimenumber
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系continue語句功能:結(jié)束本次循環(huán),跳過循環(huán)體中尚未執(zhí)行的語句,進(jìn)行下一次是否執(zhí)行循環(huán)體的判斷。說明:(1)僅用于循環(huán)語句中。(2)在嵌套循環(huán)的情況下,continue語句只對(duì)包含它的最內(nèi)層的循環(huán)體語句起作用。for(…){while(…){……if(…)continue;……}while循環(huán)后的第一條語句}
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系continue語句while(…){
…………continue;
…………}while(…){
…………
break;
…………}跳出整個(gè)循環(huán)繼續(xù)下一次循環(huán)
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系41例題3-24
輸出所有的“水仙花數(shù)”,所謂“水仙花數(shù)”是指一個(gè)三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如,153是“水仙花數(shù)”,因?yàn)?53=13+53+33
。
#include<stdio.h>main(){inti,j,k,n;printf("narcissusnumbersare:");for(n=100;n<=999;n++){i=n/100;j=n/10-i*10;k=n%10;if(n!=i*i*i+j*j*j+k*k*k)continue; printf("%d",n);}printf("\n");}運(yùn)行結(jié)果如下:narcissusnumbersare:153370371407說明:本例中的兩個(gè)語句:if(n!=i*i*i+j*j*j+k*k*k)continue;printf(“%d”,n);可以改用if語句完成:if(n==i*i*i+j*j*j+k*k*k)printf(“%d”,n);
事實(shí)上,continue語句的功能常??梢杂善渌恼Z句來代替實(shí)現(xiàn)。根據(jù)continue語句的功能:if(條件A)continue;
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度三人合伙開展區(qū)塊鏈技術(shù)研究合同
- 《戈雷茨基《第二弦樂四重奏》的結(jié)構(gòu)組織》
- 《基于陣列聲波測(cè)井信號(hào)的儲(chǔ)層識(shí)別研究》
- 2024年房屋建設(shè)施工合同
- 《基于EVA的ZC物流公司業(yè)績(jī)?cè)u(píng)價(jià)研究》
- 2024部編人教版《道德與法治》六年級(jí)下冊(cè)教學(xué)計(jì)劃含教學(xué)進(jìn)度(錦集7篇)
- 《縱向壟斷協(xié)議的反壟斷法規(guī)制研究》
- 《LS銀行信貸風(fēng)險(xiǎn)管理研究》
- 《青年形象媒介框架的共鳴效力研究》
- 《民事訴訟證人作證制度研究》
- 平陽港區(qū)西灣作業(yè)區(qū)防浪導(dǎo)流堤工程海域使用論證報(bào)告書
- 管道保溫計(jì)算公式
- 錄音行業(yè)的就業(yè)生涯發(fā)展報(bào)告
- 報(bào)廢汽車拆解工藝流程
- 生化報(bào)告解讀
- 胃癌科普講座課件
- 熔煉車間工安全培訓(xùn)
- 《多彩的職業(yè)》參考課件
- 醫(yī)用放射儀器的工作原理
- 抖音傳媒管理制度
- 家畜繁殖學(xué)課件
評(píng)論
0/150
提交評(píng)論