C語言循環(huán)解析_第1頁
C語言循環(huán)解析_第2頁
C語言循環(huán)解析_第3頁
C語言循環(huán)解析_第4頁
C語言循環(huán)解析_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

會計(jì)學(xué)1C語言循環(huán)解析程序及程序設(shè)計(jì)的初步知識當(dāng)條件判斷表達(dá)式為真

循環(huán)體語句判斷表達(dá)式循環(huán)體語句真假循環(huán)體語句直到判斷表達(dá)式為假循環(huán)體語句判斷表達(dá)式假真循環(huán)結(jié)構(gòu)比較當(dāng)型循環(huán)直到型循環(huán)第1頁/共104頁【例5.1】計(jì)算ex,lnx。其中x=1,2,3,4,5。#include<stdio.h>#include<math.h>main(){intx;floaty,z;x=1;y=exp(x);z=log(x);printf(”y=%f,z=%f”,y,z);x=2;y=exp(x);z=log(x);printf(”y=%f,z=%f”,y,z);

x=3; y=exp(x); z=log(x); printf(”y=%f,z=%f”,y,z); x=4; y=exp(x); z=log(x); printf(”y=%f,z=%f”,y,z); x=5; y=exp(x); z=log(x); printf(”y=%f,z=%f”,y,z);return(1);}第2頁/共104頁采用循環(huán)控制語句實(shí)現(xiàn)#include<stdio.h>#include<math.h>main(){intx;floaty,z;x=1;while(x<=5)

{y=exp(x);z=log(x);x++;printf(“y=%f,z=%f”,y,z)

}}循環(huán)執(zhí)行的條件:

(x<=5)每一次循環(huán)執(zhí)行:

計(jì)算y和z

改變x的值輸出y和z第3頁/共104頁5while語句---“當(dāng)型”循環(huán)結(jié)構(gòu)一般形式:

while

(表達(dá)式)語句;/*循環(huán)體*/說明:

“表達(dá)式”為循環(huán)條件;“語句”為循環(huán)體。特點(diǎn): 先判斷表達(dá)式,后執(zhí)行語句圖6_1難點(diǎn):如何設(shè)置表達(dá)式和循環(huán)體中的語句.第4頁/共104頁【例5.2】求。數(shù)學(xué)方法SUM=1+2+3+4+5+…+99+100SUM=1+2+3+4+5+…+N-1+N第5頁/共104頁改進(jìn)方法:設(shè)兩個變量:一個變量sum代表和,一個變量I代表序列中的某一個數(shù)。每一次相加的結(jié)果再放入sum中,再和下一項(xiàng)進(jìn)行運(yùn)算,表示如下:sum=1+2+3+4+5+……+N-1+NsumIsumIsumIsumI第6頁/共104頁8算法如下:用循環(huán)來表示算法,可以將算法表示如下:S1:讀入NS2:sum=0S3:I=1S4:將sum+I的和賦給sum,即:sum=sum+IS5:使I的值加1,即:I=I+1S6:如果I〈=N,再做S4,否則,算法結(jié)束。第7頁/共104頁【例5.2】求。圖5_2算法分析:1.無輸入2.輸出:和(sum)第8頁/共104頁10main(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}printf("%d\n",sum);}編程求解:1+2+3+……+100=?圖6_2“i=1”可否換成:“i=0”第9頁/共104頁11注意:while語句中的“表達(dá)式”(即判斷條件)可以是任意的表達(dá)式,但一般為關(guān)系表達(dá)式或邏輯表達(dá)式。循環(huán)體如果包含一個以上的語句,應(yīng)該用花括弧括起來,以復(fù)合語句形式出現(xiàn)。在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句,以免形成死循環(huán)。第10頁/共104頁12典型例題1.累加求和、求積(迭代算法)

分析:這一類題型是求一數(shù)列的和(積)。在處理此類問題時,通常采用的方法是:

用一個變量存放累加和(積),從0(1)開始.第二個變量代表加數(shù)(或乘數(shù)),每次按一定的規(guī)律進(jìn)行變換.第三個變量控制循環(huán).從一個初始值(一般從1開始),每做一次循環(huán),其值改變,然后判斷表達(dá)式的值,最終跳出循環(huán).【例5.3】輸入10個數(shù),求和第11頁/共104頁【例5.3】輸入10個數(shù),求和

算法分析:sum:存放累加和.(初值為0)x:加數(shù)i:控制循環(huán).(初值為1)sum=0i=1i<=10得到加數(shù)計(jì)算sum改變i01sum=0i=1i<=10scanf(“%f”,x)sum=sum+xi++01sumx1x2x3x4…x10

1:sum2:sum3:sum10:sum設(shè)置表達(dá)式:

i<=10設(shè)置循環(huán)體:

得到第i個數(shù)(加數(shù))計(jì)算sum

改變循環(huán)變量i第12頁/共104頁#include“stdio.h”

main(){floatx,sum;inti; sum=0;i=1;/*對sum和i賦初值*/

While(i<=10)/*循環(huán)取決于i的值*/

{scanf(“%f”,&x); sum=sum+x; i++; }printf(”sum=%f”,sum);}算法描述如下:/*此時加數(shù)為一個輸入量循環(huán)體每執(zhí)行一次則執(zhí)行一次輸入語句,即讀入一個數(shù)*/第13頁/共104頁加數(shù)的變化規(guī)律:

后一項(xiàng)=前一項(xiàng)+1(即增量為1)循環(huán)變量的規(guī)律:

每做一次循環(huán),則增1.因此可用一個變量i來代表加數(shù)和循環(huán)變量.設(shè)置表達(dá)式:

i<=100設(shè)置循環(huán)體:

計(jì)算sum+i=>sum

改變加數(shù)改變循環(huán)變量(i++);sum=0i=1i<=100sum=sum+ii++01【例5.4】求1+2+3+4+…+100的和第14頁/共104頁源程序如下:#include“stdio.h”main(){inti,sum=0;/*累加求和從0開始*/

i=1;/*i既是加數(shù),又是循環(huán)變量*/

while(i<=100)/*循環(huán)執(zhí)行的條件是i<=100*/

{sum=sum+i;i++;} /*改變i*/printf(“%d”,sum);

}第15頁/共104頁可能是有規(guī)律可尋的,比方說存在通項(xiàng)公式:a(I)=f(I);或遞推公式:a(I)=f(a(i-1),I)算法可描述為:s=0;n=1;While(n<=100){ s=s+通項(xiàng)(某一項(xiàng));/*這時通項(xiàng)需要通過計(jì)算*/

n++;}每次從變量的一個舊值推出新值(即迭代算法)。第16頁/共104頁

main() {inti,sum=0; i=1;/*i既是通項(xiàng),又是循環(huán)變量*/

while(i<=99)/*循環(huán)執(zhí)行的條件是i<=99*/ {sum=sum+i; i=i+2;}

printf(“%d”,sum);

}【例5.5】求1+3+5+7+9+…+99難點(diǎn):1)找出通項(xiàng)公式,即找出加數(shù)的變化規(guī)律為:

后一項(xiàng)=前一項(xiàng)+2;2)循環(huán)如何控制:

每一次增加2.思考:如果數(shù)列是:1+1.1+1.2+1.3+1.4+1.5+…+2.0第17頁/共104頁19典型例題

1.累加求和、求積(迭代算法)【例5.6】計(jì)算n!,其中n由鍵盤輸入。輸入nfac=1i=1i<=nfac=fac*ii++01分析如下:fac:存放累加乘積.i:乘數(shù),又控制循環(huán).設(shè)置循環(huán)表達(dá)式:

i<=n設(shè)置循環(huán)體:

計(jì)算fac*i=>fac

改變乘數(shù)改變循環(huán)變量(i++);第18頁/共104頁源程序如下:注意:這里,盡管n和n!是整數(shù),但當(dāng)n較大時,n!可能超過整型數(shù)范圍。所以將變量fac定義為實(shí)型。算法為:main(){floatfac;inti,n;scanf(“%f”,&n);fac=1;i=2;While(i<=n){fac=fac*i;i++;}printf(“fac=%8.0f”,fac);}

思考:如何求S=1!+2!+3!+…+n!(這是一個累加問題,通項(xiàng)a(n)=n!=n*a(n-1)第19頁/共104頁21【例5.7】求2n。main(){inti=1,n;longintp=1;scanf("%d",&n);while(i<=n) { p*=2;i++;}printf("%d\n",p);}圖5_3分析;輸入:n輸出:P(表示n?。┑?0頁/共104頁典型例題

2.菲波拉契數(shù)列問題【例5.8】:求菲波拉契數(shù)列a0,a1……a20分析:該數(shù)列的規(guī)律是:

a0=0,a1=1,a2=1,a3=2,a4=3…an=an–2+an–1

即: a2=a0+a1;a3=a1+a2;a4=a2+a3;…a20=a18+a19

難點(diǎn):如何設(shè)置循環(huán)體:

an=an–2+an–1

考慮an、an–2、an–1如何變換:a3a2a3a4a2a1a0:代表前一個數(shù)a1:代表后一個數(shù)a2:代表需要計(jì)算的數(shù)每計(jì)算一次a2則a1→a0a2→a1第21頁/共104頁

a2=a0+a1;a0=a1;a1=a2;a2=a0+a1;(a3=a1+a2;)(a4=a2+a3;)a0=a1;a1=a2;

a2=a0+a1;用a2代表所求的某一項(xiàng),a0、a1代表該項(xiàng)的前兩項(xiàng),每求一次a2,將a1、a2作為下一次的a0和a1。

第22頁/共104頁算法描述:分析: 1)序列中的前兩項(xiàng)已知,可直接輸出,需要計(jì)算的是a2,a3……a20共19項(xiàng).

且通項(xiàng)公式為:每一項(xiàng)=前兩項(xiàng)之和 2)設(shè)置循環(huán)表達(dá)式:

i<=193)設(shè)置循環(huán)體:

計(jì)算a2;

求a0,a1;

輸出a2;

改變循環(huán)變量(i++);輸出a0、a1i<=19計(jì)算a2,a0,a1輸出a2,i++01第23頁/共104頁

源程序如下:#include“stdio.h”voidmain(){floata0,a1,a2;inti=1;a0=0;a1=1;printf(“%10.0f,%10.0fd”,a0,a1); /*循環(huán)外給a0,a1賦初值,并輸出這兩個值*/

while(i<=19)

/*從a2開始進(jìn)入循環(huán),到a20結(jié)束*/

{

a2=a0+a1; /*計(jì)算公式*/

a0=a1; a1=a2;i++;

printf(“%10.0f”,a2) /*輸出a2*/

}

}/*這兩個語句順序不能顛倒,下標(biāo)不能錯*/典型例題第24頁/共104頁 #include“stdio.h”voidmain() { floata0,a1,a2;inti=0; a0=0;a1=1; printf(“%10.f,%10.0f”,a0,a1); while(i<=20) {a2=a0+a1; /*計(jì)算公式*/

printf(“%8d”,a2);

IF(i%5==4)/*i=4時,已輸出5個*/

printf(“\n”); /*每輸出5個換行*/

a0=a1;a1=a2;i++;}}

第25頁/共104頁典型例題

2.菲波拉契數(shù)列問題【例5.9】:輸出菲波拉契數(shù)列前21項(xiàng),并求和。分析:在求和之前,應(yīng)先求出通項(xiàng)的值,并輸出.#include“stdio.h”main(){floats,a0,a1,a2;inti=0;a0=0;a1=1;printf(“%10.f,%10.0f”,a0,a1); s=a0+a1;/*累加單元先求前兩項(xiàng)的和*/While(i<=20)

{ a2=a0+a1;/*先求通項(xiàng)a2*/ s=s+a2;

/*累加求和*/

printf(”%10.0f”,a2); a0=a1;a1=a2;i++;

}Printf(“s=%10.0f”,s)

/*輸出累加和*/ }s+=a2;第26頁/共104頁

典型例題

3.求多個數(shù)的最大、最小值問題【例5.10】:從鍵盤輸入一組數(shù),當(dāng)輸入為負(fù)數(shù)時結(jié)束,求其中的最大、最小值.通用算法:設(shè)最大、最小值分別用max和min表示,顯然要用循環(huán)結(jié)構(gòu),采用兩兩比較的方法,每次從鍵盤輸一個數(shù)x,并分別與max、min相比,并將較大、較小的數(shù)分別放入max、min。最后,變量max、min中放的便是n個數(shù)中的最大、最小值。

本例以輸入負(fù)數(shù)作為循環(huán)結(jié)束的標(biāo)志,可見輸入數(shù)的個數(shù)不確定,應(yīng)用WHILE語句時注意循環(huán)結(jié)束的條件是當(dāng)輸入為負(fù)數(shù)時。1)通過分析,我們得到循環(huán)體執(zhí)行的條件是輸入數(shù)>=0時.因此,循環(huán)表達(dá)式為while(x>=0)2)設(shè)置循環(huán)體:每得到一個新的數(shù)x,就將它和max比較,如果(x>max),就執(zhí)行max=x,否則比較x和min,如果(x<min),就執(zhí)行min=x;

scanf(“%f”,&x); if(x>max)max=x; elseif(x<min)min=x;第27頁/共104頁#include“stdio.h”main(){floatx,max,min;

scanf("%f",&x);max=x;min=x;while(x>=0)/*當(dāng)x非負(fù),執(zhí)行循環(huán)體*/

{scanf("%f",&x);

if(x>max)max=x;elseif(x<min)min=x;

}printf("max=%f,min=%f\n“,max,min);return(1);} 輸入第一個數(shù)x設(shè)置max、min的初值當(dāng)輸入數(shù)>0x>max10max=xX<min10min=x輸出max、min輸入x第28頁/共104頁典型例題

4.統(tǒng)計(jì)問題【例5.11】:輸入一串字符,以‘?’結(jié)束,輸出其中字母個數(shù)與數(shù)字個數(shù)。通用算法:

用一個變量表示輸入的變量(char);

用整型變量(計(jì)數(shù)變量)表示滿足某一個條件或在某一個范圍內(nèi)的變量的個數(shù)。循環(huán)體執(zhí)行的條件一般依賴于輸入量,如輸入為‘?’或輸入為負(fù)數(shù)或大于某個數(shù)等.

ch:輸入的字符

S1:存放字母個數(shù)

S2:存放數(shù)字個數(shù)循環(huán)終止條件為ch=?,

但循環(huán)體執(zhí)行的條件是

ch!=‘?’.

設(shè)置循環(huán)體:每次得到一個字符ch,判斷它是字母還是數(shù)字字符,如果是字母,則s1增1,如果是數(shù)字,則s2增1

ch=getchar();if(ch>=‘a(chǎn)’&&c<=‘z’)||(ch>=‘A’&&c<=‘Z’)s1=s1+1;elseif(ch>=‘0’&&ch<=‘9’)s2++;第29頁/共104頁#include"stdio.h"main(){ints1=0,s2=0;charch;while(ch!=‘?’){ch=getchar();

if((ch>='a'&&c<='z')||(ch>='A'&&c<='Z'))s1+=1;elseif(ch>='0'&&c<='9') s2+=1;

}printf(“thenumberofE,Digitis%d,%d\n”,s1,s2);}ch=getchar();/*scanf(“%c”,&C);*/while(ch!=‘?’)

{

if((ch>='a'&&c<='z')||(ch>='A'&&c<='Z'))s1+=1;elseif(ch>='0'&&ch<='9') s2+=1;

ch=getchar();/*scanf(“%c”,&C);*/}第30頁/共104頁【例5.12】:輸入某班學(xué)生的成績,以負(fù)數(shù)結(jié)束,輸出各分?jǐn)?shù)段的人數(shù)。

score:成績

S1:存放90分以上人數(shù)

S2:存放80~89分人數(shù)

S3:存放70~79分人數(shù)

S4:存放60~69分人數(shù)

S5:存放60分以下的人數(shù)循環(huán)終止條件為score<0,

則循環(huán)體執(zhí)行的條件是

score>=0.

設(shè)置循環(huán)體:每次得到一個新的成績score,然后判斷它在哪個分?jǐn)?shù)段,將它所在的分?jǐn)?shù)段對應(yīng)的計(jì)數(shù)變量增1.

如score=89,

則s2=s2+1;

第31頁/共104頁#include“stdio.h”main(){floatscore;ints1=s2=s3=s4=s5=0;scanf(“%f”,&score);while(score>=0){

if(score>=90)s1=s1+1;

elseif(score>=80)s2+=1;elseif(score>=70)s3++;elseif(score>=60)s4++;elses5++;}printf(“%8.1f,%8.1f,%8.1f,%8.1f,%8.1f”, s1,s2,s3,s4,s5);}scanf(“%f”,&score);6778915560-77scorescore=67s4=1score=78s3=1score=91s1=1score=55s5=1score=60s4=2score=-77跳出循環(huán)第32頁/共104頁34while語句在while循環(huán)體內(nèi)也允許空語句。例如:

while((c=getchar())!=‘\X0D’);/*這個循環(huán)直到鍵入回車為止*/

可以有多層循環(huán)嵌套。語句可以是復(fù)合語句,此時必須用“{”和“}”括起來第33頁/共104頁例:運(yùn)行以下程序后,如果從鍵盤上輸入china#<回車>,則輸出結(jié)果為▁▁▁▁main(){intv1,v2,v3;charch;v1=v2=v3=0;while((ch=getchar())!='#')switch(ch) {case'a': case'0':v2++; default:v1++;break; case'h':V3++;} printf("%d,%d,%d\n",v1,v2,v3);}循環(huán)體:switch語句特點(diǎn):對ch進(jìn)行一次判斷,找出對應(yīng)的case語句并執(zhí)行。1)v1=1;2)v3=1;3)v1=2;4)v1=3;5)v2=1,v1=4;4,1,1第34頁/共104頁例:有如下程序,該程序段的輸出結(jié)果是▁▁▁▁

main() {intn=8; while(n>6){n--;printf(“%d”,n);}}

WHILE語句中的條件表達(dá)式:(n〉6)1)n--;即n=7,輸出72)n--;即n=6,輸出6(n〉6)條件不滿足,結(jié)束循環(huán)76第35頁/共104頁例:以下程序的輸出結(jié)果是▁▁▁▁

main() {intn=6; while(n--)printf("%d",--n);}

循環(huán)執(zhí)行的條件是(n--)為真時,即(n--)>0即:當(dāng)n為非零數(shù)時滿足條件。 先判斷n,再執(zhí)行n--;1)n=6,則n=n--=5,輸出(--n),即輸出42)同樣可得:n=n--=3;輸出(--n),即輸出23)n=n--=1;輸出(--n),即輸出0 結(jié)束循環(huán)。420第36頁/共104頁例:若輸入字符串:ENGLISH<回車>,則以下while循環(huán)體將執(zhí)行__________次。

While((ch=getchar())==’S’)printf(“*”);

循環(huán)體執(zhí)行的條件:(ch=getchar())==’S’輸入為:ENGLISH則ch=’E’因此條件不滿足,結(jié)束循環(huán)0第37頁/共104頁do-while語句___“直到型”循環(huán)結(jié)構(gòu)一.格式(直到型)

do

語句while(表達(dá)式);二.執(zhí)行過程系統(tǒng)首先執(zhí)行循環(huán)體,再判斷表達(dá)式的值,若值為“真”,則繼續(xù)執(zhí)行循環(huán)體;否則跳出循環(huán)體,執(zhí)行后續(xù)語句。它的特點(diǎn)是“先執(zhí)行,后判斷”。

至少要執(zhí)行一次循環(huán)語句循環(huán)體表達(dá)式01第38頁/共104頁40三.典型例題【例5.13】:求1+2+3+4+…+100的和main(){inti,sum=0;i=1;do

{sum=sum+i;i++;}while(i<=100)printf(“%d”,sum);}sum=0i=1i<=100sum=sum+ii++10第39頁/共104頁例:以下程序段的執(zhí)行結(jié)果是▁▁▁▁inta,y;a=20;y=0;Do{a+=2;y+=a;printf(“a=%dy=%d\n”,a,y);if(y>30)break;}while(a〈=24);

1)a=a+2=22;y=y+a=22;

輸出a=22y=22

執(zhí)行if(y〉30),結(jié)果為0; 判斷(a〈=24),結(jié)果為12)a=a+2=24;y=y+a=46;

輸出a=24y=46

執(zhí)行if(y〉30),結(jié)果為1; 執(zhí)行break語句,結(jié)束循環(huán)。不再判斷(a〈=24)a=22y=22a=24y=46第40頁/共104頁例:假定a和b為int型變量,則執(zhí)行以下語句后b的值為▁▁▁▁

a=1;b=20; do{b-=a;a++;}while(b--<0);Do-while循環(huán)的特點(diǎn):先執(zhí)行后判斷。循環(huán)體是:{b-=a;a++;}得到b=b-a=19;a=2;(b--<0)先判斷(b<0)之后再執(zhí)行b--18第41頁/共104頁例:當(dāng)執(zhí)行以下程序段時▁▁▁▁

x=-1;do{y--;}while(--y);pringt("%d\n",y--); A循環(huán)體將執(zhí)行一次B循環(huán)體將執(zhí)行兩次

C循環(huán)體將執(zhí)行無限次 D系統(tǒng)將提示有語法錯誤

C循環(huán)體:{y--)

條件表達(dá)式:(--y)為非零值。因此條件總是滿足,答案為C第42頁/共104頁例:有如下程序,該程序的執(zhí)行結(jié)果是▁▁▁▁

main() {intx=2;do{printf(“%d”,x--);}while(!x); }

Do-while語句中的循環(huán)體是否執(zhí)行依賴于條件表達(dá)式(!X)即:當(dāng)X=0時,進(jìn)行下一次循環(huán),否則結(jié)束循環(huán)。特點(diǎn):先執(zhí)行后判斷。因此輸出2,再X--,得到X=1,!X=0,結(jié)束循環(huán)。2第43頁/共104頁【例5.14】#include<stdio.h>main(){charc;do{c=getchar();if(c>='A'&&c<='Z')c+=32;putchar(c);}while(c!='\n');}將鍵盤輸入字符中所有大寫字母轉(zhuǎn)換為小寫字母,其他字符不變。第44頁/共104頁比較while語句與do-while語句1.do-while語句循環(huán)體至少執(zhí)行一次2.都是在表達(dá)式值為真時執(zhí)行循環(huán)體,為假時結(jié)束。3.do,while必須成對出現(xiàn)。do與while之間的語句組成循環(huán)體,可以是一句,也可以是多句??梢郧短灼渌h(huán)語句。循環(huán)體表達(dá)式100表達(dá)式循環(huán)體1第45頁/共104頁47for語句---“當(dāng)型”循環(huán)結(jié)構(gòu)一般形式:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句說明:表達(dá)式1:循環(huán)變量賦初始值表達(dá)式2:循環(huán)條件表達(dá)式3:循環(huán)變量增值語句:循環(huán)體圖6_5第46頁/共104頁for語句一.格式for(<初始化>;<條件表達(dá)式>;<增量>)

語句;初始化是一個賦值語句,它用來給循環(huán)控制變量賦初值;條件表達(dá)式是一個關(guān)系表達(dá)式,它決定什么時候退出循環(huán);增量定義循環(huán)控制變量每循環(huán)一次后按什么方式變化。【例】for(i=1;i<=5;i++) printf(“%d”,i);

執(zhí)行此語句將輸出:12345

for(i=9;i>=5;i--) printf(“%d”,i);

執(zhí)行此語句將輸出:98765第47頁/共104頁FOR語句s1.求解表達(dá)式1s2.求解表達(dá)式2,值為“真”,執(zhí)行循環(huán)體;值為“假”,跳出循環(huán)執(zhí)行下一條語句s3.執(zhí)行內(nèi)嵌語句(循環(huán)語句)s4.求解表達(dá)式3;返回s2s5.執(zhí)行語句下面的一條語句[注意]應(yīng)用FOR語句時:循環(huán)體被執(zhí)行的次數(shù)(N)應(yīng)是已知的。求解表達(dá)式1循環(huán)體表達(dá)式210求解表達(dá)式3二.循環(huán)執(zhí)行過程第48頁/共104頁50【例5.15】求。(改【例5.4】)main(){inti,sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("%d\n",sum);}第49頁/共104頁#include“stdio.h”main(){inti,sum=0;for(i=1;i<=100;i++)

{sum=sum+i;}printf(“%d”,sum);Return(1);}【例5.15】:求1+2+3+4+…+100的和三.典型例題i=1循環(huán)體i<=10010i++第50頁/共104頁52FOR語句[注意]for循環(huán)中語句可以為語句體,但要用“{”和“}”將參加循環(huán)的語句括起來。for循環(huán)中的“初始化”、“條件表達(dá)式”和“增量”都是選擇項(xiàng),即可以缺省,但“;

”不能缺省。第51頁/共104頁53FOR語句1)省略了表達(dá)式1(初始化),表示不對循環(huán)控制變量賦初值。例:for(;i<=100;i++)sum=sum+i;

可在循環(huán)開始之前初始化變量:

i=1;

for(;i<=100;i++)sum=sum+i;第52頁/共104頁54FOR語句2)省略了表達(dá)式2(條件表達(dá)式),則不做其它處理時便成為死循環(huán)。例:for(i=1;;i++)sum=sum+i;/*成為死循環(huán)*/第53頁/共104頁55FOR語句3)省略了表達(dá)式3(增量),則不對循環(huán)控制變量進(jìn)行操作。

例:

for(i=1;i<=100;)sum=sum+i;可在循環(huán)體中控制循環(huán)變量:

for(i=1;i<=100;){sum=sum+i;i++;}

第54頁/共104頁56FOR語句4)可以省略表達(dá)式1和表達(dá)式3,即只有循環(huán)條件。例:for(;i<=100;){sum=sum+i;i++;}相當(dāng)于

while(i<=100){sum=sum+i;

i++;}第55頁/共104頁57FOR語句5)省略了表達(dá)式1,2,3,則不做其它處理時便成為死循環(huán)。例:for(;;)

語句/*成為死循環(huán)*/第56頁/共104頁58FOR語句6)表達(dá)式1可以是設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其它表達(dá)式。例:

for(

sum=0,i=1;i<=100;i++)sum=sum+i;

for(i=0,j=100;i<j;i++,j--)k=k+i+j;第57頁/共104頁例 以下循環(huán)體的執(zhí)行次數(shù)是▁▁▁▁main(){inti,j;for(i=0,j=1;i<=j+1;

i+=2,j--)printf(“%d\n”,i);}

表達(dá)式1:I=0,j=1; 1)執(zhí)行Printf語句; 執(zhí)行I=I+2=2;j=j--=0

判斷I〈=j+1,

結(jié)果為0, 結(jié)束循環(huán)1第58頁/共104頁60FOR語句for(i=0;j=100;i<j;i++,j--)k=k+i+j;i=0j=100i<=jk=k+i+ji=i+1j=j-1第59頁/共104頁61FOR語句7)表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非0,就執(zhí)行循環(huán)體。例:

for(

i=0;(c=getchar())!=‘\n’;i+=c)第60頁/共104頁例設(shè)j為int型變量,則執(zhí)行結(jié)果是▁▁▁▁

for(j=10;j>3;j--) {if(j%3)j--; --j;--j; printf("%d",j);}A)63B)74C)62D)73循環(huán)執(zhí)行的條件是:j〉3關(guān)鍵在理解j%3:j不能被3整除則滿足條件IF語句只包含一個語句

j-

-;1)j=10;j%3=1,即IF(j%3)成立,執(zhí)行j-

-;-

-j;-

-j;得到j(luò)=7;輸出72)循環(huán)體執(zhí)行一次后,還要執(zhí)行FOR語句中的表達(dá)式3。即

j

-

-;得到

j=6;進(jìn)行第二次循環(huán)。j%3=0,則條件不滿足,所以只執(zhí)行

-

-j;

-

-j;得到

j=4;輸出4B第61頁/共104頁例有如下程序,該程序的執(zhí)行結(jié)果是▁▁▁▁

main(){inti,sum;for(i=1;i<=3;sum++)sum+=i;printf(“%d\n”,sum);}A)6B)3C)死循環(huán)D)0首先分析for語句:for(i=1;i<=3;sum++)sum++;則循環(huán)執(zhí)行的條件是:i〈=3;而這個條件是永遠(yuǎn)滿足的,所以程序陷入死循環(huán)。C第62頁/共104頁例以下程序的輸出結(jié)果是▁▁▁▁

main(){inti; for(i=1;i<6;i++){if(i%2){printf("#");continue;} printf("*");} printf("\n");}A)#*#*#B)#####C)*****D)*#*#*AI%2=1,則執(zhí)行{printf(“#”);continue;},否則不執(zhí)行這條語句。1)1%2=1,輸出#,結(jié)束本次循環(huán)。2)2%2=0,輸出*3)3%2=1,輸出#,結(jié)束本次循環(huán)。4)4%2=0,輸出*5)5%2=1,輸出#,結(jié)束本次循環(huán)。第63頁/共104頁例:以下程序的輸出結(jié)果是▁▁▁▁

main(){inti;for(i='A';i<'I';i++,i++)printf("%c",i+32);printf("\n");}A)編譯不通過,無輸出B)acegC)acegiD)abcdefghiBi+32:將大寫字母轉(zhuǎn)換成小寫字母。1)i=‘A’,輸出a執(zhí)行i++;i++;得到i=‘C’2)i=‘C’,輸出c執(zhí)行i++;i++;得到i=‘E’3)i=‘E’,輸出e執(zhí)行i++;i++;得到i=‘G’4)i=‘G’,輸出g執(zhí)行i++;i++;得到i=‘I’結(jié)束循環(huán)第64頁/共104頁例:設(shè)i,j,k均為int型變量,則執(zhí)行完下面的for循環(huán)后,i的值為________;j的值為_______;k的值為

_________。for(i=0,j=10;i<=j;i++,j--)k=i+j;1)求表達(dá)式1的值,得到i=0,j=10;2)判斷表達(dá)式2,如果值為真,則執(zhí)行一次循環(huán)體,否則結(jié)束循環(huán)。3)求表達(dá)式3的值,然后重復(fù)2)1. i=0,j=10,i<=j,k=i+j=10;i++;j--2. i=1;j=9;k=10;i++;j--;3. i=2;j=8;k=10;i++;j--;4. i=3,j=75. i=4,j=66. i=5,j=5,i<=j成立;執(zhí)行k=10;i++;j--

得到i=6,j=4,

則i〈=j不成立,結(jié)束循環(huán)6410第65頁/共104頁【例5.16】求調(diào)和級數(shù)

1+1/2+1/3+...+1/n前n項(xiàng)的和。

分析:輸入項(xiàng)n,輸出項(xiàng)sum。

調(diào)和級數(shù)的通項(xiàng)公式為1/n一級算法:1.輸入n,sum置0;2.計(jì)算和sum;3.輸出sum二級求精:2-1for(i=1;i<=n;i++)sum=sum+1.0/isum=0i=1i<=nsum=sum+1/i1i=i+10第66頁/共104頁68綜合分別用三種循環(huán)結(jié)構(gòu)設(shè)計(jì)輸出0.5,1.5,2.5,3.5,4.5的程序段。for(i=0;i<=4;i++){x=0.5+i;printf(“%f”,x);}

i=0.5;while(i<=4.5){printf(“%f”,i);i=i+1;} i=0.5;do{printf(“%f”,i);i=i+1;while(i<=4.5); 第67頁/共104頁【例5.17】求兩個正整數(shù)(a、b)的最大公約數(shù)(gcd)及最小公倍數(shù)(lcm)算法分析:確定輸入(輸入兩個整數(shù)a和b)、輸出(最大公約數(shù)gcd、最小公倍數(shù)lcm)確定計(jì)算方法。即如何得到最大公約數(shù)和最小公倍數(shù)。最大公約數(shù):即兩個數(shù)的最大公因子。最小公倍數(shù):即能被兩個數(shù)整除的最小整數(shù),可由兩數(shù)的乘積除以最大公約數(shù)得到。第68頁/共104頁

方案一確定范圍:1<=最大公約數(shù)<=兩個數(shù)中的較小數(shù)(min)算法思想:用1,2,3...min逐個去除a和b,如果其中的某一個數(shù)能將兩個數(shù)除盡,說明它是a和b的公因子,將其保留下來。 一級算法: 1.輸入兩個數(shù)a、b 2.比較兩個數(shù)的大小,得到較小數(shù)min 3.FOR(j=1;j<=min;j++) 4.如果a和b均能被j整除,則將j的值暫時保留, 賦值給gcd,否則做下一次循環(huán)。 5.計(jì)算lcm=a*b/gcd 6.輸出gcd、lcm。

二級求精: 4-1if((!(a%j))&&(b%j==0))gcd=j;

第69頁/共104頁程序段如下:

scanf(“%d,%d”,&a,&b); min=(a<b)?a:b; for(j=1;j<=min;j++)if((!(a%j))&&(b%j==0)) gcd=j; lcm=a*b/gcd; printf(“gcd=%d,lcm=%d”,gcd,lcm);第70頁/共104頁方案二:用兩數(shù)中較小的數(shù)作為因子去除該兩數(shù),若均能除盡,表明它就是最大公約數(shù),否則將它減1以后再去除,直到除盡為止。

for(j=min;j>=1;j--){if((!(a%j))&&(b%j==0)) gcd=j;break;}用WHILE語句實(shí)現(xiàn):

j=min;while(a%j||b%j)j--; gcd=j;第71頁/共104頁73三種循環(huán)的比較:三種循環(huán)都可以用來處理同一問題,一般情況下它們可以互相代替。用while和do…while循環(huán)時,循環(huán)變量初始化的操作在while和do…while語句前完成;for語句可以在表達(dá)式1中完成。第72頁/共104頁74三種循環(huán)的比較(續(xù)):while和do…while循環(huán)只在while后面指定循環(huán)條件,且在循環(huán)體中應(yīng)包含使循環(huán)趨于結(jié)束的語句;for循環(huán)可以在表達(dá)式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達(dá)式3中,功能更強(qiáng)。while和for循環(huán)是先判斷表達(dá)式,后執(zhí)行語句;do…while循環(huán)是先執(zhí)行語句后判斷表達(dá)式。第73頁/共104頁75循環(huán)的嵌套定義: 一個循環(huán)體中又包含一個完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。說明:

while循環(huán)、do…while循環(huán)和for循環(huán)都可以進(jìn)行嵌套,而且可以相互嵌套。第74頁/共104頁幾種合法的嵌套結(jié)構(gòu):while(){…while(){…}}do{…do{…}while();}while();for(;;){…for(;;){…}}while(){…do{…}while();

…}for(;;){…while(){…}

…}do{…for(;;){…}

…}while();第75頁/共104頁77使用循環(huán)嵌套時注意:要保證嵌套的每一層循環(huán)在邏輯上都是完整的,避免嵌套交叉使用。要保證循環(huán)到最后有一個跳出循環(huán)的條件,否則會產(chǎn)生死循環(huán)(嵌套循環(huán)中檢查死循環(huán)錯誤,相對來說比較困難)。在編程時,注意循環(huán)嵌套的書寫最好用階梯縮進(jìn)的形式,可使程序?qū)哟畏置?。?6頁/共104頁【例5.18】計(jì)算所有f的值

fij=e

–xi

*sin(xi+yj)已知xi=1.25,2.61,3.27,4.15,5.79;

yj=2.1,2.2,2.3,……,3.0

首先分析fij有多少個?

f11=exp(-1.25)*(sin(1.25+2.1))

f12=

exp(-1.25)*(sin(1.25+2.2))f13=

exp(-1.25)*(sin(1.25+2.3))f14……

f15

f16

f17

f18

f19

f110

f21f22

f23

f24

f25

f26

f27

f28

f29

f210

…f51f52

f53

f54

f55

f56

f57

f58

f59

f510第77頁/共104頁【例5.18】

計(jì)算所有f的值fij=e

–xi

*sin(xi+yj)已知xi=1.25,2.61,3.27,4.15,5.79;

yj=2.1,2.2,2.3,……,3.0分析:對于每一個xi,有10個y值與之對應(yīng),一共有50個f值。用二重循環(huán)實(shí)現(xiàn),外循環(huán)重復(fù)5次,內(nèi)循環(huán)重復(fù)10次?!黊1

y1—f1.1y2—f1.2...

y10—f1.10y1—f5.1y2—f5.2...

y10—f5.10y1—f2.1y2—f2.2...

y10—f2.10↑X2

↑X5

...第78頁/共104頁計(jì)算所有f的值fij=e

–xi

*sin(xi+yj)一級算法:for(i=1;i<=5;i++)

{1.輸入x2.for(j=1;j<=10;j++)

{

y=2.0+j/10;f=exp(-x)*sin(x+y);

輸出f

}

}

思考:為了節(jié)省計(jì)算機(jī)的工作量,如何修改程序使指數(shù)函數(shù)只執(zhí)行5次?在上例中,由于指數(shù)函數(shù)處于內(nèi)層循環(huán),要執(zhí)行50次,而實(shí)際上只有5個不同的x的值,所以指數(shù)函數(shù)只需執(zhí)行5次即可。for(i=1;i<=5;i++)

{1.輸入x2.計(jì)算f1=exp(-x)3.for(j=1;j<=10;j++)

{

y=2.0+j/10;f=f1*sin(x+y);

輸出f

}}

第79頁/共104頁【例5.20】輸出1~100內(nèi)所有的素?cái)?shù)。(窮舉算法)

分析:素?cái)?shù)是大于1,且除了1和它本身外,不能被其它任何整數(shù)所整除的整數(shù)。一級算法:

for(i=2;i<=100;i++)

{1.判斷每一個數(shù)i是否為素?cái)?shù)}1-1for(j=2;j<=i–1;j++)if(i%j!=0)

flag=1; Elseflag=0;1-2if(flag==1)

輸出素?cái)?shù)i

二級算法:

1-1.用2~i-1去除i,考察是否能除盡,設(shè)置標(biāo)識.1-2.判斷標(biāo)識,如果一直除不盡,輸出I是素?cái)?shù)的信息.}二級求精:對于一個數(shù)i,如果從2~i-1都不能將i整除,才能說明i是素?cái)?shù),否則i不是素?cái)?shù)。1-1flag=1;1-2for(j=2;j<=i–1;j++)if(i%j==0)

flag=0;1-3if(flag==1)

輸出素?cái)?shù)i

第80頁/共104頁【例5.20】輸出1~100內(nèi)所有的素?cái)?shù)。優(yōu)化算法:為判斷某數(shù)I是否為素?cái)?shù),用2~sqrt(i)去除該數(shù),若全都除不盡,則是素?cái)?shù)。若被其中一個數(shù)除盡,則不是素?cái)?shù)。二級算法:{1-1.用2~sqrt(i)去除i,考察是否能除盡,設(shè)置標(biāo)識.1-2.判斷標(biāo)識,如果一直除不盡,輸出I是素?cái)?shù)的信息.}

二級求精:

1-1flag=1; 1-2for(j=2;j<=sqrt(i);j++) if(i%j==0)flag=0; 1-3if(flag==1)

輸出素?cái)?shù)i第81頁/共104頁#include<stdio.h>Voidmain(){intI,j,flag;for(I=2;I<100;I++)

{flag=1;for(j=2;j<=sqrt(i);j++){if(i%j==0)flag=0;} if(flag==1)printf(“%disaprimenumber”,I);}以I=49為例j=2flag=149%2=1j=3flag=149%3=1j=4flag=1……..49%7=0flag=0【例5.20】輸出1~100內(nèi)所有的素?cái)?shù)。第82頁/共104頁【例5.20】輸出1~100內(nèi)所有的素?cái)?shù)。思考:如果將for-for嵌套改為for-while嵌套,程序如何修改?For(I=2;I<=100;I++);{j=2;flag=1;while((j<=(sqrt(i))&&flag){if(i%j==0)flag=0;j=j+1;}If(flag)printf(“%disaprimenumber”,i);}

第83頁/共104頁break語句---無條件轉(zhuǎn)移語句一般形式:

break;功能:用在switch語句中使流程跳出switch結(jié)構(gòu),繼續(xù)執(zhí)行switch語句后面的語句。用在循環(huán)體內(nèi),迫使所在循環(huán)立即終止(跳出當(dāng)前循環(huán)體),繼續(xù)執(zhí)行循環(huán)體后面的第一條語句。說明:該語句僅能用于switch語句和循環(huán)語句。第84頁/共104頁【例5.20】輸出1~100內(nèi)所有的素?cái)?shù)。優(yōu)化算法:為判斷某數(shù)I是否為素?cái)?shù),用2~sqrt(i)去除該數(shù),若全都除不盡,則是素?cái)?shù)。若被其中一個數(shù)除盡,則不是素?cái)?shù),不再對此數(shù)繼續(xù)判斷。一級算法:

for(i=2;i<=100;i++){1.2~sqrt(i)去除i,考察是否能除盡2.if除不盡輸出素?cái)?shù)i}二級求精:

1-1flag=1; 1-2for(j=2;j<=sqrt(i);j++) if(i%j==0){flag=0;break;} 第85頁/共104頁Main(){inti,j,flag;For(i=2;i<=100;i++){j=2,flag=1;

for(;j<=sqrt(i);j++)ifi%j==0{flag=0;break;}ifflag

printf(“%disaprimenumber”,i);;}i<=100j=2,flag=1j<=sqrt(i)i%j==0flag=0101100例:I=16進(jìn)入外循環(huán),j=2,flag=1進(jìn)入內(nèi)循環(huán),經(jīng)過1次內(nèi)循環(huán),flag=0,內(nèi)循環(huán)結(jié)束,沒有輸出

flag輸出i例:I=17進(jìn)入外循環(huán),j=2,flag=1進(jìn)入內(nèi)循環(huán),經(jīng)過3次內(nèi)循環(huán)flag=1,內(nèi)循環(huán)結(jié)束,輸出17isaprimenumber

第86頁/共104頁continue語句---無條件轉(zhuǎn)移語句一般形式:

continue;功能: 結(jié)束本次循環(huán)(跳過循環(huán)體中尚未執(zhí)行的語句),接著進(jìn)行是否執(zhí)行下一次循環(huán)的判定。continue和break的區(qū)別:continue只結(jié)束本次循環(huán),而非終止整個循環(huán)。break則是結(jié)束所在循環(huán),不再進(jìn)行條件判斷。第87頁/共104頁【例5.21】輸出100~200之間所有不能被3整除的數(shù)。main(){intn,count=0;for(n=100;n<=200;n++){if(n%3==0)continue;printf("%4d",n);count++;if(count%10==0)printf("\n");}}換成什么,可不改變結(jié)果?第88頁/共104頁90while(表達(dá)式1){……

if(表達(dá)式2)

break;……}語句語句表達(dá)式2表達(dá)式1第89頁/共104頁91while(表達(dá)式1){……

if(表達(dá)式2)

continue;……}語句語句表達(dá)式2表達(dá)式1第90頁/共104頁例設(shè)x和y均為int型變量,則y值為▁▁▁▁

for(y=1,x=1;y<=50;y++){if(x>=10)break;if(x%2){x+=5;continue;}x-=3; }

If(x%2==1)1)x=1;x%2=1;x=x+5=6,結(jié)束本次循環(huán),Y=1+1=22)(6%2==1)條件不滿足,執(zhí)行X=X-3=6-3=3,Y=2+1=33)(3%2==1)條件滿足,則X=X+5=8;

結(jié)束本次循環(huán),Y=3+1=4;4)(8%2==1)不滿足,則X=X-3=5;Y=4+1=5;5)(5%2==1)滿足,則X=X+5=10;Y=5+1=6;6)(X〉=10)條件滿足,執(zhí)行break;結(jié)束循環(huán)。6第91頁/共104頁93

【例5.22】驗(yàn)證哥德巴赫猜想:任一充分大的

偶數(shù),可以用兩個素?cái)?shù)之和表示。算法分析:讀入偶數(shù)n,將它分成p和q,使n=p+q。

一級算法

1

讀入大于3的偶數(shù)N

2

p=1(p從2開始測試,因此賦初值為1)

3do

4

p=p+1;q=n-p

5

p是素?cái)?shù)嗎?

6

q是素?cái)?shù)嗎?

whilep,q有一個不是素?cái)?shù)

7打印n=p+q第92頁/共104頁二級求精:判斷p(q)是否為素?cái)?shù)根據(jù)素?cái)?shù)的定義,某一個

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論