C語言循環(huán)結(jié)構(gòu)_第1頁
C語言循環(huán)結(jié)構(gòu)_第2頁
C語言循環(huán)結(jié)構(gòu)_第3頁
C語言循環(huán)結(jié)構(gòu)_第4頁
C語言循環(huán)結(jié)構(gòu)_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

會計學1C語言循環(huán)結(jié)構(gòu)02:20第2頁根據(jù)已有的知識,單獨實現(xiàn)每一步都不難。但是,由于需要經(jīng)常使用這種重復計算結(jié)構(gòu)(稱為循環(huán)結(jié)構(gòu)),C語言提供了循環(huán)語句來實現(xiàn),以簡化、并規(guī)范循環(huán)結(jié)構(gòu)程序設計。在C語言中,可用以下語句實現(xiàn)循環(huán):(1)用for語句。(2)用do-while語句。(3)用while語句。第1頁/共53頁02:20第3頁§5.1for語句

循環(huán)的意思就是讓程序重復地執(zhí)行某些語句。C語言提供的循環(huán)結(jié)構(gòu)有三種:for語句、while語句和do_while語句。for語句既可以用于循環(huán)次數(shù)已知的情況,也可用于循環(huán)次數(shù)預先不知道的情況。for語句的一般形式為:

for(<初始表達式>);<條件表達式>;<循環(huán)表達式>)

<循環(huán)體語句>第2頁/共53頁02:20第4頁功能:先計算<初始表達式>的值,然后判斷<條件表達式>的值,若該值為“假”,則退出循環(huán),執(zhí)行循環(huán)體下面的語句;若該值為“真”,則執(zhí)行<循環(huán)體語句>,然后計算<循環(huán)表達式>的值,再判斷<條件表達式>的值,重復以上的操作。for語句的流程圖如圖:一般情況下,<循環(huán)體語句>是由一對花括括起來的復合語句。第3頁/共53頁02:20第5頁for循環(huán)語句注意:

①<初始表達式>可以省略,但須保留分號(;),同時在for之前必須給循環(huán)變量賦值,如:i=1;for(;i<=100;i++)sum=sum+i;②<條件表達式>一般不可省略,否則為無限循環(huán)。如:for(i=1;;i++)

sum=sum+i;相當于條件總為真,程序會一直不停的執(zhí)行直到“數(shù)據(jù)溢出”。第4頁/共53頁02:20第6頁③<循環(huán)表達式>亦可省略,但在循環(huán)語句體中必須有語句來修改循環(huán)變量,以使條件表達式的值在某一時刻為0,從而能正常結(jié)束循環(huán)。如:for(sum=0,i=1;i<=100;){sum=sum+i;i++;}④三個表達式均省略,即for(;;),為無限循環(huán),程序中要避免這種情況的發(fā)生。⑤條件表達式可以是關(guān)系表達式、數(shù)值表達式。只要表達式的值0。就執(zhí)行循環(huán)語句。如:for(i=0;(c=getchar())!=‘\n’;i+=c);第5頁/共53頁02:20第7頁⑥初始表達式、循環(huán)表達式可以是逗號表達式如:for(sum=0,i=1;i<=100;i++,i++)相當于:sum=0;for(i=1;i<=100;i=i+2)⑦for循環(huán)也可以嵌套,執(zhí)行時是由外向里,逐層進行,先執(zhí)行外層循環(huán),再進入內(nèi)層循環(huán);退出時相反,由里向外逐層退出,先退出內(nèi)層循環(huán),然后退到上一層循環(huán)?!纠?-2】任意從鍵盤輸入兩個整數(shù)a、b(a<b),求它們之間的幾何級數(shù)的和,數(shù)學表達式為。第6頁/共53頁02:20第8頁這個問題與例5-1類似,只是所求級數(shù)和的初值和終值不一樣,是由鍵盤任意輸入的,為避免計算機錯誤,要求初值a要小于終值b。算法流程圖如右圖:第7頁/共53頁02:20第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);}第8頁/共53頁02:20第10頁【例5-3】編寫一個程序,在屏幕上打印出具有8行7列的如下圖案:

這是一個很有規(guī)律的圖案,可采用二重循環(huán)嵌套的方式:第1層控制行數(shù),第2層控制列數(shù)。算法流程圖如下圖:第9頁/共53頁02:20第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"); }}第10頁/共53頁02:20第12頁§5.2while語句

While語句也是一種用于產(chǎn)生循環(huán)動作的語句,一般形式為:while(<表達式>)

<循環(huán)體語句>功能:先計算<表達式>的值,若該值為“假”,則跳出循環(huán),執(zhí)行循環(huán)體后面的語句;若該值為“真”,則執(zhí)行<循環(huán)體語句>,然后回過頭來再檢查<表達式>的值,重復以上的操作。while語句的流程圖第11頁/共53頁02:20第13頁<循環(huán)語句體>:是用一對花括號括起來的復合語句。注意:在<循環(huán)語句體>中要有使<表達式>的值為假(或<表達式>的值為零)的語句,否則會使程序出現(xiàn)無限循環(huán)而發(fā)生錯誤。注意:由于while循環(huán)是先判斷<表達式>的值,后決定是否執(zhí)行<循環(huán)語句>,因此,有可能一次也不執(zhí)行<循環(huán)語句>。第12頁/共53頁02:20第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);}程序運行結(jié)果:sum=5050第13頁/共53頁02:20第15頁【例5-5】輸入一個正整數(shù)n,求n!。計算表達式:n!=n*(n-1)*(n-2)*…*2*1。用i代表循環(huán)變量,s代表n!的結(jié)果值。編程時既可以采用for循環(huán),也可以采用while循環(huán)求任意正整數(shù)n的階乘的算法流程圖如圖:第14頁/共53頁02:20第16頁/*exam5_5.cwhile應用:求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)?第15頁/共53頁02:20第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)體第16頁/共53頁02:20第18頁例5-6從鍵盤輸入一批學生的成績,計算平均分。分析:求累加和確定循環(huán)條件不知道輸入數(shù)據(jù)的個數(shù),無法事先確定循環(huán)次數(shù)用一個特殊的數(shù)據(jù)作為正常輸入數(shù)據(jù)的結(jié)束標志,比如選用一個負數(shù)作為結(jié)束標志。第17頁/共53頁02:20第19頁#include<stdio.h>Intmain(void){intnum; doublegrade,total; num=0;total=0; printf(“Entergrades:\n"); scanf("%lf",&grade);/*輸入第1個數(shù)*/

while(grade>=0){/*輸入負數(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第18頁/共53頁02:20第20頁§5.3do~while語句

do_while語句是另一種用于產(chǎn)生循環(huán)動作的語句。一般形式為:do{<循環(huán)體語句>}while(<表達式>);功能:先執(zhí)行一次<循環(huán)體語句>,然后計算<表達式>的值,若該值為“真”,則重復以上的操作,直到該值為“假”,則退出循環(huán)語句,執(zhí)行下一條語句。do_while語句的流程圖:第19頁/共53頁02:20第21頁<循環(huán)語句體>應該是用一對花括號括起來的復合語句。注意:要有可以使<表達式>的值為“假”(即<表達式>的值等于零)的語句,否則會使程序出現(xiàn)無限循環(huán)而發(fā)生錯誤。do_while循環(huán)與while循環(huán)的區(qū)別,不論情況怎樣,do_while循環(huán)中的<循環(huán)語句體>至少會執(zhí)行一次。第20頁/共53頁02:20第22頁【例5-7】將例5-6用do_while語句重寫。第21頁/共53頁02:20第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);/*輸入負數(shù),循環(huán)結(jié)束*/printf(“Gradeaverageis%.2f\n",(total+1)/(num-1)); return0;}Entergrades:6788735482-1Gradeaverageis72.80Entergrades:-16788735482Gradeaverageis0第22頁/共53頁02:20第24頁【例5-8】求sin(x)=x-x3/3!+x5/5!-x7/7!+…直到最后一項絕對值小于le-7(即10-7)為止。分析:

多項式從第二項起,每一項都是前一項乘以一個因子,

(-x2)/(n*(n-1))(n=3,5,7,9……)

用s代表sin(x)的值,t代表每一項的值,則:t=t*(-x2)/(n*(n-1));s=s+t;

x的值是用弧度值表示的(10=/180弧度),如:

3000.523598775算法流程圖如后圖:第23頁/共53頁02:20第25頁第24頁/共53頁02:20第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);}程序運行結(jié)果:1.57sin(1.570000)=1.000000

第25頁/共53頁02:20第27頁

while

是先判別條件,再決定是否循環(huán);

do-while

是先至少循環(huán)一次,然后再根據(jù)循環(huán)的結(jié)果決定是否繼續(xù)循環(huán)。while和do-while的比較真假表達式循環(huán)體語句do-while的下一條語句真假while的下一條語句表達式循環(huán)體語句第26頁/共53頁02:20第28頁

循環(huán)語句的選擇if(循環(huán)次數(shù)已知) 使用for語句else /*循環(huán)次數(shù)未知*/ if(循環(huán)條件在進入循環(huán)時明確)

使用while語句

else /*循環(huán)條件需要在循環(huán)體中明確*/

使用do-while語句第27頁/共53頁02:20第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)語句體中的位置應根據(jù)程序的需要而定,一般是用在循環(huán)體內(nèi)某一個if條件分支的語句中,用來表示在循環(huán)過程中當某一個條件成立時提前結(jié)束循環(huán)。第28頁/共53頁02:20第30頁

程序解析-判斷素數(shù)算法:除了1和m,不能被其它數(shù)整除。設i取值[2,m-1]如果m不能被該區(qū)間上的任何一個數(shù)整除,即對每個i,m%i都不為0,則m是素數(shù)只要找到一個i,使m%i為0,則m肯定不是素數(shù)m%2%3%4%5%(m-1)不是素數(shù)||==0==0是素數(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”);第29頁/共53頁02:20第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"); }源程序-判斷素數(shù)Enteranumber:9NoEnteranumber:1111isaprimenumber!循環(huán)條件?循環(huán)的結(jié)束條件?第30頁/共53頁02:20第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");當循環(huán)有多個出口時:表示循環(huán)條件區(qū)分結(jié)束條件for(i=2;i<=m/2;i++)if(m%i==0){printf("No!\n");break;}printf("Yes");第31頁/共53頁02:20第33頁二、Continue語句Continue語句只適用于循環(huán)結(jié)構(gòu),其一般形式為:作用:提前結(jié)束本次循環(huá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); }}第32頁/共53頁02:20第34頁算法流程圖如圖:要準確地使用break語句和continue語句,除非有必要,否則若可以不用則盡量不采用break語句和continue語句。第33頁/共53頁02:20第35頁對于例5-10的問題,打印100-200中不能被3整除的數(shù)。不采用continue語句的算法流程圖如圖所示:第34頁/共53頁02:20第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); }第35頁/共53頁02:20第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); }}運行結(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); }}運行結(jié)果:1,2,3,4,6,7,8,9,10,第36頁/共53頁02:20第38頁§5.5循環(huán)結(jié)構(gòu)的嵌套

循環(huán)結(jié)構(gòu)的嵌套,指的是某一種循環(huán)結(jié)構(gòu)的語句中,包含有另一個循環(huán)結(jié)構(gòu)。

使用嵌套的結(jié)構(gòu)時,要注意嵌套的層次,不能交叉。例5.12

求1!+2!+….+100!第37頁/共53頁02:20第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;}第38頁/共53頁02:20第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);}第39頁/共53頁02:20第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!?第40頁/共53頁02:20第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第41頁/共53頁02:20第43頁for(i=1;i<=100;i++)for(j=1;j<=i;j++) printf("%d%d\n",i,j);第42頁/共53頁02:20第44頁§5.6goto語句

goto語句是一種無條件轉(zhuǎn)向語句,它可以用在程序的任何地方,其一般形式為:goto語句標號;“語句標號”為任何合法的標識符,放在某個語句前面并加上冒號“:”作為語句的標號,標號只對goto語句有意義,帶有標號的語句被稱作標號語句。如:error:、end:、exp:等均為合法的語句的標號。goto語句的作用:轉(zhuǎn)到標號語句所在的地方繼續(xù)執(zhí)行。第43頁/共53頁02:20第45頁【例5-13】用if語句和goto語句組合構(gòu)成的循環(huán)重寫計算器的程序。/*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);}程序運行結(jié)果:sum=5050goto語句是一種非結(jié)構(gòu)化的語句,在程序設計中應盡量少用或不用goto語句。

第44頁/共53頁02:20第46頁§5.7程序范例

【例5-16】打印出ASCⅡ碼序列中從33~127(十進制)的字符對照表。/*exam5_16.c打印部分ASCII碼字符*/#include<stdio.h>main(){ inti; for(i=33;i<128;i++) { printf("%d---%c\t",i,i); }}第45頁/共53頁02:20第47頁【例5-17】設公雞每只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);}第46頁/共53頁02:20第48頁程序運行結(jié)果:Cock--0Hen--25Chicken--75Cock--4Hen--18Chicken--78Cock--8Hen--11Chicken--81Cock--12Hen--4Chicken--84第47頁/共53頁02:20第49頁小結(jié):三種循環(huán)結(jié)構(gòu):for、while和do_while循環(huán)。當循環(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)語句體為復合語句,但沒有使用花括號。2.使程序發(fā)生無限循環(huán)。3.混淆break語句與continue語句的功能。第48頁/共53頁02:20第50頁循環(huán)程序設計循環(huán)程序的實現(xiàn)要點:歸納出哪些操作需要反復執(zhí)行?

循環(huán)體這些操作在什么情況下重復執(zhí)行?

循環(huán)條件選用合適的循環(huán)語句forwhiledo-while循環(huán)具體實現(xiàn)時考慮(循環(huán)條件):事先給定循環(huán)次數(shù),首選for通過其他條件控制循環(huán),考慮while或do-while第49頁/共53頁02:20第51頁#include<stdio.h>intmain(void){inti,mark,max,n;

prin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論