版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 施工企業(yè)2025年春節(jié)節(jié)后復(fù)工復(fù)產(chǎn)工作專項(xiàng)方案 (合計(jì)3份)
- 下午考前囑咐囑咐什么?發(fā)言提綱
- 古詩文初賽答案(正稿)
- 《電路原理圖繪制》課件
- 傳統(tǒng)服飾設(shè)計(jì)師職責(zé)概述
- 鋼鐵結(jié)構(gòu)設(shè)計(jì)師職責(zé)說明
- 煤炭行業(yè)美工工作總結(jié)
- 特需科護(hù)士工作總結(jié)
- 財(cái)務(wù)工作資金管理總結(jié)
- 專業(yè)技能與教研水平
- 2024年山東省公務(wù)員錄用考試《行測》真題及答案解析
- 眼鏡學(xué)智慧樹知到答案2024年溫州醫(yī)科大學(xué)
- 2025屆高考政治一輪復(fù)習(xí):統(tǒng)編版必修4《哲學(xué)與文化》必背知識點(diǎn)考點(diǎn)提綱
- 安利培訓(xùn)體系介紹
- 推薦-挖掘機(jī)檢驗(yàn)報(bào)告精品
- 排洪溝工程設(shè)計(jì)說明
- 關(guān)于礦棉裝飾吸聲板檢驗(yàn)報(bào)告加圖標(biāo)版
- 23、PFMEA檢查表
- CSX購倂Conrail之后能夠產(chǎn)生的綜效(synergy)列示
- 煤礦機(jī)電事故影響考核管理辦法
- 三段式電流保護(hù)課程設(shè)計(jì)
評論
0/150
提交評論