循環(huán)控制課件_第1頁(yè)
循環(huán)控制課件_第2頁(yè)
循環(huán)控制課件_第3頁(yè)
循環(huán)控制課件_第4頁(yè)
循環(huán)控制課件_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第六章循環(huán)控制

用于解決語(yǔ)句的重復(fù)執(zhí)行,以克服一

條語(yǔ)句只能執(zhí)行一次的限制。

■幾種簡(jiǎn)要的循環(huán)結(jié)構(gòu)

■break和continue語(yǔ)句

■for語(yǔ)句的變化形式

■循環(huán)嵌套

第六章循環(huán)控制

■問(wèn)題:

、10

求sum=2i

i=l

intsum;

sum=1+2+3+4+5+6+7+8+9+10;

、100

求sum=2i?

i=l

求sum=2i?(n由鍵盤輸入)

i=l

第六章循環(huán)控制

■問(wèn)題:

、10

求sum=2i

i=l

i=1;sum=O;

sum=部分累加和+i(i=l??10)

sum=sum+i;i++;\

......,十行

sum=sum+i;i++;/

goto語(yǔ)句以及用goto語(yǔ)句構(gòu)成循環(huán)

一般形式:goto語(yǔ)句標(biāo)號(hào);

其中標(biāo)號(hào)是一個(gè)有效的標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符加上

一個(gè)“:”一起出現(xiàn)在函數(shù)內(nèi)某處,執(zhí)行g(shù)oto語(yǔ)

句后,程序?qū)⑻D(zhuǎn)到該標(biāo)號(hào)處并執(zhí)行其后的語(yǔ)句。

另外標(biāo)號(hào)必須與goto語(yǔ)句同處于一個(gè)函數(shù)中,但

可以不在一個(gè)循環(huán)層中。通常goto語(yǔ)句與if條

件語(yǔ)句連用,當(dāng)滿足某一條件時(shí),程序跳到標(biāo)

號(hào)處運(yùn)行。

例6.1使用goto語(yǔ)句實(shí)現(xiàn)求解1?100累計(jì)和

main()“l(fā)oop:"為語(yǔ)句標(biāo)號(hào)

{intn=l,sum=0;其命名遵循標(biāo)識(shí)符

命名規(guī)則。

loop:sum+=n;n++;

goto語(yǔ)句格式:goto

if(n<=100)gotoloop;標(biāo)號(hào),功能為:使

printf("sum=%d\n'',系統(tǒng)轉(zhuǎn)向標(biāo)號(hào)所在

sum);的語(yǔ)句行執(zhí)行。

■結(jié)構(gòu)化程序設(shè)計(jì)方法,主張限制使用

goto語(yǔ)句。因?yàn)闉E用goto語(yǔ)句,將會(huì)導(dǎo)

致程序結(jié)構(gòu)無(wú)規(guī)律、可讀性差。

另外,從功能上說(shuō),for語(yǔ)句可完全代

替當(dāng)型循環(huán)語(yǔ)句while,所以該語(yǔ)句也不

是必需的。

for語(yǔ)句

■1.用for語(yǔ)句實(shí)現(xiàn)

ftinclude<stdio.h>

main()

inti,sum=0;_^定重旻次裝

for(i=1;iv=100;i++)

sum=sum+i;-

printf(”%cT,siim);重復(fù)執(zhí)行的語(yǔ)句

for語(yǔ)句

■for語(yǔ)句格式:

for(初值飛達(dá)式;循環(huán)繼續(xù)表達(dá)式;循環(huán)變化表達(dá)式)

一條節(jié)反復(fù)執(zhí)行的白句;/

三個(gè)獨(dú)立的表達(dá)式

fbr(i=l;i<=10;i++)

sum=sum+i;

for語(yǔ)句

■for語(yǔ)句格式:

for(初值表達(dá)式;循環(huán)繼續(xù)表達(dá)式;循環(huán)變化表達(dá)式)

一條要反復(fù)執(zhí)行的語(yǔ)句;

執(zhí)行流程:

for語(yǔ)句

IJ

Ifbr(i=Li<=10E++)

■sum=sum+i^->

for語(yǔ)句

■從鍵盤輸入100個(gè)整數(shù),求其中正數(shù)之和。

include<stdio.h>

?重復(fù)步驟:

main()

(1輸入一個(gè)數(shù)

inti,sum=0,x;2對(duì)正數(shù)求和

for(i=0;i<100;i++){

scanf("%cT,&x);?共重復(fù)100次

if(x>0)sum=sum+x;

)

printf(”%d”,sum);

for語(yǔ)句

■從鍵盤輸入100個(gè)整數(shù),求其中正數(shù)的平均數(shù)。

ftinclude<stdio.h>

main(){

inti,count=0,x;

floatsum=0;

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

{scanf("%d”,&x);

if(x>0){sum=sum+x;count++;}

)

sum/=count;

printf("%fH,sum);

)

for語(yǔ)句

■用for語(yǔ)句實(shí)現(xiàn)10+9+8+7+6+5+4+3+2+1

ttinclude<stdio.h>

main()

(

inti,sum=0;

for(i=10;i>0;i--)

sum=sum+i;

printf(H%dH,sum);

while語(yǔ)句

■while(條件)

重復(fù)執(zhí)行的一條語(yǔ)句復(fù)合語(yǔ)句

不滿足

后一語(yǔ)句;

二while語(yǔ)句

[■while實(shí)現(xiàn)要點(diǎn)

整個(gè)循環(huán)由i控制,i稱循環(huán)變量

1i=1;循環(huán)變量必須有初值

.while(i<=10)繼續(xù)循環(huán)的條件

.{sum=sum+i;

.循環(huán)體j++;循環(huán)變量的改變

例6.2用while語(yǔ)句求1?100的累計(jì)和

main()

{inti=l,sum=0;/*初始化循環(huán)控制變量i和累計(jì)器

sum*/

while(i<=100)

{sum+=i;/*實(shí)現(xiàn)累加*/

i++;/*循環(huán)控制變量i增1*/

printf("sum=%d\n”,sum);

程序運(yùn)行情況如下:

sum=5050

,循環(huán)體如果包括一個(gè)以上語(yǔ)句,應(yīng)該用花括號(hào)括起來(lái),

■形成復(fù)合語(yǔ)句

while語(yǔ)句

■for語(yǔ)句與while語(yǔ)句比較

main()

{inti,sum=0;

for(i=1;i<=10;i++)while(i<=10)

sum=sum+i;{sum=sum+i;

printf("%d\sum);、i++;)

do-while語(yǔ)句

■用do-while語(yǔ)句實(shí)現(xiàn)

do-while語(yǔ)句格式:

do一條要反復(fù)執(zhí)行的語(yǔ)句;

while(條件表達(dá)式)

「while是先判別條件,再?zèng)Q定是否循環(huán);

do-while是先至少循環(huán)一次,然后再根

據(jù)循環(huán)的結(jié)果決定是否繼續(xù)循環(huán)。

do-while語(yǔ)句

■do-while語(yǔ)句實(shí)現(xiàn)流程

do-while語(yǔ)句

■do....while與while的用法有所不同

例:輸入一串正數(shù)求和,例:輸入一串正數(shù)求和,

直到數(shù)據(jù)學(xué)好?直到數(shù)據(jù)為非正數(shù)結(jié)束。

main()

main()

{intx,sum=0;

{intx,sum=0;scanf(66%d5\&x);

do{while(x>0){

scanf("%d”,&x);sum+=x;

sum+=x;scanf("%d”,&x);

}while(x>0))

printfV'sum=%d'',sum-x);printf(66sum=%d5\sum);

■編寫數(shù)列求和程序:

1+l/2+1/3+1/4+....+l/n

l/l+l/2+1/3+1/4+....+l/n

main()

{inti,n;floaty=0;

scanf("%d\&n);

for(i=1;i<=n;i++)

y+=1.0/i;

printf(Hn=%dy=%f\nH,n,y);

循環(huán)結(jié)構(gòu)的實(shí)現(xiàn)

循環(huán)實(shí)現(xiàn)要點(diǎn)「(1)找出什么要反復(fù)執(zhí)行

(2)重復(fù)到何時(shí)結(jié)束

假定輸入x=12345,逆序輸出。從低位開始分割

12345%10=5(1)反復(fù)執(zhí)行x%10

12345/10=1234x=x/10

1234%10=4(2)何時(shí)結(jié)束x==0

1234/10=123scanf(66%d5\&x);

123%10=3

123/10=12while(x>0)

12%10=2{printf(66%d

12/10=1x=x/10;

1%10=1}

1/10—0結(jié)束

循環(huán)結(jié)構(gòu)的實(shí)現(xiàn)

循環(huán)實(shí)現(xiàn)要點(diǎn):(1)找出什么要反復(fù)執(zhí)行

(2)重復(fù)到何時(shí)結(jié)束

假定輸入x=12345順序輸出,從高位開始分割

12345/10000=1開始如何得至

12345%10000=2345(1)Uloooo

2345/1000=2找輸入數(shù)據(jù)的位數(shù)

2345%1000=345d=l;

345/100=3for(i=10;x/i>0;i=i*10)

345%100=45

45/10=4d++;

45%10=5⑵每次循環(huán)縮小10倍

5/1=5⑶縮小到。結(jié)束

5%1=5

§6.2break和continue語(yǔ)句

例:讀入一行字符(不超過(guò)io個(gè)),給予輸出

include〃stdio.h〃有兩個(gè)條件決定循環(huán)的結(jié)束

main()main()

{charc;{charc;

inti=0;inti=0;

for(i=0;i<c=getchar();

{c=getchcfor(i=0;i<10&&c!='\n';i++)

if(c==,{putchar(c);兩個(gè)結(jié)束條件合并

putcharc=getchar();

)

continue流程

程序:

fbr(表1;表2;表3)

(語(yǔ)句1;

if(...)continue;

語(yǔ)句2;

)

for后的下一條語(yǔ)句;

for的下一條語(yǔ)句

continue語(yǔ)句例子

ftinclude〃stdio.h〃輸入:abc/

main()efgh/

{charc;123/

inti;輸出:abcefghl

for(i=0;i<10;i++)/*i>=10是結(jié)束條件*/

{c=getchar();

if(c='\n')continue;

putchar(c);/*c二回車也是結(jié)束條件*/

)

}問(wèn):若把break改成continue,

結(jié)果會(huì)怎樣?

§6.3for語(yǔ)句的變化形式

原形:inti,sum=0;

for(i=l;i<=10;i++)sum=sum+i;

§6.3for語(yǔ)句的變化形式

原形:inti,sum=0;

for(i=1;i<=10;i++)sum=sum+i;

§6.3for語(yǔ)句的變化形式

原形:inti5sum=0;

for(i=1;iv=10;i++)sum=sum+i;

變形1inti=1,sum=0;

for(;i<=10;i++)sum=sum+i;

變形2inti=1,sum=0;

for(;i<=10;){sum=sum+i;i++;}

變形3inti=1,su*=0;

for(;;){if(i>10)break;

無(wú)限宿環(huán)sum=sum+i;i++}

變形4inti,sum;

for(i=1,sum=0;i<=10;sum+=i,i++);

不管那一種變形,循環(huán)變量的初值、判斷和變化

表達(dá)式仍都存在,只是改變了所處的位置。

不管那一種變形,三個(gè)表達(dá)式的功能缺一不

可,且執(zhí)行流程不得改變。

原形:inti,sum=O;

for(i=1;i<=10;i++)sum=sum+i;

§6.4循環(huán)嵌套

一循環(huán)體中又包含了循環(huán)語(yǔ)句稱循環(huán)嵌套。

例:求S=1!+2!+3!+...+n!

分析:首先要循環(huán)n次來(lái)累加i!

for(i=l;i<=n;i++)

s=s+i!;

如果存在求階乘的運(yùn)算!,計(jì)算完成。

for(i=l;i<=n;i++)

(;

t=t*i;

§6.4循環(huán)嵌套

例:已知小雞0.5文錢/只,公雞2文錢/只,

母雞3文錢/只,現(xiàn)要求100文錢正好買100只雞,

請(qǐng)給出所有的組合。

組合問(wèn)題用計(jì)算機(jī)解,通常采取“湊”的辦法

母雞可能的只數(shù):0—100hen

公雞可能的只數(shù):0—100cock

小雞可能的只數(shù):0—100chick

然后對(duì)三種雞所有的組合方式,排除不等于

100元和100只的那些組合。

R§6.4循環(huán)嵌套

main()

■{

■intchick,cock,hen;

for(cock=0;cock<=100;cock++)cock=0->100

for(hen=0;hen<=100;hen++)hen=0^100

for(chick=0;chick<=100;chick++)chick=0

pf(cock+hen+chick==100&&~>100

cock*2+hen*3+chick*0.5==100)

?printf("cock=%dhen=%d

chick=%d\n”,cock,hen,chick);

§6.4循環(huán)嵌套

運(yùn)行結(jié)果:

cock=0hen=20chick=80

cock=5hen=17chick=78

cock=10hen=14chick=76

cock=15hen=11chick=74

cock=20hen=8chick=72

cock=25hen=5chick=70

cock=30hen=2chick=68

§6.4循環(huán)嵌套

運(yùn)行過(guò)程:

cock二°

"ken=Ochicl^p?100共101次〕

hen=lchick/?100共101次:

■hen=100chick=0?100共101次J次

cock=l

-口hen=0chfek=0?1Op10

共101次I101、多

~hen二100——chick-0-100共101次J次廣萬(wàn)

、r

cock=100

hen=0chick=0?100共101次1101

hen=100chick=0?100共101次j次J

§6.4循環(huán)嵌套

main()

(

intchick,cock,hen;

for(cock=0;cock<=50;cock++)

for(hen=0;hen<=33;hen++)

{chick=100-cock-hen;

if(cock*2+hen*3+chick*0.5==100)

printf("cock=%dhen=%d

chick=%d\nH,cock,hen,chick);

)

§6.4循環(huán)嵌套

循環(huán)嵌套均是大循環(huán)包小循環(huán)

絕對(duì)不允許循環(huán)體交叉!

for()

for()■

{.....{………

—do{do{-

>3.....}while]...,-

/\}while(….)〉

§6.4循環(huán)嵌套

main()

(

intchick,cock,hen;

for(cock=0;cock<=50;cock++)

{for(hen=0;hen<=33;hen++)

{chick=100-cock-hen;

if(cock*2+hen*3+chick*0.5==100)

)

§6.4循環(huán)嵌套

main()

結(jié)論:break只能終止內(nèi)層循環(huán)

intchick,cock,hen,flag=0;

for(cock=0;cock<=50;cock++)

{for(hen=0;hen<=33;hen++)

{chick=100-cock-hen;

if(cock*2+hen*3+chick*0.5==100)

}{flag=1;br

“接力賽”第一棒

if(flag)break]

)printf(......“接力賽”第二棒

例題

求算式】__L+L_-+

612203042_____-?,“一

置到t第40項(xiàng)的和

main()

{inti,s=l;第i項(xiàng):l/(i*(i+l))

floaty=0;

符號(hào):s=l

for(i=l;i<=40;i++)

{y=y+s/((float)

s=-s;

}

printf("%f”,y);

例題

求算式】__L+L_-+

612203042_____-?,“一

置到t第40項(xiàng)的和

main()

{inti,s=-l;第i項(xiàng):l/(i*(i+l))

floaty=l;

符號(hào):s=l

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

{y=y+s/((float)

s=-s;

}

printf("%f”,y);

例題

編禾ftinclude<stdio.h>

main()

{inti,j;

printfT〃);第1行先輸出5個(gè)空格

for(i=l;i<10;i++)printf(〃(%d)〃,i);

putchar('\n');

for(i=l;i<10;i++){i代表行

printf(〃(%d)〃,i);

for(j=l;j<10;j++)j代表列

printf(z/%2d〃,i*j);

putchar('\n');

例題

下歹ll程序求Sn=a+aa+aaa+……+aa...aa(n個(gè)己)的值,

sn=2+22+222+2222+22222,其值應(yīng)為24690。

#include<stdio.h>

Imain()

inta,n,count=lrsn=0,tn=0;

scanf(''%d^d”,&a,&n);

for(count=l;count<=n,count++){

tn=tn*10+a;tn=0*10+2=2

sn=sn+tn;tn=2*10+2=22

}tn=22*10+2=222

printf(''th一snis:%d\n”,sn);

)

[程序舉例

■l.輸入一行字符,統(tǒng)計(jì)其中的單詞數(shù),單詞之間用

格分隔開。

如:輸入youareastudent則有4個(gè)單詞。

智^思路:

M)用空格區(qū)分每一個(gè)單詞;

■)遇到空格,則表示前一個(gè)單詞結(jié)束;(word=0)

(3)遇到一個(gè)非空格:若前面一個(gè)字符是空格(即

ord=0),則開始一個(gè)新單詞(word=1,計(jì)數(shù)加1,;

若前面一個(gè)字符是非空格(即word=1),則仍然是同

■^個(gè)單詞。

wHclude<stdio.h>

main()

■charstring[81];

inti,num=O,word=0;

gets(string);

.for(i=0;string[i]!=i\0,;i++)

if(string[i]=='')word=0;

elseif(word==0){

word++;num++;

u,,

printf(Thereare%dwordsintheline.\nJnum);

程序舉例

2.打印以下圖案:

$

$$$

eeeeed

e金金e金e金e金e金e金e

wwDwweCL

I$$$$

分析:分上下兩部分考慮

對(duì)上半部每一行:$數(shù)+空格數(shù)=列數(shù)(n)

行數(shù)$數(shù)空格數(shù)(單邊)

.........$.......:11(n-1)/2

$$$|22*2-1=3(n-3)/2

eeeee32*3-1=5(n-5)/2

金讓讓金金金企

VVVVVVV42*4-1=7(n-7)/2

一般地:2*i-1(n-(2*i-1))/2

分析:

對(duì)下半部每一行:$數(shù)+空格數(shù)=列數(shù)(n)

行數(shù)空格數(shù)(單邊)$數(shù)

$11n-1*2

$$$22n-2*2

eeeee33n-3*2

■■

e金讓e讓e金e金e金e金e11n-i*2

$$$

?……$……

■#include<stdio.h>

■main()

intn_blank,n_dollar,i,j,n,m;

scanf("%d”,&n);

m=(n+1)/2;

for(i=1;i<=m;i++){

n_dollar=2*i-1;

n_blank=(n-n__dollar)/2;

for(j=0;j<n_blank;j++)

putcharC

forG=0;j<n_dollar;j++)

putchar($);

putchar(J\n5);

)

for(i=1;i<m;i++){

n_blank=i;

n_dollar=n-2*n_blank;

for(j=0;j<n_blank;j++)

putchar(fi

for(j=0;j<n_dollar;j++)

putcharC$9);

putchar(i\n,);

)

return0;

)

例6.6用公式求TT直到某一項(xiàng)的絕對(duì)值小于10-6

#include<math.h>

main()

{Fl,pi=0,n=4,s=l

ints;

當(dāng)It|

floatn,t,pi;

t=l,pi=0;n=l.0;s=l;pi=pi+t

while(fabs(t)>le-6)

{pi=pi+t;n=n+2

n=n+2;s=-s

s=-s;

t=s/n;t=s/n

pi=pi*4

pi=pi*4;

printf(〃pi=%10.6f\n〃,pi);

■[例6.7]求Fibonacci數(shù)列的前40個(gè)數(shù)。該數(shù)列的

生成方法為:F.l,F2=l,Fn=Fnl+Fn2

(n>=3),即從第3個(gè)數(shù)開始,每個(gè)數(shù)等于前2

個(gè)數(shù)之和。

fbri=lto20

輸出fl,f2

fl=fl+f2

f2=f2+fl

main()

{longintfl=l,f2=l;/*定義并初始化數(shù)列的頭2個(gè)

數(shù)*/

inti=l;/*定義并初始化循環(huán)控制變量i*/

fbr(i=l;i<=20;i++)/*1組2個(gè),20組40個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論