課程13級語言c06第6章循環(huán)結構_第1頁
課程13級語言c06第6章循環(huán)結構_第2頁
課程13級語言c06第6章循環(huán)結構_第3頁
課程13級語言c06第6章循環(huán)結構_第4頁
課程13級語言c06第6章循環(huán)結構_第5頁
免費預覽已結束,剩余37頁可下載查看

付費下載

下載本文檔

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

文檔簡介

第6章循環(huán)結構程序設計

C

語言程序設計2023/2/2126.1本章主要內容while循環(huán)控制do-while循環(huán)控制for循環(huán)控制用goto語句實現(xiàn)循環(huán)控制循環(huán)結構中的跳轉語句循環(huán)的嵌套循環(huán)結構程序設計舉例2023/2/2136.2用goto語句實現(xiàn)循環(huán)有興趣的同學自學不提倡使用goto語句注意:goto語句能實現(xiàn)程序無條件轉移,為編程提供了便利。但是無限制地使用,會破壞程序的結構化程度。因此應限制使用。2023/2/2146.3while循環(huán)控制語句一般格式while(表達式)

語句

一般為關系表達式或邏輯表達式,也可以是C語言其他類型的合法表達式

用來控制循環(huán)體是否執(zhí)行稱為內嵌語句,可以是基本語句、控制語句,也可以是復合語句是循環(huán)重復執(zhí)行的部分2023/2/215功能:計算表達式的值,為非0(邏輯真)時,重復執(zhí)行內嵌語句,每執(zhí)行一次,就判斷一次表達式的值,直到表達式的值為0時結束循環(huán),轉去執(zhí)行while后面的語句。

當表達式為真語句N-S結構圖NY流程圖表達式非0?語句循環(huán)控制條件循環(huán)體2023/2/216例如:【例6.1】編寫程序,求100個自然數(shù)的和即:

s=1+2+3+…+100

思路:尋找加數(shù)與求和的規(guī)律

加數(shù)i——從1變到100,每循環(huán)一次,使i增1,直到i的值超過100。i的初值設為1。求和——設變量

sum存放和,循環(huán)求sum=sum+i,直至i超過100。

2023/2/217算法和程序:main(){inti,sum;i=1;sum=0;while(i<=100)

{sum=sum+i;i++;

}printf("sum=%d\n",sum);}運行jc5_1程序輸出結果:sum=5050i:循環(huán)控制變量sum:累加器

i=1,sum=0當i<=100sum=sum+ii++輸出sum2023/2/218注意:如果while的(表達式)值為0,則循環(huán)體一次也不執(zhí)行

(例如當i的初值=101)。在循環(huán)體中必須有使循環(huán)趨向結束的操作,否則循環(huán)將無限進行(死循環(huán))。在循環(huán)體中,語句的先后位置必須符合邏輯,否則會影響運算結果。思考程序段的輸出?

……while(i<=100){i++;sum=sum+i;}運行后,輸出:sum=5150原因是什么?

運行j2023/2/219注意(續(xù)):為了保證循環(huán)正常運行,應該特別注意:循環(huán)控制條件的描述

控制條件的初始狀態(tài)(初始值)

循環(huán)體內部對控制條件的影響2023/2/21106.4do-while語句語句一般格式do語句

while(表達式);

功能:先執(zhí)行內嵌語句(循環(huán)體),之后計算表達式的值,不為0(邏輯真)時,再執(zhí)行循環(huán)體并判斷條件,直到表達式的值為0結束循環(huán),轉去執(zhí)行while下面的語句。2023/2/2111

do-while循環(huán)的算法循環(huán)體當表達式為真N-S結構圖NY循環(huán)體表達式非0?流程圖main(){inti=1,sum=0;do{sum=sum+i;i++;}while(i<=100);printf("%d\n",sum);}用do-while語句求100個自然數(shù)的和運行j2023/2/2112說明:while和do-while都能實現(xiàn)循環(huán)控制,while結構程序通常都可以轉換成do-while結構區(qū)別:do-while語句先執(zhí)行循環(huán)體再判斷條件,循環(huán)體至少執(zhí)行一次;while語句先判斷條件再執(zhí)行循環(huán)體,循環(huán)體有可能一次也不執(zhí)行do—while循環(huán)體中一定要有能使表達式值趨于0的操作(如i++),否則會出現(xiàn)死循環(huán)。

2023/2/2113do-while語句的簡單應用【例6.2】用輾轉相除法求m和n的最大公約數(shù)定義m、n、rm<nTFm和n交換r=m%nm=nn=r當r!=0時輸出最大公約數(shù)m2023/2/2114算法和程序:main(){intm,n,r;scanf("%d,%d",&m,&n);if(m<n){r=m;m=n;n=r;}

do{r=m%n;m=n;n=r;}while(r!=0);printf("%d\n",m);}程序運行情況如下:24,60122023/2/21156.5for語句語句一般格式for(表達式1;表達式2;表達式3)語句功能:計算表達式1的值,再判斷表達式2,如果其值為非0(邏輯真),則執(zhí)行內嵌語句(循環(huán)體),并計算表達式3;之后再去判斷表達式2,一直到其值為0時結束循環(huán),執(zhí)行后續(xù)語句。循環(huán)初始條件循環(huán)控制條件循環(huán)體2023/2/2116for語句的算法N-S結構圖for(表達式1;表達式2;表達式3)語句NY流程圖計算表達式1語句計算表達式3表達式2為真?例如:main(){inti,sum;sum=0;

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

printf("sum=%d\n",sum);}可部分或全部省略,但“;”不可省略2023/2/2117省略for語句的表達式⑴表達式1、2、3全省略,即:for(;;)

就等同于:while(1),會無限循環(huán)(死循環(huán))注意:在省略某個表達式時,應在適當位置進行循環(huán)控制的必要操作,以保證循環(huán)的正確執(zhí)行⑵省略表達式1和表達式3,即:for(;表達式2;)

就等同于:while(

表達式2)⑶省略表達式2,即:

for(表達式1;;表達式3)

就等同于:表達式1;while(1){…表達式3;}2023/2/2118例如:⑴i=1;for(;i<=100;i++)sum+=i;⑵for(i=1;;i++){…if(i>100)……}⑶for(i=1;i<=100;){…i++;…}⑷i=1;for(;;){…if(i>100)…

i++;…}2023/2/2119說明:所有用while

語句實現(xiàn)的循環(huán)都可以用for

語句實現(xiàn)。

等價于:for(表達式1;表達式2;表達式3)

語句;表達式1;while(表達式2){

語句;

表達式3;

}2023/2/2120for語句的簡單應用【例6.3】求n!,即計算p=1×2×3×…×n的值。

思路:求階乘與求累加的運算處理過程類似,只要將“+”變?yōu)椤?”。設置:乘數(shù)i

,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤輸入)累乘器p

,每次循環(huán)令p=p*i2023/2/2121程序:main(){inti,n;longp;

p=1;

printf("Entern:");scanf("%d",&n);for(i=1;i<=n;i++)

p=p

*

i;printf("p=%ld\n",p);}思考:如何輸出1!,2!,…,n!?如何求s=1!+2!+…+n!?2023/2/2122熟悉幾個循環(huán)語句while(!x)x++;

當x=0

時,執(zhí)行循環(huán)體x++;while((c=getchar())!='\n')n=n+1;n稱為計數(shù)器,作用是統(tǒng)計輸入字符的個數(shù)while(num++<=2);printf("%d\n",num);循環(huán)體是空語句,退出循環(huán)后輸出num的值dox=-3;while(x>5);先執(zhí)行循環(huán)體x=-3,再判斷條件(x>5)for(n=0;n<26;n++)printf("%c",n+'A');作用是輸出26個大寫字母for(sum=0,i=1;i<=100;sum=sum+i,i+=2);作用是計算100以內的奇數(shù)和

2023/2/2123幾種循環(huán)語句的比較while和do-while語句的表達式只有一個,for語句有三個。while和for先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語句先執(zhí)行循環(huán)體后判斷循環(huán)條件。while語句多用于循環(huán)次數(shù)不定的情況do-while語句多用于至少要運行一次的情況for語句多用于要賦初值或循環(huán)次數(shù)固定的情況2023/2/21246.6、6.7循環(huán)的嵌套如果循環(huán)語句的循環(huán)體內又包含了另一條循環(huán)語句,則稱為循環(huán)的嵌套例如:

#include<stdio.h>main(){inti,j;

for(i=1;i<10;i++)for(j=1;j<=i;j++)printf((j==i)?"%4d\n":"%4d",i*j);

}外循環(huán)語句內循環(huán)語句2023/2/2125注意:while、do-while、for循環(huán)語句可以并列,也可以相互嵌套,但要層次清楚,不能出現(xiàn)交叉。多重循環(huán)程序執(zhí)行時,外層循環(huán)每執(zhí)行一次,內層循環(huán)都需要循環(huán)執(zhí)行多次。例如:for(a=1;a<=10;a++){for(b=0;b<=5;b++)

……}外循環(huán)執(zhí)行了10次,內循環(huán)執(zhí)行6次循環(huán)正常結束時,內循環(huán)執(zhí)行了10×6=60次2023/2/21266.8循環(huán)結構中的跳轉語句有如下三種語句實現(xiàn)跳轉:continue語句break語句goto語句在循環(huán)語句的循環(huán)體中使用,可以進行循環(huán)的流程控制2023/2/2127后續(xù)語句…continue;

…YN表達式?后續(xù)語句…continue;…表達式?YN6.8.1continue語句及應用功能:中斷循環(huán)體的本次執(zhí)行(即跳過循環(huán)體中尚未執(zhí)行的語句),立即開始執(zhí)行下一次循環(huán)。while語句do-while語句后續(xù)語句計算表達式3計算表達式1…continue;…表達式2?YNfor語句2023/2/2128例如:⑴intx,n=0,s=0;while(n<10){scanf("%d",&x);

if(x<0)continue;

s+=x;n++;};

⑵intx,n=0,s=0;do{scanf("%d",&x);

if(x<0)continue;

s+=x;n++;}while(n<10);

⑶for(n=0,s=0;n<10;n++){scanf("%d",&x);

if(x<0)continue;

s+=x;}2023/2/2129應用舉例【例6.4】把100~200之間能被7整除的數(shù),以十個數(shù)為一行的形式輸出,最后輸出一共有多少個這樣的數(shù)。

for(n=100;n<=200;n++)n能被7整除

TF終止本次循環(huán)輸出n

輸出10個數(shù)

TF

換行2023/2/2130算法和程序main(){intn,j=0;for(n=100;n<=200;n++){if(n%7!=0)continue; printf("%6d",n);

j++;

if(j%10==0)printf("\n");

}printf("\nj=%d\n",j);}2023/2/2131后續(xù)語句…break;…YN表達式?后續(xù)語句…break;…表達式?YN6.8.2循環(huán)中break的應用功能:利用break語句能夠強迫終止本層循環(huán),轉到后續(xù)語句執(zhí)行。while語句do-while語句后續(xù)語句計算表達式3計算表達式1…break;…表達式2?YNfor語句2023/2/2132例如:⑴intx,n=0,s=0;while(n<10){scanf("%d",&x);

if(x<0)break;s+=x;n++;};⑵intx,n=0,s=0;do{scanf("%d",&x);

if(x<0)break;s+=x;n++;}while(n<10);⑶for(n=0,s=0;n<10;n++){scanf("%d",&x);

if(x<0)break;s+=x;}2023/2/21336.9程序舉例【例6.5】按每行輸出5個數(shù)的形式輸出Fibonacci數(shù)列的前20項

。思路:Fibonacci數(shù)列的前幾項是:1、1、2、3、5、8、13、21、34、…。此數(shù)列的變化規(guī)律是:1(n=1)1(n=2)fn-1+fn-2(n>2)fn=設變量f1、f2和f3,并為f1和f2賦初值1,令f3=f1+f2得到第3項;將f1←f2,f2←f3,再求f3=f1+f2得到第4項;依此類推求第5項、第6項…這是一種遞推算法應采用循環(huán)實現(xiàn)2023/2/2134算法和程序#defineN20main(){inti,f1,f2,f3;f1=f2=1;printf("\n%8d%8d",f1,f2);for(i=3;i<=N;i++)

{f3=f1+f2;f1=f2;f2=f3;printf("%8d",f3);

if(i%5==0)printf("\n");

}

}f1=1,f2=1并輸出for(i=3;i<=20;i++)f3=f2+f1f1=f2,f2=f3

輸出f3

輸出5個數(shù)

TF

換行2023/2/2135舉例2【例6.6】判斷輸入的某個數(shù)m是否為素數(shù)。若是素數(shù),輸出“YES”,若不是,輸出“NO”。

思路:素數(shù)是指只能被1和它本身整除的數(shù),如5、7、11、17、…等。

分別用2、3、…,m-1嘗試能否整除整數(shù)m。如果m能被某個數(shù)整除,則m就不是素數(shù)。這是一種窮舉算法設除數(shù)為j,從2循環(huán)到m-12023/2/2136算法和程序:#include"math.h"main(){intj,m,k;printf("Enteranintegernumber:");scanf("%d",&m);for(j=2;j<=m-1;j++)

if(m%j==0)break;printf("%d",m);if(j>=m)printf("YES\n");elseprintf("NO\n");}

輸入一個數(shù)mfor(j=2;j<=m-1;j++)m%j==0TF

退出循環(huán)

j>=mTF輸出"YES“輸出"NO"2023/2/2137程序的優(yōu)化對于窮舉法來說,為了提高程序的效率,就要減少嘗試次數(shù)。#include"math.h"main(){intj,m,k;printf("Enteranintegernumber:");scanf("%d",&m);

k=sqrt(m);for(j=2;j<=k;j++)

if(m%j==0)break;printf("%d",m);if(j>=k+1)printf("YES\n");elseprintf("NO\n");}思考:如何輸出100~200中所有的素數(shù)

2023/2/2138舉例3【例6.7】用牛頓迭代法求方程

2x3+4x2-7x-6=0在x=1.5附近的根。

思路:設xn為一個接近xa的近似根,過(xn,f(xn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論