第4章循環(huán)語句和轉(zhuǎn)移語句_第1頁
第4章循環(huán)語句和轉(zhuǎn)移語句_第2頁
第4章循環(huán)語句和轉(zhuǎn)移語句_第3頁
第4章循環(huán)語句和轉(zhuǎn)移語句_第4頁
第4章循環(huán)語句和轉(zhuǎn)移語句_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

循環(huán)語句和轉(zhuǎn)移語句第

4章第4章循環(huán)語句和轉(zhuǎn)移語句

4.1循環(huán)的概念

4.2for

循環(huán)

4.3while

循環(huán)

4.4dowhile

循環(huán)

4.5多重循環(huán)

4.6轉(zhuǎn)移語句

4.7程序舉例4.1循環(huán)的概念1.問題的提出編寫下列程序∑i=1+2+3+4+5=?i=15S=0;S=S+1;S=S+2;S=S+3;S=S+4;S=S+5;6條賦值語句100?4.1循環(huán)的概念2.什么是循環(huán)用C語言編寫下列程序∑s=1+2+3+4+5=?S=15S=0;S=S+1;S=S+2;S=S+3;S=S+4;S=S+5;6條賦值語句

循環(huán)思想:

有規(guī)律重復(fù)執(zhí)行相同操作的過程稱為循環(huán);

實(shí)現(xiàn)這種循環(huán)操作的程序稱為程序的循環(huán)結(jié)構(gòu)。4.1循環(huán)的概念3.解決循環(huán)的關(guān)鍵用C語言編寫下列程序∑s=1+2+3+4+5=?S=15S=0;S=S+1;S=S+2;S=S+3;S=S+4;S=S+5;6條賦值語句確定循環(huán)的規(guī)律(循環(huán)條件、循環(huán)條件的修改)

確定重復(fù)的內(nèi)容(算法)S=0;i=1;S=S+i;i++;4.1循環(huán)的概念3.解決循環(huán)的關(guān)鍵p=1;p=p*1;p=p*2;p=p*3;……;p=p*20;p=1i=1p*=ii++用C語言編寫下列程序∏p=1*2*3*4*…20=?S=120其它問題如:1+1/2+1/3+……1/n1-1/3+1/5-……等4.1循環(huán)的概念4.循環(huán)的種類C語言可實(shí)現(xiàn)的循環(huán):for

循環(huán)while

循環(huán)do~while

循環(huán)用goto

和if構(gòu)成循環(huán)多重循環(huán)4.2for循環(huán)1.for語句的一般形式for([表達(dá)式1];[表達(dá)式2];[表達(dá)式3])

循環(huán)體;表達(dá)式2成立嗎?求解表達(dá)式3真(非0)假(0)求解表達(dá)式1循環(huán)體語句執(zhí)行流程注:

①表達(dá)式1用于循環(huán)控制變量賦初始值,它只能執(zhí)行一次;②表達(dá)式2是循環(huán)條件;③表達(dá)式3用于對循環(huán)變量的修改,以使循環(huán)能夠結(jié)束。2.for語句舉例用for循環(huán)編寫下列程序∑i=1+2+3+4+5i=15#include<stdio.h>voidmain(){inti,sum=0;

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

sum+=i;

printf("%d",sum);}i<=5?i←i+110i=1sum←sum+i打印sum的值循環(huán)體2.for語句舉例用for循環(huán)編寫下列程序

#include<stdio.h>voidmain(){inti,sum=0;

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

sum+=i;

printf("%d",sum);}i<=

100?i=i+110i=1sum=sum+i打印sum的值3.for語句說明①for語句的三個(gè)表達(dá)式都可以缺省,但兩個(gè)分號不能缺省;②若在for語句之前已經(jīng)對循環(huán)控制變量賦初值,則表達(dá)式1

可以缺??;例:i=1;for(;i<=5;i++)sum=sum+i;for(i=1;i<=5;i++)sum=sum+i;3.for語句說明③缺省表達(dá)式2,即不判斷循環(huán)條件,循環(huán)將無終止的執(zhí)行,即認(rèn)為表達(dá)式2始終為真;為了結(jié)束循環(huán),在循環(huán)體內(nèi)用if和break控制循環(huán)結(jié)束。if(條件)break;for(i=1;;i++)sum=sum+i;for(i=1;1;i++)sum=sum+i;④可以把表達(dá)式3改為表達(dá)式語句移到循環(huán)體的尾部,作為循環(huán)體的一部分。for(i=1;i<=100;

)

{

sum=sum+i;

i++;

}⑤可以省略表達(dá)式1

和表達(dá)式3,即只給循環(huán)條件。如:i=1;for(;i<=100;){sum=sum+i;i++;}構(gòu)成復(fù)合語句

簡化為:

i=1;for(;i<=100;)sum=sum+i++;⑥如果循環(huán)體中沒有任何語句,則應(yīng)該加一個(gè)分號。例如:

s=0;

for(i=1;i<=100;s=s+i++);

F1=1 (n=1) F2=1 (n=2)Fn=Fn-1+Fn-2(n>=3) 2=1+13=1+2 5=2+38=3+5 …在一次循環(huán)中計(jì)算兩項(xiàng),遞推公式為:

F1=1F2=1(初值)

F1=F1+F2 F2=F2+F1例

求Fibonacci數(shù)列1,1,2,3,5,8的前16個(gè)數(shù)#include<stdio.h>voidmain()

{longintf1,f2;

int

i,n;

printf(“\nInputn:”);

scanf(“%d”,&n);f1=f2=1;

for(i=1;i<=n/2;i++){printf(“%d\t%d\n”,f1,f2);f1=f1+f2;f2=f2+f1;}

if(n%2)printf(“%d\n”,f1);}Inputn:16

1 12 35 813 2134 5589 144233 377610 987前16個(gè)數(shù)N為奇數(shù)時(shí)再輸出一項(xiàng)小結(jié) for

語句的特點(diǎn)1、使用了三個(gè)表達(dá)式2、循環(huán)控制變量可以在循環(huán)體內(nèi)使用,也可以不使用,僅用來控制循環(huán)次數(shù)。3、從正常出口離開循環(huán)時(shí),循環(huán)控制變量會超過終值。4.3while循環(huán)1.while語句的一般形式while(表達(dá)式)循環(huán)體;功能:計(jì)算并判斷表達(dá)式的值;若值為0,則結(jié)束循環(huán),退出while

執(zhí)行后續(xù)語句;若值為非0,則執(zhí)行循環(huán)體語句;依次往復(fù)。特點(diǎn):先判斷表達(dá)式,后執(zhí)行循環(huán)體。表達(dá)式成立嗎?循環(huán)體語句真(非0)假(0)執(zhí)行流程2.while語句說明①循環(huán)體有可能一次也不執(zhí)行。②循環(huán)體可為任意類型語句,復(fù)合語句{}不能忘記。③下列情況,退出while循環(huán):條件表達(dá)式不成立(為零);循環(huán)體內(nèi)遇break、return、goto;④無限循環(huán):while(1)

循環(huán)體語句;⑤循環(huán)體中必須有使循環(huán)趨于結(jié)束的語句,如i++

。3.while語句舉例用while循環(huán)編寫下列程序∑i=1+2+3+4+5i=15#include<stdio.h>voidmain(){int

s,i;s=0;i=1;

while(i<=5)

{s=s+i; i++; }

printf(”Sum=%d”,s);}i<=5?i←i+110s=0,i=1s←s+i打印sum的值循環(huán)體循環(huán)初值循環(huán)終值循環(huán)變量增殖3.while語句舉例用while循環(huán)編寫下列程序∑i=1+2+3+4…+100i=1100#include<stdio.h>voidmain(){int

s,i;s=0;i=1;

while(i<=100)

{s=s+i; i++; }

printf(”Sum=%d”,s);}i<=100?i←i+110s=0,i=1s←s+i打印sum的值改變終值

例:將鍵盤輸入復(fù)制到屏幕,直到 按下一個(gè)回車鍵為止,程序如下:#include“stdio.h”voidmain(){charc;c=getchar();

while(c!=‘\n’){putchar(c);c=getchar();}}#include“stdio.h”voidmain(){charc;while((c=getchar())!='\n')

putchar(c);}abcdef

abcdef

例:利用輾轉(zhuǎn)相除法, 求兩個(gè)正整數(shù)的最大公約數(shù)算法:

⑴若J=0,則I為最大公約數(shù)

⑵若J!=0

將I除以J,余數(shù)為temp

I=J;J=temp

轉(zhuǎn)⑴#include<stdio.h>voidmain(){int

i,j,temp;

printf(“\n\tEnter2integers:”);

scanf(“%d%d”,&i,&j);

while(j){temp=i%j;i=j;j=temp;}

printf(“Gcd=%d\n”,i);}Enter2integers:12

18

Gcd=6分析:

i j temp 12 18 12 18 12 6 12 6 0 6 0(退出循環(huán))小結(jié) while

語句的特點(diǎn)1、循環(huán)一般由條件控制。2、在循環(huán)體內(nèi)至少有一條語句能對循環(huán)條件產(chǎn)生影響,以防止死循環(huán)。

4.4do-while循環(huán)1.do-while語句的一般形式

do

循環(huán)體

while(表達(dá)式);功能:先執(zhí)行一遍循環(huán)體,再判斷表達(dá)式,當(dāng)表達(dá)式的值為非0(真)時(shí),返回重新執(zhí)行循環(huán)體;如此反復(fù),直到表達(dá)式的值為0(假)時(shí)退出循環(huán)。特點(diǎn):先執(zhí)行循環(huán)體,后判斷循環(huán)條件(表達(dá)式)是否成立,即循環(huán)體至少執(zhí)行一次。do循環(huán)體表達(dá)式成立嗎?假(0)真(非0)while執(zhí)行流程2.do-while語句說明①循環(huán)體至少能執(zhí)行一次。②循環(huán)體可為任意類型語句,復(fù)合語句{}不能忘記。③do…while允許嵌套。④do…while(1)表示無窮循環(huán)。⑤while后必須跟();。3.while語句舉例用do-while循環(huán)編寫下列程序∑i=1+2+3+4+5i=15#include<stdio.h>voidmain(){int

s,i;s=0;i=1;do

{s=s+i;i++;}while(i<=5);

printf(”Sum=%d”,s);}循環(huán)體循環(huán)初值循環(huán)終值循環(huán)變量增殖i<=5?i←i+110s=0,i=1s←s+i打印sum的值注意“;”

例:從鍵盤輸入一個(gè)字符,判別其是否為大寫字母,如果是,則將其轉(zhuǎn)換為小寫字母并輸出;否則不轉(zhuǎn)換,不輸出。#include“stdio.h”#include“ctype.h”voidmain(){charch,answer;

do

{printf(“Enteraletter:”);

ch=getchar();

if(isupper(ch))

printf(“%c”,ch+’a’-’A’);getchar();

printf(“\nDoyouwanttodo

again?(Y/N)”);answer=getchar();

getchar();

}while(answer==‘Y’||answer==‘y’);}y

清除輸入的回車鍵Enteraletter:A

aDoyouwanttodoagin?(Y/N))Enteraletter:b

Doyouwanttodoagin?(Y/N))n

清除輸入的回車鍵測試c是否為大寫字母4.5多重循環(huán)1.什么是

多重循環(huán)一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu),稱為循環(huán)嵌套。嵌套多層的循環(huán)結(jié)構(gòu)又稱為多重循環(huán)。2.三種循環(huán)的

多重循環(huán)形式while(){······while(){······}······}for(;;){······for(;;){······}······}do{······do{······}while();······}while();while(){······for(;;){······}······}for(;;){······do{······}while();······}while(){······do{······}while();······}外循環(huán)內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)3.

循環(huán)嵌套說明⑴三種循環(huán)可互相嵌套,層數(shù)不限。⑵外層循環(huán)可包含兩個(gè)以上內(nèi)循環(huán),但不能相互交叉。⑶嵌套循環(huán)的跳轉(zhuǎn)應(yīng)禁止:①從外層跳入內(nèi)層。②跳入同層的另一循環(huán)。如

for(;;){……do{……}while();……while(){……}…...}內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)

例:打印九九乘法表#include<stdio.h>voidmain(){int

i,j;

for(i=1;i<10;i++){for(j=1;j<=i;j++)

printf("%d*%d=%d",i,j,i*j);

printf("\n");}}對第一個(gè)乘數(shù)循環(huán)1-9對第二個(gè)乘數(shù)循環(huán)1-i輸出完一行后輸出換行符4.6轉(zhuǎn)移語句1.break語句break語句可以用于兩個(gè)地方:在switch語句中,用于中斷語句的執(zhí)行。在循環(huán)語句中,break語句常與if語句配合使用,當(dāng)條件成立后就跳出循環(huán)體,提前結(jié)束循環(huán)。break語句示例此循環(huán)本是無限循環(huán),因加上了break語句,使程序在輸入字符常量′!′時(shí)就終止循環(huán)?!璮or(;;){scanf(″%c″,&ch);

if(ch==′!′)

break;

else

printf(″%c″,ch);}

例:求2~M之間的全部素?cái)?shù)。

要判斷一個(gè)數(shù)n是否素?cái)?shù),只需判斷2~之間的整數(shù)是否 能整除n,如能整除,則不是素?cái)?shù)。#include<stdio.h>

#include″math.h″

voidmain()

{intn,m,i,j,l=0;

scanf(″%d″,&m);for(n=2;n<=m;n++){i=sqrt(n);

for(j=2;j<=i;j++)if(!(n%j))break;

if(j>=i+1)/*若是素?cái)?shù)*/

if(l<5)/*控制輸出一排的個(gè)數(shù)*/

{printf(″%d\t″,n);l++;}else{printf(″%d\n″,n);l=0;}}}m:給定的一個(gè)自然數(shù)n:2~m中的任意自然數(shù)i:存放n的平方根值j:2~i之間的整數(shù)l:一排輸出素?cái)?shù)計(jì)數(shù)器100

23571113171923293137414347535961677173798389972.continue語句continue語句用于提前結(jié)束循環(huán)中的一輪循環(huán)。當(dāng)程序執(zhí)行到continue語句時(shí),就跳過循環(huán)中后面還未執(zhí)行的語句,回到循環(huán)的起始處,繼續(xù)進(jìn)行下一輪的循環(huán)。continue語句常與if語句聯(lián)合起來使用,以便在滿足一定條件時(shí)提前結(jié)束本輪循環(huán)。continue語句示例例如

對除5的倍數(shù)以外的1~100的數(shù)求和

…s=0;

for(i=1;i<=100;i++){if(!(i%5))

continue;

s+=i;}

printf(″SUM=%d\n″,s);…if(i%5==0)3.goto

語句goto語句作用:將控制轉(zhuǎn)到標(biāo)號所指定的語句去執(zhí)行。goto語句格式:

…或:goto

標(biāo)號;

標(biāo)號:語句標(biāo)號:語句…goto

標(biāo)號;…語句使用說明goto語句對結(jié)構(gòu)程序設(shè)計(jì)有影響。它將使程序的結(jié)構(gòu)不清晰。應(yīng)盡可能用break和continue語句代替goto

不能用goto語句從循環(huán)的外層跳到循環(huán)的內(nèi)層,否則會導(dǎo)致程序的混亂。4.7程序舉例求最大、最小和平均級數(shù)求和迭代算法打印圖案窮舉法

置初值的方法一般有兩種:

⑴極值法: 取有界數(shù)據(jù)的上界作為最小值的初值, 取有界數(shù)據(jù)的下界作為最大值的初值。

⑵成員法: 取一批數(shù)據(jù)的第一個(gè)數(shù)作為最大值和 最小值的初值 本程序采用極值法【例1】求10個(gè)大于0小于100的數(shù)中的最大數(shù)和最小數(shù)求最大、最小和平均

#include<stdio.h>voidmain()

{inta,i,max,min;max=0;min=100;

for(i=1;i<=10;i++){scanf(“%d”,&a);if(max<a)max=a;if(min>a)min=a;}

printf(“Max=%d,Min=%d\n”,max,min);}20

Max=98,Min=2086

45

50

90

88

28

98

77

27

【例2】求每個(gè)班的平均成績,各班人數(shù)不等#include<stdio.h>voidmain(){int

m,n,i,j;floatscore,sum,aver;

printf("Inputnumbersofclasses:");

scanf("%d",&m);

for(i=1;i<=m;i++){sum=0;n=0;

printf("Inputscore:");

while(scanf("%f",&score),score>=0) {sum=sum+score; n++; }aver=sum/n;

printf("class%d,average=%5.1f\n",i,aver);}}累加器和計(jì)數(shù)器的初始化輸入負(fù)數(shù)表示該班成績輸入結(jié)束

【例3】利用公式計(jì)算

ex=1+x/1!+x2/2!+x3/3!+……+xn/n!對于求級數(shù)的和,常用兩類方法:

1)通項(xiàng)公式法

t0=1ti=xi/i!(i=1,2,…….n)

2)遞推公式法

t0=1ti=ti-1.x/i(i=1,2,……n)對于本題使用遞推公式法計(jì)算量要小。程序如下:級數(shù)求和#include<stdio.h>voidmain(){inti,n;doublet,x,ex;ex=1.0;

/*第一項(xiàng)*/t=1.0;

printf(“Entervalueofn,x:”);

scanf(“%d%lf”,&n,&x);

for(i=1;i<n;i++){t*=x/i;/*從第二項(xiàng)開始*/ex+=t;/*累加*/}

printf(“exp(%f)=%lf\n”,x,ex);}Entervalueofn,x:20

0.5

exp(0.500000)=1.648721Entervalueofn,x:20

5

exp(5.000000)=148.413108思考下列問題1、利用公式

π/4=1-1/3+1/5-1/7+…

求π的近似值,直到最后一項(xiàng)的絕對值小于10-5為止。2、利用公式

sinx=x-x3/3!+x5/5!-x7/7!+x9/9!-…+(-1)n-1·x2n-1/(2n-1)!

編程計(jì)算sinx的值。

【例4】用牛頓迭代法求方程f(x)=-6x-1=0在2.5附近的一個(gè)實(shí)根.直到滿足:

所以牛頓迭代公式為:

在幾何意義上:yY=f(x)xOx3迭代算法

已知:求出:算法:1、輸入x的初值

2、做循環(huán):

x0=x

按牛頓迭代公式計(jì)算x

直到滿足:3、輸出結(jié)果

#include<stdio.h>#include"math.h"voidmain(){floatx,x0;

printf("\nInputx0:");

scanf("%f",&x);do{x0=x;x=x0-(x0*x0*x0-6*x0-1)/(3*x0*x0-6);}while(fabs(x-x0)>1e-6);

printf("\nTherootis%f\n",x);}

【例5】輸出下列圖形:

ABCDEBCDE特點(diǎn):行數(shù)i遞增,

CDE字符數(shù)遞減

DE每行的開頭字符

E是前一行的下一個(gè)字符#include“stdio.h”voidmain(){constintROWS=5;/*循環(huán)終值*/constintCHARS=5;

inti;charch;

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

{for(ch=‘A’+i;ch<‘A’+CHARS;ch++) printf(“%c”,ch);

printf(“\n”);}}每排第一個(gè)字符小于F當(dāng)前字符ASCII碼值增1打印圖案

【例6】打印以下圖案*

****************************************

1、圖形對稱,使用對稱的循環(huán)參數(shù)i=-4到42、i與行號k的變換

k=5-|i|3、每行輸出*的個(gè)數(shù)

2*k-14、每行第一個(gè)*的位置為:

常量-k5、定位方法:printf(“%*c”,輸出位置,‘’);

程序如下:#include<stdio.h>#include<math.h>voidmain(){inti,j,k;

for(i=-4;i<=4;i++)

{k=5-abs(i);

printf(“%*c”,30-k,‘’);

for(j=1;j<=2*k-1;j++)

printf("%c",'*');

printf(“\n”);

}}注:printf(“%*c”,30-k,‘’);是輸出30-k個(gè)空格思考:1、輸入棱形的邊長n怎么修改程序?2、*之間有一個(gè)空格怎么修改程序?3、輸出以下圖形怎么修改程序?

3333222222222222111111110

#include<stdio.h>#include"math.h"voidmain(){int

n,i,j,k,m;

printf("\nEnterthemaxnumber:");

scanf("%d",&n);m=2*n+1;

for(i=m;i>=1;i--){k=n+1-fabs(i-n-1);

printf("%*c",30-k,'');

for(j=1;j<=2*k-1;j++)printf("%d",i/2);

printf("\n");}}

3333222222222222111111110

【例7】

百元買百雞,其中母雞3元/只,公雞2元

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論