




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第5章循環結構程序設計5.1為什么需要循環控制5.2用while語句實現循環5.3用do…while語句實現循環5.4用for語句實現循環5.5循環的嵌套5.6幾種循環的比較5.7break語句和continue語句5.8程序舉例【例】
求1+2+3+4+5。最直觀的方法:步驟1:先求1+2,得到結果3。步驟2:將步驟1得到的和3加上3,得到結果6。步驟3:將6再加上4,得10。步驟4:將10再加上5,得15。——簡單算法舉例這樣的算法雖然正確,但太繁,數目太大時也不現實,無法用程序實現。5.1概述【觀察】
求1+2+3+4+5。被加數加數初始值:1以后:上一次的和初始值:有規律地遞增,即+12以后:規律:pip=p+i;i++;【例】
求1+2+3+4+5S1:使p=1S2:使i=2S3:
使p+i,和仍然放在在變量p中,即:p=p+iS4:
使i的值+1,即i=i+1或i++S5:
判斷i≤5,若成立,返回重新執行步驟S3以及其后的S4和S5(循環操作);若不成立,算法結束。此時的p值為值。改進的方法:5.2用while語句實現循環一般形式:while(表達式){
循環體語句組;
}執行流程:表達式循環體語句組假(0)真(非0)#include<stdio.h>intmain(){int
i,s;i=1;s=0;
while(i<=5){s=s+i;i++;}
printf("result=%d",s);return0;}【例】用while結構實現求1+2+3+4+5/*循環變量初始化值*//*循環條件*//*循環體語句組*/#include<stdio.h>intmain(){int
i,p;i=2;p=1;
while(i<=5)
{p=p*i;i=i+1;}
printf("result=%d",p);return0;}【練習】仿照上例寫出求1×2×…5的值馬上鞏固例5.1
用while循環求1~100的和練習一下例5.1
用while循環求1~100的和#include<stdio.h>intmain(){
int
i,sum;
printf("sum=%d,i=%d\n",sum,i);return0;}程序運行結果:sum=,i=sum=0;i=;
while(){sum+=i;i++;}1i<=100sum=5050,i=101思考:(1)循環次數?(2)若i=0,會不會影響最后的運行結果?100次不會求階乘n!求1~n的累加和求p=1×2×3×4×……×n(n≤10)即:s=1+2+3+4+……+n初始值:p=1;i=1;s=s+i;i++;p=p*i;i++;初始值:s=0;i=1;思考即:s=1+3+5+……+n求1~n的奇數累加和s=s+i;i=i+2;s=0;i=1;初始值:思考即:s=2+4+6+……+n求1~n的偶數累加和s=s+i;i=i+2;s=0;i=2;初始值:思考求1~n的階乘的和即:s=1!+2!+…n!(1)做法1:s=1!+2!+…n!=1!+1!*2+2!*3+…(n-1)!*n初始值:s=0;i=1;每一項=上一項*i(i=2~n)#include<stdio.h>voidmain(){
inti=1,s=0,p=1;
while(i<=5)//求1!+2!+3!+4!+5!{}
printf("sum=%d,i=%d\n",sum,i);}p=p*i;s=s+p;i++;思考求1~n的階乘的和即:s=1!+2!+…n!(1)做法2:——雙重循環s=1!+2!+…n!=1!+1!*2+2!*3+…(n-1)!*n初始值:s=0;i=1;每一項=上一項*i(i=2~n)#include<stdio.h>voidmain(){
inti=1,s=0,p,j;
while(i<=5)//求1!+2!+3!+4!+5!{j=1;p=1;
while(j<=i)//求i!{p=p*j;j++;}s=s+p;}
printf("sum=%d,i=%d\n",sum,i);}j=1;p=1;
while(j<=i){p=p*j;j++;}#include<stdio.h>voidmain(){
inti=1,s=0,p,j;
while(i<=5)//求1!+2!+3!+4!+5!{j=1;p=1;
while(j<=i)//求i!{p=p*j;j++;}s=s+p;i++;}
printf("sum=%d,i=%d\n",sum,i);}5.3用do…while語句實現循環一般形式:do{
循環體語句組;
}while(表達式);
執行流程:循環體語句組;表達式假(0)真(非0)有分號例5.2
用do…while循環求1~100的和#include<stdio.h>voidmain(){
int
i,sum;i=1;sum=0;
do{sum=sum+i;i++;}while(i<=100)
printf("sum=%d,i=%d",sum,i);}程序運行結果:sum=,i=;sum=5050,i=101例
用do…while循環求1~5的乘積練習一下【例】用do…while結構實現求1×2×3×4×5/*循環變量初始化值*/#include<stdio.h>voidmain(){int
i,p;i=2;p=1;
while(i<=5)
{p=p*i;i=i+1;}
printf("result=%d",p);}//while結構/*循環條件*//*循環體語句組*/#include<stdio.h>voidmain(){int
i,p;i=2;p=1;
do{p=p*i;i=i+1;}while(i<=5)
printf("result=%d",p);}//do…while結構;while和do~while比較#include<stdio.h>voidmain(){inti,sum=0;
i=1;
do{sum+=i; i++;}while(i<=100);
printf("%d",sum);}#include<stdio.h>voidmain(){int
i,sum=0;
i=1;
while(i<=100){sum+=i; i++;}
printf("%d",sum);}#include<stdio.h>voidmain(){inti,sum=0;
scanf("%d",&i);
do{sum+=i; i++;}while(i<=10);
printf("%d",sum);}#include<stdio.h>voidmain(){inti,sum=0;
scanf("%d",&i);
while(i<=10){sum+=i; i++;}
printf("%d",sum);}繼續比較轉下頁兩個程序先后兩次分別輸入1和11,查看結果。第一次運行:1↙再運行一次:11↙sum=55sum=11第一次運行:1↙再運行一次:11↙sum=55sum=0While結構運行情況:do~while結構運行情況:上一頁結論:while和do…while結構何時相同?何時不同?P119
循環結構的三個基本要素循環變量初始化,如:i=1;s=0;循環條件,如:i<=100循環趨向結束語句,如:i++;一般形式:5.4用for語句實現循環for(expr1;expr2;expr3){
循環體語句組;
}//endoffor假(0)expr2循環體語句組;真(非0)expr1expr3expr1:在循環體外先執行(作用:循環變量賦初值,只執行1次)expr2:作為循環條件表達式expr3:作為整個循環過程的最后一條語句自動運行。(作用:修改循環變量的值)執行流程:for(expr1;expr2;expr3){
循環體語句組;
}圖6-6while(){
循環體語句;
}for(expr1;
expr2;expr3){
循環體語句;
}do{
循環體語句;
}while();expr1;expr2expr3;expr1;expr2expr3;#include<stdio.h>voidmain(){inti,sum=0;i=1;
while(i<=100){sum+=i; i++;}
printf("%d",sum);}已知用while結構求“1~100的和”請改為for結構實現tostudent#include<stdio.h>voidmain(){int
i,s=0;
printf("%d\n",s);}#include<stdio.h>voidmain(){int
i,s=0;i=1;
while(i<=100){s+=i; i++;}
printf("%d\n",s);}對比用while結構和for結構求“1~100的和”for(;;){}i=1i<=100i++s+=i;#include<stdio.h>voidmain(){int
i,s=0;
printf("%d\n",s);}#include<stdio.h>voidmain(){int
i,s=0;i=1;
while(i<=100){s+=i; i++;}
printf("%d\n",s);}對比用while結構和for結構求“1~100的和”for(;;)
i=1i<=100i++s+=i;練習:for循環求表達式的值f=1+1/3+1/5+…1/9tostudent練習:for循環求表達式的值f=1+1/3+1/5+…1/9#include<stdio.h>voidmain()//for循環{inti;floatf=0;
for(;;);
printf("%f\n",f);}i=1i<=9i=i+2f=f+1.0/i練習:用for循環在屏幕上輸出顯示一行星號。**********...*通過調試判斷:一行屏幕可以輸出多少個星號*?tostudent關于for循環的說明:P121(1)expr1可以省略,但是其后的分號不能省略。如:for(i=1;i<=100;i++)sum+=i;i=1;for(;i<=100;i++)sum+=i;等價于關于for循環的說明:(2)若expr2省略,會導致死循環。如:for(i=1;;i++)sum+=i;等價于i=1;while(1){sum+=i;i++;}所以,從功能上講:expr2不能省略(3)expr3可以省略,但是其前的分號不能省略。如:for(i=1;i<=100;){sum+=i;
i++;}關于for循環的說明:for(i=1;i<=100;i++)sum+=i;等價于(4)
可以同時省略expr1和expr3。如:求1~100的和i=1;for(;i<=100;){sum+=i;
i++;}關于for循環的說明:for(i=1;i<=100;i++)sum+=i;等價于(4)
可以同時省略expr1,expr2和expr3。如:while(1)printf(“%d\n”,i);關于for循環的說明:for(;;)
printf(“%d\n”,i);等價于(5)expr1,expr2,expr3也可以包含其他功能的表達式。關于for循環的說明://求1~100的和s=0;for(i=1;i<=100;i++)s=s+i;//求1~100的和for(s=0,i=1;i<=100;s=s+i,i++);(6)expr1和expr3可以是一個簡單的表達式,也可以是逗號表達式。(7)
C99允許在for語句的expr1中定義變量并賦初值。關于for循環的說明://求1~100的和s=0;for(inti=1;i<=100;i++)s=s+i;expr2一般是循環條件表達式,也可以包含其他功能的表達式。#include<stdio.h>voidmain(){char
ch;
printf("輸入一串字符,回車鍵結束:");
ch=getchar();
for(;ch!='\n';){printf("%c\n",ch);
ch=getchar();}}在獲取值的同時進行判斷for(;(ch=getchar())!='\n';)
printf("%c\n",ch);while的循環條件中也可以包含其他表達式#include<stdio.h>voidmain(){char
ch;
printf("輸入一串字符,回車鍵結束:");
for(;(ch=getchar())!='\n';)
printf("%c\n",ch);}在獲取值的同時進行判斷while((ch=getchar())!='\n')#include<stdio.h>//4.6——elseif結構voidmain(){floatscore;
printf("輸入學生成績:");
scanf("%f",&score);while(score>100||score<0){printf("輸入有誤,重新輸入:");
scanf("%f",&score);}
if(score>=90)printf("A\n");
elseif(score>=80)printf("B\n");
elseif(score>=70)printf("C\n");
elseif(score>=60)printf("D\n");
elseprintf("E\n");}#include<stdio.h>//5.6——elseif結構voidmain(){floatscore;
printf("輸入學生成績:");
while(scanf("%f",&score),score>100||score<0)
printf("輸入有誤,重新輸入:");
if(score>=90)printf("A\n");
elseif(score>=80)printf("B\n");
elseif(score>=70)printf("C\n");
elseif(score>=60)printf("D\n");
elseprintf("E\n");}while(){
循環體語句;
}for(expr1;
expr2;expr3){
循環體語句;
}do{
循環體語句;
}while();expr1;expr2expr3;expr1;expr2expr3;三種循環結構三要素:循環變量初始化;循環條件;循環變量修改語句;程序填空:用for循環求“1~100的和”#include<stdio.h>voidmain(){int
i,sum;
for(;i<=100;i++)
sum+=i;
printf("%d\n",sum);}sum=0i=1,——for循環格式的靈活運用#include<stdio.h>voidmain(){
int
i,sum;
for(sum=0,i=1;i<=100;)
printf("%d\n",sum);}程序填空:用for循環求“1~100的和”;屏幕輸出結果:sum+=i,i++——for循環格式的靈活運用#include<stdio.h>voidmain(){
int
i,sum;
for(sum=0,i=1;i<=100;)
printf("%d\n",sum);}i++程序填空:用for循環求“1~100的和”;sum+=i,
屏幕輸出結果:——for循環格式的靈活運用5.5循環的嵌套定義:一個循環體內又包含另一個完整的循環結構。一般形式:…while(條件表達式){
循環體語句組;
}……do{
循環體語句組;
}while(條件表達式);…外層內層…for(expr1;expr2;expr3){
循環體語句組;
}……while(條件表達式){
循環體語句組;
}…執行過程:執行一次外層循環時:內層循環要執行到條件不滿足時(內層循環是多個小循環,外層循環是一個大循環)基本原則:1、外層循環的“變量初始化”在外層循環之前;2、內層循環的“變量初始化”在外層循環之內(適當位置)——內層循環之前;內層循環可以盡量使用for結構外層:for循環內層:while循環用雙重循環編程實現:求1~10的階乘和。#include<stdio.h>voidmain(){int
i,j;longs,p;//s存放和值,p存放階乘
//i外層循環變量,j內層循環變量
for(s=0,i=1;i<=10;i++)
{
j=1;p=1;
while(j<=i){p=p*j;j++;}
s=s+p;
}
printf("result=%ld",s);}tostudent#include<stdio.h>voidmain(){int
i,j;longs,p;//s存放和值,p存放階乘
//i外層循環變量,j內層循環變量
for(s=0,i=1;i<=10;i++)
{
for(j=1,p=1;j<=i;j++)p=p*j;
s=s+p;
}
printf("result=%ld",s);}tostudent練習:輸出以下內容用雙重循環輸出10行星號,每行20個星號****************************************......********************tostudent#include<stdio.h>voidmain(){
int
i,j;//i外層循環控制行數;j內層循環控制個數
for(;;)for(;;)
printf("*");
}//外層i循環結束}//該語句的位置i=1i<=10i++j=1j<=20j++printf("\n");——外層循環{練習:輸出以下內容***************tostudent#include<stdio.h>voidmain(){
int
i,j;//i外層循環控制行數;j內層循環控制個數
for(;;)
{
for(;;)
printf("*");
}//外層i循環結束}//該語句的位置i=1i<=5i++j=1j<=ij++printf("\n");——外層循環練習:百錢買百雞問題。百錢百雞問題中國古代數學家張丘建在他的《算經》中提出了著名的“百錢買百雞問題”:雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一,百錢買百雞,問翁、母、雛各幾何?假設:雞翁:cocks雞母:hens雞雛:chicks0~20=100-cocks-hens0~33#include<stdio.h>voidmain(){int
cocks,hens,chicks;
for(cocks=0;cocks<=20;cocks++)
for(hens=0;hens<=33;hens++){chicks=100-cocks-hens;
if(5.0*cocks+3.0*hens+chicks/3.0==100.0)
printf("%d%d%d\n",cocks,hens,chicks);}}進入下一個環節的學習break;continue;5.7
break語句和continue語句作用:從循環體內跳出循環體外,強制性提前結束循環。break語句一般形式:break;特點:①通常與if語句搭配使用;②只能用于循環結構和switch結構。不能用于其他語句中while(循環條件表達式){……
if(表達式x)
break;
……}break執行示意for(表達式1;表達式2;表達式3){……
if(表達式x)
break;
……}作用:提前結束本次循環,再判斷<循環條件表達式>是否成立。continue語句一般形式:continue;特點:①通常與if語句搭配使用;②與break的區別:不是終止整個循環的執行,只是提前結束本次循環;while(循環條件表達式){……
if(表達式y)
continue;
……}continue執行示意for(表達式1;表達式2;表達式3){……
if(表達式y)
continue;
……}m%i輸入一個任意整數m,判斷m是否素數#include<stdio.h>voidmain(){int
m,i;
printf("輸入一個任意整數:");scanf("%d",&m);
if()printf("%disaprimenumber\n",m);
else
printf("%disnotaprimenumber\n",m);}for(i=2;i<=m-1;i++)i>m-1
if(m%i==0)break;for循環結束有兩種可能:(1)i>m-1(2)m%i==0(i<=m-1)輸入一個任意整數m,判斷m是否素數#include<stdio.h>voidmain(){int
m,i;
printf("輸入一個任意整數:");scanf("%d",&m);
if()printf("%disaprimenumber\n",m);
else
printf("%disnotaprimenumber\n",m);}for(i=2;i<=sqrt(m);i++)
if(m%i==0)break;i>sqrt(m)#include<math.h>break舉例(例5.6)輸入一個任意整數m,判斷m是否素數#include<stdio.h>voidmain(){int
m,i;
printf("輸入一個任意整數:");scanf("%d",&m);
if()printf("%disaprimenumber\n",m);
else
printf("%disnotaprimenumber\n",m);}for(i=2;i<=sqrt(m);i++)
if(m%i!=0)i>sqrt(m)#include<math.h>break;continue;{}本節內容:break語句和continue語句雙重循環學習與循環有關的算法掌握循環程序的編寫和應用5.8
循環程序舉例例5.7
求的近似值:#include<stdio.h>#include<math.h>voidmain(){ints;
//s代表每項的符號
float
n,t,pi;//t:每一項的值;pi累加;n每項分母
t=1;pi=0;n=1.0;s=1;
while(fabs(t)>1e-6){pi=pi+t;n=n+2;//求下一項的分母
s=-s;//求下一項的符號
t=s/n;}//求下一項pi=pi*4;printf("pi=%10.6f\n",pi);}/4=1-1/3+1/5-1/7+……直到某一項的絕對值小于10-6為止。例5.8
求Fibonacci數列的前40個數。該數列有如下特點:第1、2兩個數為1、1。從第3個數開始,該數是其前面兩個數之和。即:F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n>=3)古典數學問題:有一對兔子,從出生后第3個月起每個月都生一對兔子。小兔子長到第3個月后每個月又生一對兔子。假設所有兔子都不死,問每個月兔子總數為多少對?#include<stdio.h>voidmain(){long
intf1,f2,f3;//f1和f2存放數列兩項的值
inti;//i是循環控制變量
f1=1;f2=1;printf("%12ld%12ld",f1,f2);
for(i=1;i<=40;i++){f3=f1+f2;printf("%12ld",f3);f1=f2;f2=f3;}}另解#include<stdio.h>voidmain(){long
intf1,f2;//f1和f2存放數列兩項的值
inti;//i是循環控制變量
f1=1;f2=1;
for(i=1;i<=20;i++){printf("%12ld%12ld",f1,f2);
if(i%2==0)printf("\n");//每行輸出4項
f1=f1+f2;f2=f2+f1;}}例5.9求100~200之間的所有素數。#include<stdio.h>#include<math.h>voidmain(){int
m,k,i,n=0;
//n是計數器;m和i分別是外、內層循環控制變量
for(m=101;m<=200;m=m+2){k=sqrt(m);
for(i=2;i<=k;i++)//for循環—判定當前m是否素數
if(m%i==0)break;
if(i>=k+1){printf("%d",m); n=n+1;if(n%10==0)printf("\n");}//換行
}printf("\n");}例5.10
譯密碼。為使電文保密,往往按一定規律將其轉換成密碼,收報人再按約定的規律將其譯回原文。例如,本題按以下規律將電文變成密碼:(1)將字母A變成字母E,a變成e,即:變成其后的第4個字母;(2)W變成A,X變成B,Y變成C,Z變成D;(3)w變成a,x變成b,y變成c,z變成d;(4)電文中若出現非字母字符則不變。假設:c=getchar();if((c>='a'&&c<='v')||(c>='A'&&c<='V'))c=c+4;if((c>='w'&&c<='z')||(c>='W'&&c<='Z'))c=c-22;putchar(c);#include<stdio.h>voidmain(){charc;
while((c=getchar())!='\n')
//循環輸入一串字符,回車符結束
{if((c>='a'&&c<='v')||(c>='A'&&c<='V'))c=c+4;
if((c>='w'&&c<='z')||(c>='W'&&c<='Z'))c=c-22;
printf("%c",c);//或putchar(c);}
printf("\n");}#include<stdio.h>voidmain(){charc;
while((c=getchar())!='\n'){if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){c=c+4;
if(c>'Z'&&c<='Z'+4||c>'z')c=c-26;}
printf("%c",c);}
printf("\n");}c<='Z'+4why?
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 核電池行業商業計劃書
- 2025年超臨界CO2萃取裝置膜生物反應器及其他項目可行性分析報告
- 招標文件里合同協議書
- 短期投資合同協議書范本
- 勞動合同返聘協議書
- 德州5G+文化旅游項目商業計劃書
- 一起肉雞傳染性支氣管炎和大腸桿菌病混合發病的診治
- 燒烤學徒合同協議書范本
- 2025年軟管隔膜活塞泵市場分析報告
- 中醫遠程醫療運營方案
- 2025年建筑模板制品行業深度研究報告
- 掛名股東簽署協議書
- 湖北省荊門市2025年七年級下學期語文期末考試試卷及答案
- 2025年勞動與社會保障政策考試試題及答案
- 2025年湖北省新高考信息卷(一)物理試題及答案
- 河南省鄭州市2021-2022學年高一下學期期末考試英語試卷(含答案)
- 環境監測中的化學分析技術試題及答案
- 細胞培養技術的基礎試題及答案
- 2025年江蘇省蘇州市中考一模道德與法治試題(含答案)
- 下肢深靜脈血栓的預防和護理新進展
- 國際壓力性損傷-潰瘍預防和治療臨床指南(2025年版)解讀
評論
0/150
提交評論