




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中語文生活美文婚姻是合同愛情是藝術(shù)
- 2024浙江金華市金東糧食收儲有限責(zé)任公司招聘3人筆試參考題庫附帶答案詳解
- 2024浙江衢州田園體育旅游發(fā)展有限公司招聘外包制人員2人筆試參考題庫附帶答案詳解
- 2024武漢市新洲區(qū)道觀河水庫管理處公開招聘工作人員筆試參考題庫附帶答案詳解
- 2024廣西崇左寧明縣國林林業(yè)開發(fā)有限公司招聘11人筆試參考題庫附帶答案詳解
- 2024年濱州國有資本投資運(yùn)營集團(tuán)有限公司公開招聘工作人員(含補(bǔ)錄)(11名)筆試參考題庫附帶答案詳解
- 商務(wù)報(bào)告合同范例
- 2024年合肥市醫(yī)療器械檢驗(yàn)檢測中心有限公司社會招聘筆試參考題庫附帶答案詳解
- 2024國家能源集團(tuán)浙江電力有限公司第二批所屬部分企業(yè)系統(tǒng)內(nèi)招聘9人筆試參考題庫附帶答案詳解
- 新常態(tài)下石油企業(yè)財(cái)務(wù)風(fēng)險(xiǎn)管理體系建設(shè)思考
- 幼兒園防欺凌家長會內(nèi)容
- 興隆街辦拆遷規(guī)劃方案
- 2《秦腔》公開課一等獎創(chuàng)新教學(xué)設(shè)計(jì) 統(tǒng)編版高中語文選擇性必修下冊
- 特種作業(yè)人員管理規(guī)定
- 安全管理之雙重預(yù)防機(jī)制
- 建筑工程趕工補(bǔ)償費(fèi)用計(jì)算表
- 第十七課 《虛擬與現(xiàn)實(shí)》(課件)2023-2024學(xué)年北師大版(2013)初中心理健康七年級上冊
- GB/T 15558.4-2023燃?xì)庥寐竦鼐垡蚁?PE)管道系統(tǒng)第4部分:閥門
- 管理學(xué)原理說課課件
- 拆除電桿施工方案
- 管理學(xué)原理 王光健版
評論
0/150
提交評論