




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1第六章循環(huán)結構2什么是循環(huán)?為什么要使用循環(huán)??循環(huán)的基本概念循環(huán)是有規(guī)律的重復操作。將復雜問題分解為簡單的操作過程,程序只對簡單過程描述,這些過程的多次重復就可完成對問題的求解。重復的頻繁性決定了循環(huán)在程序設計中必不可少!問題1:問題2:求學生平均成績
成績相加后除以人數做99次加法問題3:找出數x中能同時被3和7整除的數
找數問題分解循環(huán)控制3
if--goto循環(huán)
while循環(huán)
for循環(huán)
dowhile循環(huán)
先判斷后循環(huán)
先循環(huán)后判斷特點:難點:循環(huán)嵌套C提供四種循環(huán)控制:46.1goto語句與標號一般形式:goto標號;
其中:標號用標識符表示,即由字母、數字和下劃線組成,且首字符必須是字母或下劃線。不能用整數作標號功能:當程序執(zhí)行到語句時,改變程序自上而下的執(zhí)行順序,執(zhí)行語句標號指定的語句,并從該語句往下順序執(zhí)行程序。用途:1.與if語句一起構成循環(huán)結構2.從循環(huán)體內跳到循環(huán)體外3.改變程序自上而下的執(zhí)行順序。缺點:濫用goto語句,可使程序無規(guī)律、可讀性差。5例1:求和sum=1+2+······+100main()
{inti=1,sum=0;L1:if(i>100)gotoL2;sum=sum+i;i++;gotoL1;L2:printf("1+2+······+100=%d\n",sum);
}i>100開始i=1,sum=0sum=sum+i,i++非零零結束輸出sum6
另一寫法:
main()
{inti=1,sum=0;L:if(i<=100)
{sum=sum+i;i++; gotoL;
}printf("%d",sum);
}開始i=1sum=0i<=100sum=sum+ii=i+1輸出sum結束零非零框圖:用if與goto構成“當型”循環(huán)76.2while循環(huán)語句1.while循環(huán)語句的形式
while(表達式)語句while循環(huán)語句的執(zhí)行過程是:先判斷條件,后執(zhí)行語句。表達式語句零非零2.執(zhí)行過程這是內嵌語句,也稱為循環(huán)體,它可以是單語句,也可以是復合語句
循環(huán)體內應注意設置修改循環(huán)條件的語句。否則循環(huán)無法終止。循環(huán)體8說明:(1)執(zhí)行while循環(huán)語句時,如果表達式的值第一次計算就等于0,則循環(huán)體一次也不執(zhí)行。(2)發(fā)生下列情況之一時,while循環(huán)結束執(zhí)行:表達式的值為0;循環(huán)體內遇到break語句;循環(huán)體內遇到goto語句,且與該goto語句配合使用的標號所指定的語句在本循環(huán)體外;循環(huán)體內遇到return語句,此時退出while循環(huán)后,執(zhí)行的流程從包含該while語句的函數返回到所調用函數。9前例求:main(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);}開始sum=0i=1i<=100sum=sum+ii=i+1輸出sum結束零非零框圖:循環(huán)體思考:刪除i++;后果?調換i++;與求和語句的后果?10
例2:輸出華氏-攝氏溫度轉換表華氏溫度3035之間的每一度都轉換成相應的攝氏溫度。轉換公式:C=5*(F-32)/9f<=35開始f=30c=5*(f-32)/9零非零結束輸出fcf=f+1#include"stdio.h"
main(){intf;floatc;f=30;
while(f<=35){
c=5*(f-32)/9.0;printf("F=%dC=%4.1f\n",f,c);f=f+1;}}11
例3:輸入一批整數,輸入0時表示輸入結束,求這些整數的和。#include"stdio.h"
main(){ints=0,x;scanf("%d",&x);
while(x!=0){
s=s+x;scanf("%d",&x);}printf("s=%d\n",s);}零非零x!=0開始s=0s=s+x結束輸出s輸入正數x輸入正數x思考:取消循環(huán)內的輸入語句后果?循環(huán)次數未知,標記控制的循環(huán)121.do—while循環(huán)語句的形式
do語句while(表達式);2.執(zhí)行過程說明:(1)do—while循環(huán)語句首先執(zhí)行循環(huán)體,然后計算表達式并檢查循環(huán)條件,所以循環(huán)體至少執(zhí)行一次。(2)退出do—while循環(huán)的條件與退出while循環(huán)的條件相同。表達式語句零非零6.3
do—while循環(huán)語句注意:不要丟掉分號do—while循環(huán)執(zhí)行過程是:先執(zhí)行語句,后判斷條件。13例4:用迭代法求a的算數平方根。公式:xn=0.5*(xn-1+a/xn-1)
確定初值為x0,
取a/2為x0的初值,迭代結束條件:|x1-x0|<=10-5.#include<stdio.h>#include<math.h>main(){floata,x0,x1;scanf("%f",&a);x1=a/2;do{x0=x1;x1=(x0+a/x0)/2;}while(fabs(x1-x0)>1e-5);printf("squrt(a)=%f\n",x1);}表達式=0?語句零非零|x1-x0|>10-5
?x0=x1x1=(x0+a/x0)/2輸入ax1=a/2輸出a,x114注意:當while后的表達式為真時,while語句和do—while語句的結果相同,否則不同。main(){inti,s=0;scanf("%d",&i);
while(i<=10){s=s+i;i++;}printf("s=%d\n",s);}輸入:1打印:55輸入:11打?。?main(){inti,s=0;scanf("%d",&i);
do
{s=s+i;i++;}
while(i<=10);printf("s=%d\n",s);}
輸入:1打印:55
輸入:11打?。?1156.4for循環(huán)語句1.for循環(huán)語句的形式
for([表達式1];[表達式2];[表達式3])語句表達式2表達式1語句表達式3零非零2.執(zhí)行過程說明:(1)表達式1僅被執(zhí)行一次;表達式2決定了是否繼續(xù)執(zhí)行循環(huán);表達式3則不斷修改循環(huán)控制變量的值。(2)三個表達式均可省略,分號不能省略。163.說明:(1)最簡單的應用形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語句如前例:求1+2+3+……+100之和。main(){inti,sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("%d",sum);}作累加17(2)三個表達式均可缺省,但起分割作用的兩個分號不可省略。例如:for(;;)表達式1省略,應在for之前對循環(huán)變量賦初值
……i=1;for(;i<=100;i++)sum=sum+i;……while(1){...if(表達式)break;...}表達式1放在for前18表達式2省略,則不判斷條件,循環(huán)無終止進行下去。
……for(i=1;;i++)sum+=i;
表達式3省略,則應另設法保證循環(huán)的結束.
……for(sum=0,i=1;i<=100;){sum=sum+i;i++;}表達式319(3)表達式1和表達式3可以是逗號表達式。例:inti,j,sum;for(i=0,j=100;i<=j;i++,j--)sum=i+j;20例5:計算并輸出
n!=1×2×3×…×n
作累乘,p類型21例6:計算并輸出
1!,2!,3!,…,n!
循環(huán)體22例7:輸出100以內(含100)所有偶數的和與所有奇數的和。main(){inti,s1=0,s2=0;for(i=1;i<=100;i++)if(i%2==0)s1=s1+i;elses2=s2+i;printf(s1=%d,s2=%d\n,s1,s2);}若只計算奇數的和,此處改為:if(i%2!=0)s1=s1+i;23例8:求s=1-1/2+1/3-1/4+······+1/n,n由鍵盤輸入。解題方法:讓變量t的初值等于1,然后反復執(zhí)行語句,則t的值就在1和-1之間交替變化。main(){inti,n;doubles,t;scanf(″%d″,&n);for(s=0,t=1,i=1;i<=n;i++){s=s+t/i;t=–t;}printf(″s=%f\n″,s);}24分析:求前n項和,要循環(huán)n次,每次累加1項。除第1項外,每次循環(huán)分母都遞增2,符號交替變化。#include<stdio.h>main(){inti,n,t=1,flag=1;doublesum=0,item;scanf("%d",&n);for(i=1;i<=n;i++){item=flag*1.0/t;/*計算第i項的值*/sum=sum+item;/*累加第i項的值*/flag=-flag;/*改變符號,為下次循環(huán)做準備*/t=t+2;/*分母遞增2,為下次循環(huán)做準備*/}printf("sum=%f\n",sum);}例9:輸入一個正數n,計算1-1/3+1/5-1/7+……的前n項之和。運行結果:輸入:5↙sum=0.834921sum=sum+flag*1.0/(2*i-1);flag=-flag;等效256.5三種循環(huán)語句的比較for語句和while語句先判斷條件,后執(zhí)行語句,故循環(huán)體有可能一次也不執(zhí)行,而do—while語句的循環(huán)體至少執(zhí)行一次。用while和do—while循環(huán)時循環(huán)變量初始化的操作應在while和do—while語句之前完成。而for語句可以在表達式1中實現循環(huán)變量的初始化。26選擇三種循環(huán)的一般原則如果循環(huán)次數已知,計數控制的循環(huán)用for如果循環(huán)次數未知,條件控制的循環(huán)用while如果循環(huán)體至少要執(zhí)行一次用do-while這只是“一般”原則,不是“原則”276.6循環(huán)語句的嵌套1.定義:在循環(huán)體內又包含一個循環(huán)結構,稱為循環(huán)嵌套。三種循環(huán)(while、do_while、for)都可以互相嵌套。例如:以下幾種都是合法的嵌套形式for(;;){···
while(){···}
}for循環(huán)體嵌套while循環(huán)體for(;;){···
for(;;){···}}for循環(huán)體嵌套for循環(huán)28do{
do{···}while();
}while();do_while循環(huán)體嵌套do_while循環(huán)while(){
do{···}while();
}while循環(huán)體嵌套do_while循環(huán)while(){
while(){···}}while循環(huán)體嵌套while循環(huán)
do{
for(;;){···}}while();do_while循環(huán)體嵌套for循環(huán)292.嵌套結構規(guī)則外循環(huán)內循環(huán)交叉循環(huán)外循環(huán)入口內循環(huán)出口內循環(huán)出口外循環(huán)出口30
例10:循環(huán)嵌套舉例。
for(i=1;i<=2;i++)for(j=1;j<=2;j++)
{printf(″%3d″,i+j);
printf(″\n″);
}for(i=1;i<=2;i++){for(j=1;j<=2;j++)printf(″%3d″,i+j);
printf(″\n″);
}對j循環(huán)結束,再換行.輸出結果:
2
3
3
4輸出結果:
23
3431
例11:求1!+2!+3!+…..+n!
main(){inti,j,n;floatsum,s;scanf("%d",&n);sum=0;for(i=1;i<=n;i++)
{
s=1;for(j=1;j<=i;j++)s*=j;sum+=s;
}printf("%f\n",sum);}計算i!注意類型定義32例12:按規(guī)定的格式輸出九九乘法表。main(){inti,j;for(i=1;i<=9;i++)
{for(j=1;j<=i;j++)printf("%d",i*j);printf("\n");}}內循環(huán)體外循環(huán)體1
24369
918277281…..……討論:1、輸出上三角99乘法表。2、輸出全部99乘法表33main(){inti,j,k;for(i=1;i<=9;i++){for(k=1;k<=i-1;k++)printf(""); for(j=i;j<=9;j++)printf("%3d",i*j);printf("\n");}}main(){inti,j,k;for(i=1;i<=9;i++){for(j=1;j<=9;j++)printf("%3d",i*j);printf("\n");}}34
例13:在前題基礎編寫程序輸出該圖形輸入m(行數);for(i=1;i<=m;i++)
{for(j=1;j<=i;j++)printf(“*”);/*打印j個*號*/
printf(“\n”);/*換新行*/}**********#include<stdio.h>main(){
inti,j,m;scanf("%d",&m);for(i=1;i<=m;i++)
{for(j=1;j<=i;j++)
printf("*");
printf("\n");}
}35例14:for循環(huán)嵌套while循環(huán):
輸入6名學生5門課程的成績,分別統(tǒng)計每名學生5門課程的平均成績。#include<stdio.h>main(){inti,j;floatscore,sum,ave;for(i=1;i<=6;i++)
{sum=0;j=1;while(j<=5){scanf("%f",&score);sum=sum+score;j++;}ave=sum/5;printf("i=%dave=%6.2f\n",i,ave);
}}for(j=1;j<=5;j++){scanf("%f",&score);sum=sum+score;}等效36#include"stdio.h"main(){inti,f,f1,f2;f1=f2=1;printf("%8d%8d",f1,f2);for(i=3;i<=20;i++){f=f1+f2;printf("%8d",f);if(i%5==0)printf("\n");f1=f2;f2=f;}}例15:求斐波那契(Fibonacci)數列的前20項,并以每行5個輸出。Fibonacci數列:1,1,2,3,5,8,13,21,34,……。特點:前兩項是1,1,從第3項開始每項的值是前兩項之和。運行結果控制每行輸出5個數例16:求以下函數的近似值
特點:第i項的分子是x的2i-1次方第i項的分母是(2i-1)!第i項的符號是(-1)i+1需要雙重循環(huán):內循環(huán)計算分子和分母,外循環(huán)實現累加。作業(yè)選作題:習題五第四小題。#include<stdio.h>#include<math.h>main(){ doublesin=0,x,a,b; inti,k,n; printf("inputx,n:\n"); scanf("%lf,%d",&x,&n); x=x*3.1415926/180;/*輸入的角度化為弧度*/ for(i=1;i<=n;i++) {
a=b=1; for(k=1;k<=2*i-1;k++) { a=a*x; b=b*k; } sin+=pow(-1,i+1)*a/b; }printf("sin=%lf\n",sin);}注意:要用此類型注意:輸入角度化為弧度注意:正負的變化或采用先t=1;t=-t;的辦法x的累乘分母的累乘396.7break和continue語句1.break語句語法:break;功能:結束包含該語句的最內層循環(huán)
main(){intn;for(n=100;n<=200;n++)
{if(n%3==0)break;printf(″%6d″,n);
}}2.continue語句語法:continue;功能:結束循環(huán)體的本次循環(huán)main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf(″%6d″,n);}}100-200之間只要遇到能被3整除的數就結束循環(huán)。輸出:100101本程序將100-200之間不能被3整除的數輸出與下列語句等效:if(n%3!=0)printf(″%6d″,n);只能出現在switch和循環(huán)語句中只能出現在循環(huán)語句的循環(huán)體中40for循環(huán)結構中的break結構for循環(huán)結構中的continue結構表達式2表達式1語句1表達式3零非零break語句2是否表達式2表達式1語句1表達式3零非零continue語句2是否41程序段1:inti,n=0;for(i=0;i<10;i++){n++;if(i>5)continue;}printf("i=%d,n=%d\n",i,n);程序段2:inti=0,n=0;while(i<10){n++;if(i>5)continue;i++;}printf("i=%d,n=%d\n",i,n);表面看功能相同。討論:1、將continue換成break結果相同2、段1運行結果i=10,n=10
段2,當i=6時死循環(huán)。423.空語句形式:
;(只由一個分號構成)2.功能什么也不做。(可出現在程序中任何語句可以出現的地方)例:求級數12+22+32+…,前10項之和。main(){inti,sum;for(sum=0,i=1;i<=10;sum+=i*i,i++)
;printf("sum=%d\n",sum);}例:程序段
gotoL1;
L1:;
43練習1:下面程序的運行結果是________。
main(){inti=10;while(i-->0);printf("%d\n",i);}輸出結果:-1循環(huán)體“;”是空語句。44注意在for和while語句之后一般沒有分號有分號表示循環(huán)體就是分號之前的內容空語句——表示循環(huán)體內什么都不做
while
(i<100);
i++;死循環(huán)
for
(i=0;i<100;i++);
printf("%d",i);用于延時注意!45練習2:下列程序段,選項正確的是()。
inti,k;for(i=0,k=-1;k=1;i++,k++)printf("***");
A.判斷循環(huán)結束的條件非法
B.無限循環(huán)。
C.只循環(huán)一次
D.一次也不循環(huán)
表達式2:k=1,非零,是無限循環(huán)B46
練習3:main(){intx=3;doprintf("%3d",x-=2);while(!(--x));}輸出結果:1-247練習4:閱讀下列程序,輸出結果()。
main(){inti=0,j=10,k=2,s=0;for(;;)i+=k;if(i>j){printf(″s=%d″,s);break;}s+=j;
}
循環(huán)體共執(zhí)行了多少次?
S=506次當條件i>j成立時才能執(zhí)行到break語句For循環(huán)是死循環(huán)注意:break語句只能出現在switch,for,while或do—while語句中。{}48練習5:以下程序的輸出結果是()。
main(){intx=8;for(;x>0;x--)
{if(x%3){printf(″%d″,x--);continue;}printf(″%d″,--x);}}
D如x不是3的倍數(x%3!=0),則輸出x,并令x減1,結束本次循環(huán)。
A.742B.8752C.9764D.8542
49
練習6:下列程序的輸出結果是()。
main(){intk=0,m=0;inti,j;for(i=0;i<2;i++){for(j=0;j<3;j++)k++;k-=j;}m=i+j;printf(“k=%d,m=%d”,k,m);}
A.k=0,m=3B.k=0,m=5C.k=1,m=1D.k=1,m=4
B外循環(huán)的循環(huán)體包括內循環(huán)和k-=j;兩條語句50
練習7:下列程序的輸出結果是()。
main(){inti,j,x=0;for(i=0;i<2;i++)
{x++;for(j=0;j<=3;j++){if(j%2!=0)cont
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車輛轉讓與車輛檢測報告及維修保養(yǎng)服務合同
- 采棉機作業(yè)與棉花種植項目投資合同
- 電梯低頻噪音維修方案
- 泡水漏水考試題及答案
- 車位產權明確買賣及車位租賃及維修合同
- 獸醫(yī)門診面試題及答案
- 冷庫搬運服務外包方案
- 2026版《全品高考》選考復習方案生物0419 課時作業(yè)(十八) 減數分裂與有絲分裂的比較 含答案
- 胸膜腫瘤CT表現與鑒別診斷
- 舞室運營方案模板
- 2025年湖南省中考歷史試卷真題(含答案解析)
- 小學音標題目及答案
- 2024年宿州蕭縣縣直事業(yè)單位招聘真題
- 休閑陽臺沙發(fā)區(qū)創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 2025河南省豫地科技集團有限公司社會招聘169人筆試參考題庫附帶答案詳解
- 木耳采購合同協議書范本
- 快遞分揀人力承包協議書
- 醫(yī)學主任醫(yī)師晉升答辯
- ISO27001:2022信息安全管理手冊+全套程序文件+表單
- 給酒店供應早餐合同協議
- FSSC22000ISO22000標準課程培訓試題含答案
評論
0/150
提交評論