




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
*第1頁循環(huán)語句概述問題:求1~100的累計(jì)和。依據(jù)已有的學(xué)問,可以用“1+2+……+100”來求解,但明顯很繁瑣?,F(xiàn)在換個思路來考慮:首先設(shè)置一個累計(jì)器sum,其初值為0,利用sum=sum+i來計(jì)算(i依次取1、2、……、100),只要解決以下3個問題即可:
(1)將i的初值置為1;
(2)每執(zhí)行1次“sum=sum+i”后,i增1;
(3)當(dāng)n增到101時,停止計(jì)算。此時,sum的值就是1~100的累計(jì)和。
*第2頁依據(jù)已有的學(xué)問,單獨(dú)實(shí)現(xiàn)每一步都不難。但是,由于須要常常運(yùn)用這種重復(fù)計(jì)算結(jié)構(gòu)(稱為循環(huán)結(jié)構(gòu)),C語言供應(yīng)了循環(huán)語句來實(shí)現(xiàn),以簡化、并規(guī)范循環(huán)結(jié)構(gòu)程序設(shè)計(jì)。在C語言中,可用以下語句實(shí)現(xiàn)循環(huán):(1)用for語句。(2)用do-while語句。(3)用while語句。*第3頁§5.1for語句
循環(huán)的意思就是讓程序重復(fù)地執(zhí)行某些語句。C語言供應(yīng)的循環(huán)結(jié)構(gòu)有三種:for語句、while語句和do_while語句。for語句既可以用于循環(huán)次數(shù)已知的狀況,也可用于循環(huán)次數(shù)預(yù)先不知道的狀況。for語句的一般形式為:
for(<初始表達(dá)式>);<條件表達(dá)式>;<循環(huán)表達(dá)式>)
<循環(huán)體語句>*第4頁功能:先計(jì)算<初始表達(dá)式>的值,然后推斷<條件表達(dá)式>的值,若該值為“假”,則退出循環(huán),執(zhí)行循環(huán)體下面的語句;若該值為“真”,則執(zhí)行<循環(huán)體語句>,然后計(jì)算<循環(huán)表達(dá)式>的值,再推斷<條件表達(dá)式>的值,重復(fù)以上的操作。for語句的流程圖如圖:一般狀況下,<循環(huán)體語句>是由一對花括括起來的復(fù)合語句。*第5頁for循環(huán)語句留意:①<初始表達(dá)式>可以省略,但須保留分號(;),同時在for之前必需給循環(huán)變量賦值,如:i=1;for(;i<=100;i++)sum=sum+i;②<條件表達(dá)式>一般不行省略,否則為無限循環(huán)。如:for(i=1;;i++)sum=sum+i;相當(dāng)于條件總為真,程序會始終不停的執(zhí)行直到“數(shù)據(jù)溢出”。*第6頁③<循環(huán)表達(dá)式>亦可省略,但在循環(huán)語句體中必需有語句來修改循環(huán)變量,以使條件表達(dá)式的值在某一時刻為0,從而能正常結(jié)束循環(huán)。如:for(sum=0,i=1;i<=100;){sum=sum+i;i++;}④三個表達(dá)式均省略,即for(;;),為無限循環(huán),程序中要避開這種狀況的發(fā)生。⑤條件表達(dá)式可以是關(guān)系表達(dá)式、數(shù)值表達(dá)式。只要表達(dá)式的值0。就執(zhí)行循環(huán)語句。如:for(i=0;(c=getchar())!=‘\n’;i+=c);*第7頁⑥初始表達(dá)式、循環(huán)表達(dá)式可以是逗號表達(dá)式如:for(sum=0,i=1;i<=100;i++,i++)相當(dāng)于:sum=0;for(i=1;i<=100;i=i+2)⑦for循環(huán)也可以嵌套,執(zhí)行時是由外向里,逐層進(jìn)行,先執(zhí)行外層循環(huán),再進(jìn)入內(nèi)層循環(huán);退出時相反,由里向外逐層退出,先退出內(nèi)層循環(huán),然后退到上一層循環(huán)。【例5-2】隨意從鍵盤輸入兩個整數(shù)a、b(a<b),求它們之間的幾何級數(shù)的和,數(shù)學(xué)表達(dá)式為。*第8頁這個問題與例5-1類似,只是所求級數(shù)和的初值和終值不一樣,是由鍵盤隨意輸入的,為避開計(jì)算機(jī)錯誤,要求初值a要小于終值b。算法流程圖如右圖:*第9頁/*exam5_2.c求幾何級數(shù)的和*/#include<stdio.h>main(){ inti,j,a,b,sum=0; printf("Pleaseinputtwonumber:\n"); scanf("a=%d,b=%d",&a,&b); i=a;j=b; if(a>b) {i=b;j=a;} for(;i<=j;i++) sum=sum+i; printf("sum=%d\n",sum);}*第10頁【例5-3】編寫一個程序,在屏幕上打印出具有8行7列的如下圖案:這是一個很有規(guī)律的圖案,可接受二重循環(huán)嵌套的方式:第1層限制行數(shù),第2層限制列數(shù)。算法流程圖如下圖:*第11頁/*exam5_3.c打印圖案*/#include<stdio.h>main(){ inti,j; for(i=1;i<=8;i++) { for(j=1;j<=7;j++) printf("*"); printf("\n"); }}*第12頁§5.2while語句
While語句也是一種用于產(chǎn)生循環(huán)動作的語句,一般形式為:while(<表達(dá)式>)
<循環(huán)體語句>功能:先計(jì)算<表達(dá)式>的值,若該值為“假”,則跳出循環(huán),執(zhí)行循環(huán)體后面的語句;若該值為“真”,則執(zhí)行<循環(huán)體語句>,然后回過頭來再檢查<表達(dá)式>的值,重復(fù)以上的操作。while語句的流程圖*第13頁<循環(huán)語句體>:是用一對花括號括起來的復(fù)合語句。留意:在<循環(huán)語句體>中要有使<表達(dá)式>的值為假(或<表達(dá)式>的值為零)的語句,否則會使程序出現(xiàn)無限循環(huán)而發(fā)生錯誤。留意:由于while循環(huán)是先推斷<表達(dá)式>的值,后確定是否執(zhí)行<循環(huán)語句>,因此,有可能一次也不執(zhí)行<循環(huán)語句>。*第14頁【例5-4】將例5-1用while語句重寫,求簡潔幾何級數(shù)的和。/*exam5_4.c用while求簡潔幾何級數(shù)的和*/#include<stdio.h>main(){ inti=1,sum=0; while(i<=100) { sum=sum+i; i++; } printf("sum=%d\n",sum);}程序運(yùn)行結(jié)果:sum=5050*第15頁【例5-5】輸入一個正整數(shù)n,求n!。計(jì)算表達(dá)式:n!=n*(n-1)*(n-2)*…*2*1。用i代表循環(huán)變量,s代表n!的結(jié)果值。編程時既可以接受for循環(huán),也可以接受while循環(huán)求隨意正整數(shù)n的階乘的算法流程圖如圖:*第16頁/*exam5_5.cwhile應(yīng)用:求n!*/#include<stdio.h>main(){ inti,n;longs; printf("pleaseenterainteger:\n"); scanf("%d",&n); if(n>=0) { s=1;
i=1;
while(i<=n) { s=s*i; i++; } printf("%d!=%ld",n,s); } else printf("Invalidinput!");}試改為for循環(huán)?*第17頁while和for的比較for(i=1;i<=10;i++)
sum=sum+i;i=1;循環(huán)變量賦初值while(i<=10){循環(huán)條件sum=sum+i;i++;循環(huán)變量的變更}循環(huán)體*第18頁例5-6從鍵盤輸入一批學(xué)生的成果,計(jì)算平均分。分析:求累加和確定循環(huán)條件不知道輸入數(shù)據(jù)的個數(shù),無法事先確定循環(huán)次數(shù)用一個特殊的數(shù)據(jù)作為正常輸入數(shù)據(jù)的結(jié)束標(biāo)記,比如選用一個負(fù)數(shù)作為結(jié)束標(biāo)記。*第19頁#include<stdio.h>Intmain(void){intnum; doublegrade,total; num=0;total=0; printf(“Entergrades:\n"); scanf("%lf",&grade);/*輸入第1個數(shù)*/
while(grade>=0){/*輸入負(fù)數(shù),循環(huán)結(jié)束*/
total=total+grade; num++;scanf(“%lf”,&grade); } if(num!=0)printf(“Gradeaverageis%.2f\n",total/num); elseprintf("Gradeaverageis0\n");return0;}Entergrades:6788735482-1Gradeaverageis72.80Entergrades:-16788735482Gradeaverageis0*第20頁§5.3do~while語句
do_while語句是另一種用于產(chǎn)生循環(huán)動作的語句。一般形式為:do{<循環(huán)體語句>}while(<表達(dá)式>);功能:先執(zhí)行一次<循環(huán)體語句>,然后計(jì)算<表達(dá)式>的值,若該值為“真”,則重復(fù)以上的操作,直到該值為“假”,則退出循環(huán)語句,執(zhí)行下一條語句。do_while語句的流程圖:*第21頁<循環(huán)語句體>應(yīng)當(dāng)是用一對花括號括起來的復(fù)合語句。留意:要有可以使<表達(dá)式>的值為“假”(即<表達(dá)式>的值等于零)的語句,否則會使程序出現(xiàn)無限循環(huán)而發(fā)生錯誤。do_while循環(huán)與while循環(huán)的區(qū)分,不論狀況怎樣,do_while循環(huán)中的<循環(huán)語句體>至少會執(zhí)行一次。*第22頁【例5-7】將例5-6用do_while語句重寫。*第23頁#include<stdio.h>Intmain(void){intnum; doublegrade,total; num=0;total=0;do {
printf(“Entergrades:");scanf(“%lf”,&grade);total=total+grade; num++; }while(grade>=0);/*輸入負(fù)數(shù),循環(huán)結(jié)束*/printf(“Gradeaverageis%.2f\n",(total+1)/(num-1)); return0;}Entergrades:6788735482-1Gradeaverageis72.80Entergrades:-16788735482Gradeaverageis0*第24頁【例5-8】求sin(x)=x-x3/3!+x5/5!-x7/7!+…直到最終一項(xiàng)確定值小于le-7(即10-7)為止。分析:多項(xiàng)式從其次項(xiàng)起,每一項(xiàng)都是前一項(xiàng)乘以一個因子,(-x2)/(n*(n-1))(n=3,5,7,9……)用s代表sin(x)的值,t代表每一項(xiàng)的值,則:t=t*(-x2)/(n*(n-1));s=s+t;x的值是用弧度值表示的(10=/180弧度),如:3000.523598775算法流程圖如后圖:*第25頁*第26頁/*exam5_8.c求sin(x)的值*/#include<stdio.h>#include<math.h>main(){ doubles,t,x; intn=1; scanf("%lf",&x); t=x; s=x; do {
n=n+2; t=t*(-x*x)/(n*(n-1)); s=s+t; }while(fabs(t)>=1e-7); printf("sin(%lf)=%lf\n",x,s);}程序運(yùn)行結(jié)果:1.57sin(1.570000)=1.000000
*第27頁while是先判別條件,再確定是否循環(huán);do-while是先至少循環(huán)一次,然后再依據(jù)循環(huán)的結(jié)果確定是否接著循環(huán)。while和do-while的比較真假表達(dá)式循環(huán)體語句do-while的下一條語句真假while的下一條語句表達(dá)式循環(huán)體語句*第28頁
循環(huán)語句的選擇if(循環(huán)次數(shù)已知) 運(yùn)用for語句else /*循環(huán)次數(shù)未知*/ if(循環(huán)條件在進(jìn)入循環(huán)時明確) 運(yùn)用while語句 else /*循環(huán)條件須要在循環(huán)體中明確*/ 運(yùn)用do-while語句*第29頁§5.4
用于循環(huán)中的break和continue語句
一、break語句break語句的作用是從一種限制結(jié)構(gòu)中跳出來。break語句可用于循環(huán)結(jié)構(gòu),其作用是從本層循環(huán)結(jié)構(gòu)中跳出,可以提前結(jié)束執(zhí)行<循環(huán)語句體>,執(zhí)行循環(huán)結(jié)構(gòu)外的下一條語句。break語句的一般形式為:break;
break語句在循環(huán)語句體中的位置應(yīng)依據(jù)程序的須要而定,一般是用在循環(huán)體內(nèi)某一個if條件分支的語句中,用來表示在循環(huán)過程中當(dāng)某一個條件成立時提前結(jié)束循環(huán)。*第30頁程序解析-推斷素?cái)?shù)算法:除了1和m,不能被其它數(shù)整除。設(shè)i取值[2,m-1]假如m不能被該區(qū)間上的任何一個數(shù)整除,即對每個i,m%i都不為0,則m是素?cái)?shù)只要找到一個i,使m%i為0,則m確定不是素?cái)?shù)m%2%3%4%5%(m-1)不是素?cái)?shù)||==0==0是素?cái)?shù)&&!=0!=0m不行能被大于m/2的數(shù)整除i取值[2,m-1]、[2,m/2]、[2,]for(i=2;i<=m/2;i++)if(m%i==0)break;if(i>m/2)printf("yes\n")elseprintf("no\n”);*第31頁intmain(void){inti,m; printf(“Enteranumber:"); scanf("%d",&m); for(i=2;i<=m/2;i++) if(m%i==0)break; if(i>m/2)printf("%disaprimenumber!\n",m); elseprintf("No!\n"); }源程序-推斷素?cái)?shù)Enteranumber:9NoEnteranumber:1111isaprimenumber!循環(huán)條件?循環(huán)的結(jié)束條件?*第32頁break語句while(exp){
語句1if(expb)break;
語句2}真假
exp
語句1假
expb
語句2循環(huán)體真for(i=2;i<=m/2;i++) if(m%i==0)break;if(i>m/2)printf("Yes");elseprintf("No!\n");當(dāng)循環(huán)有多個出口時:表示循環(huán)條件區(qū)分結(jié)束條件for(i=2;i<=m/2;i++)if(m%i==0){printf("No!\n");break;}printf("Yes");*第33頁二、Continue語句Continue語句只適用于循環(huán)結(jié)構(gòu),其一般形式為:作用:提前結(jié)束本次循環(huán),提前進(jìn)行下一次循環(huán)?!纠?-10】編寫程序,打印100-200中不能被3整除的數(shù)。/*exam5_10.c求不能被3整除的數(shù)*/#include<stdio.h>main(){ intn; for(n=100;n<=200;n++) { if(n%3==0) continue; printf("%d\t",n); }}*第34頁算法流程圖如圖:要精確地運(yùn)用break語句和continue語句,除非有必要,否則若可以不用則盡量不接受break語句和continue語句。*第35頁對于例5-10的問題,打印100-200中不能被3整除的數(shù)。不接受continue語句的算法流程圖如圖所示:*第36頁/*exam5q10.c例5-10問題不用continue*/#include<stdio.h>
main(){ intn; for(n=100;n<=200;n++) if(n%3
!=0)/*n不能被3整除*/
printf("%d",n); }*第37頁【例5-11】break語句和continue語句在程序中的區(qū)分/*exam5_11.cbreak的作用*/#include<stdio.h>main(){ intx; for(x=1;x<=10;++x) { if(x==5) break; printf("%d",x); }}運(yùn)行結(jié)果:1,2,3,4,/*exam5q11.ccontinue的作用*/#include<stdio.h>main(){intx; for(x=1;x<=10;++x) { if(x==5) continue; printf("%d,",x); }}運(yùn)行結(jié)果:1,2,3,4,6,7,8,9,10,*第38頁§5.5循環(huán)結(jié)構(gòu)的嵌套
循環(huán)結(jié)構(gòu)的嵌套,指的是某一種循環(huán)結(jié)構(gòu)的語句中,包含有另一個循環(huán)結(jié)構(gòu)。
運(yùn)用嵌套的結(jié)構(gòu)時,要留意嵌套的層次,不能交叉。例5.12
求1!+2!+….+100!*第39頁嵌套循環(huán)for(i=1;i<=100;i++){item=i!sum=sum+item;}for(i=1;i<=100;i++){
item=1; for(j=1;j<=i;j++) item=item*j;sum=sum+item;}*第40頁例4-6源程序#include<stdio.h>intmain(void){ inti,j; doubleitem,sum;/*item存放階乘*/ sum=0;for(i=1;i<=100;i++){item=1;/*每次求階乘都從1起先*/ for(j=1;j<=i;j++) /*內(nèi)層循環(huán)算出item=i!*/ item=item*j; sum=sum+item; } printf("1!+2!+3!+…+100!=%e\n",sum);}*第41頁內(nèi)層循環(huán)的初始化for(i=1;i<=100;i++){
item=1;
for(j=1;j<=i;j++) item=item*j;sum=sum+item;}求1!+2!+….+100!item=1;for(i=1;i<=100;i++){for(j=1;j<=i;j++)item=item*j;sum=sum+item;}求1!+1!*2!+……+1!*2!*……*100!?*第42頁分析嵌套循環(huán)的執(zhí)行過程for(i=1;i<=100;i++){item=1;
for(j=1;j<=i;j++) item=item*j;sum=sum+item;}外層循環(huán)變量i的每個值內(nèi)層循環(huán)變量j變更一個輪次;內(nèi)外層循環(huán)變量不能相同分別用i和j*第43頁for(i=1;i<=100;i++)for(j=1;j<=i;j++) printf("%d%d\n",i,j);*第44頁§5.6goto語句
goto語句是一種無條件轉(zhuǎn)向語句,它可以用在程序的任何地方,其一般形式為:goto語句標(biāo)號;“語句標(biāo)號”為任何合法的標(biāo)識符,放在某個語句前面并加上冒號“:”作為語句的標(biāo)號,標(biāo)號只對goto語句有意義,帶有標(biāo)號的語句被稱作標(biāo)號語句。如:error:、end:、exp:等均為合法的語句的標(biāo)號。goto語句的作用:轉(zhuǎn)到標(biāo)號語句所在的地方接著執(zhí)行。*第45頁【例5-13】用if語句和goto語句組合構(gòu)成的循環(huán)重寫計(jì)算器的程序。/*exam5_13.cif+goto構(gòu)成循環(huán)*/#include<stdio.h>main(){ inti,sum=0; i=1;
loop:if(i<=100) { sum=sum+i; i++;
gotoloop; } printf("sum=%d",sum);}程序運(yùn)行結(jié)果:sum=5050goto語句是一種非結(jié)構(gòu)化的語句,在程序設(shè)計(jì)中應(yīng)盡量少用或不用goto語句。
*第46頁§5.7程序范例
【例5-16】打印出ASCⅡ碼序列中從33~127(十進(jìn)制)的字符比照表。/*exam5_16.c打印部分ASCII碼字符*/#include<stdio.h>main(){ inti; for(i=33;i<128;i++) { printf("%d---%c\t",i,i); }}*第47頁【例5-17】設(shè)公雞每只5元,母雞每只3元,小雞每元3只,現(xiàn)用100元錢買100只雞,編寫一個程序,算出可以各買多少只雞?#include<stdio.h>main(){inti,j,k;for(i=0;i*5<=100;i++)for(j=0;j*3<=100;j++)for(k=0;k/3<=100;k+=3) if((i*5+j*3+k/3)==100&&(i+j+k)==100)printf("Cock-%d\tHen-%d\tChicken-%d\n",i,j,k);}*第48頁程序運(yùn)行結(jié)果:Cock--0Hen--25Chicken--75Cock--4Hen--18Chicken--78Cock--8Hen--11Chicken--81Cock--12Hen--4Chicken--84*第49頁小結(jié):三種循環(huán)結(jié)構(gòu):for、while和do_while循環(huán)。當(dāng)循環(huán)次數(shù)是確定的狀況下,用for循環(huán)比較便利。while循環(huán)和for循環(huán)都要先推斷條件再執(zhí)行循環(huán)語句體,因此,有可能一次也不執(zhí)行循環(huán)語句體。do_while循環(huán)不論怎樣都會先執(zhí)行一次循環(huán)語句體。留意避開以下幾個方面的問題:1.循環(huán)語句體為復(fù)合語句,但沒有運(yùn)用花括號。2.使程序發(fā)生無限循環(huán)。3.混淆break語句與continue語句的功能。*第50頁循環(huán)程序設(shè)計(jì)循環(huán)程序的實(shí)現(xiàn)要點(diǎn):歸納出哪些操作須要反復(fù)執(zhí)行?循環(huán)體這些操作在什么狀況下重復(fù)執(zhí)行?循環(huán)條件選用合適的循環(huán)語句forwhiledo-while循環(huán)具體實(shí)現(xiàn)時考慮(循環(huán)條件):事先給定循環(huán)次數(shù),首選for通過其他條件限制循環(huán),考慮while或do-while*第51頁#include<stdio.h>intmain(void){inti,mark,max,n;printf("Entern:");scanf("
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度民辦學(xué)校教職工校企合作與產(chǎn)學(xué)研用合同
- 冷庫租賃與冷鏈物流信息化管理服務(wù)協(xié)議2025
- 二零二五年度個人委托代付款安全無憂服務(wù)合同
- 2025年西安貨運(yùn)從業(yè)資格考試題目大全及答案
- 2025年巴彥淖爾貨運(yùn)從業(yè)資格證模擬考試題
- 如何堅(jiān)守誠信發(fā)言稿
- 后勤學(xué)院辦公樓保潔協(xié)議
- 小紅書品牌賬號年度運(yùn)營規(guī)劃與服務(wù)合同
- 孔雀東南飛民間故事解讀:初中語文課程教案
- 農(nóng)業(yè)生產(chǎn)三農(nóng)村公共空間設(shè)計(jì)與治理
- 12j912-2常用設(shè)備用房
- 農(nóng)貿(mào)市場保安工作總結(jié)
- 聲學(xué)設(shè)計(jì)音響合同
- 2024年湖南長沙自貿(mào)投資發(fā)展集團(tuán)有限公司招聘筆試沖刺題(帶答案解析)
- 醫(yī)院醫(yī)務(wù)人員聘用簡單合同范本
- JBT 14714-2024 鋰離子電池X射線檢測設(shè)備(正式版)
- DL-T1362-2014輸變電工程項(xiàng)目質(zhì)量管理規(guī)程
- 金融知識普及
- (100題)2024時事政治考試題庫
- 新概念英語第二冊-Lesson18-同步習(xí)題含答案
- 中國兒童幽門螺桿菌感染診治專家共識2022
評論
0/150
提交評論