第4章循環語句和轉移語句_第1頁
第4章循環語句和轉移語句_第2頁
第4章循環語句和轉移語句_第3頁
第4章循環語句和轉移語句_第4頁
第4章循環語句和轉移語句_第5頁
已閱讀5頁,還剩52頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

循環語句和轉移語句第

4章第4章循環語句和轉移語句

4.1循環的概念

4.2for

循環

4.3while

循環

4.4dowhile

循環

4.5多重循環

4.6轉移語句

4.7程序舉例4.1循環的概念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循環的概念2.什么是循環用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條賦值語句

循環思想:

有規律重復執行相同操作的過程稱為循環;

實現這種循環操作的程序稱為程序的循環結構。4.1循環的概念3.解決循環的關鍵用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條賦值語句確定循環的規律(循環條件、循環條件的修改)

確定重復的內容(算法)S=0;i=1;S=S+i;i++;4.1循環的概念3.解決循環的關鍵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循環的概念4.循環的種類C語言可實現的循環:for

循環while

循環do~while

循環用goto

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

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

①表達式1用于循環控制變量賦初始值,它只能執行一次;②表達式2是循環條件;③表達式3用于對循環變量的修改,以使循環能夠結束。2.for語句舉例用for循環編寫下列程序∑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的值循環體2.for語句舉例用for循環編寫下列程序

#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語句的三個表達式都可以缺省,但兩個分號不能缺省;②若在for語句之前已經對循環控制變量賦初值,則表達式1

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

)

{

sum=sum+i;

i++;

}⑤可以省略表達式1

和表達式3,即只給循環條件。如:i=1;for(;i<=100;){sum=sum+i;i++;}構成復合語句

簡化為:

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

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 …在一次循環中計算兩項,遞推公式為:

F1=1F2=1(初值)

F1=F1+F2 F2=F2+F1例

求Fibonacci數列1,1,2,3,5,8的前16個數#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個數N為奇數時再輸出一項小結 for

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

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

循環體語句;⑤循環體中必須有使循環趨于結束的語句,如i++

。3.while語句舉例用while循環編寫下列程序∑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的值循環體循環初值循環終值循環變量增殖3.while語句舉例用while循環編寫下列程序∑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的值改變終值

例:將鍵盤輸入復制到屏幕,直到 按下一個回車鍵為止,程序如下:#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

例:利用輾轉相除法, 求兩個正整數的最大公約數算法:

⑴若J=0,則I為最大公約數

⑵若J!=0

將I除以J,余數為temp

I=J;J=temp

轉⑴#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(退出循環)小結 while

語句的特點1、循環一般由條件控制。2、在循環體內至少有一條語句能對循環條件產生影響,以防止死循環。

4.4do-while循環1.do-while語句的一般形式

do

循環體

while(表達式);功能:先執行一遍循環體,再判斷表達式,當表達式的值為非0(真)時,返回重新執行循環體;如此反復,直到表達式的值為0(假)時退出循環。特點:先執行循環體,后判斷循環條件(表達式)是否成立,即循環體至少執行一次。do循環體表達式成立嗎?假(0)真(非0)while執行流程2.do-while語句說明①循環體至少能執行一次。②循環體可為任意類型語句,復合語句{}不能忘記。③do…while允許嵌套。④do…while(1)表示無窮循環。⑤while后必須跟();。3.while語句舉例用do-while循環編寫下列程序∑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);}循環體循環初值循環終值循環變量增殖i<=5?i←i+110s=0,i=1s←s+i打印sum的值注意“;”

例:從鍵盤輸入一個字符,判別其是否為大寫字母,如果是,則將其轉換為小寫字母并輸出;否則不轉換,不輸出。#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多重循環1.什么是

多重循環一個循環體內又包含另一個完整的循環結構,稱為循環嵌套。嵌套多層的循環結構又稱為多重循環。2.三種循環的

多重循環形式while(){······while(){······}······}for(;;){······for(;;){······}······}do{······do{······}while();······}while();while(){······for(;;){······}······}for(;;){······do{······}while();······}while(){······do{······}while();······}外循環內循環外循環內循環3.

循環嵌套說明⑴三種循環可互相嵌套,層數不限。⑵外層循環可包含兩個以上內循環,但不能相互交叉。⑶嵌套循環的跳轉應禁止:①從外層跳入內層。②跳入同層的另一循環。如

for(;;){……do{……}while();……while(){……}…...}內循環外循環內循環

例:打印九九乘法表#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");}}對第一個乘數循環1-9對第二個乘數循環1-i輸出完一行后輸出換行符4.6轉移語句1.break語句break語句可以用于兩個地方:在switch語句中,用于中斷語句的執行。在循環語句中,break語句常與if語句配合使用,當條件成立后就跳出循環體,提前結束循環。break語句示例此循環本是無限循環,因加上了break語句,使程序在輸入字符常量′!′時就終止循環。…for(;;){scanf(″%c″,&ch);

if(ch==′!′)

break;

else

printf(″%c″,ch);}

例:求2~M之間的全部素數。

要判斷一個數n是否素數,只需判斷2~之間的整數是否 能整除n,如能整除,則不是素數。#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)/*若是素數*/

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

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

23571113171923293137414347535961677173798389972.continue語句continue語句用于提前結束循環中的一輪循環。當程序執行到continue語句時,就跳過循環中后面還未執行的語句,回到循環的起始處,繼續進行下一輪的循環。continue語句常與if語句聯合起來使用,以便在滿足一定條件時提前結束本輪循環。continue語句示例例如

對除5的倍數以外的1~100的數求和

…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語句作用:將控制轉到標號所指定的語句去執行。goto語句格式:

…或:goto

標號;

標號:語句標號:語句…goto

標號;…語句使用說明goto語句對結構程序設計有影響。它將使程序的結構不清晰。應盡可能用break和continue語句代替goto

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

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

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

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

#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】求每個班的平均成績,各班人數不等#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);}}累加器和計數器的初始化輸入負數表示該班成績輸入結束

【例3】利用公式計算

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

1)通項公式法

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

2)遞推公式法

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

/*第一項*/t=1.0;

printf(“Entervalueofn,x:”);

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

for(i=1;i<n;i++){t*=x/i;/*從第二項開始*/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+…

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

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

編程計算sinx的值。

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

所以牛頓迭代公式為:

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

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

2、做循環:

x0=x

按牛頓迭代公式計算x

直到滿足:3、輸出結果

#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特點:行數i遞增,

CDE字符數遞減

DE每行的開頭字符

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

inti;charch;

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

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

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

【例6】打印以下圖案*

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

1、圖形對稱,使用對稱的循環參數i=-4到42、i與行號k的變換

k=5-|i|3、每行輸出*的個數

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

常量-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個空格思考:1、輸入棱形的邊長n怎么修改程序?2、*之間有一個空格怎么修改程序?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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論