版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第五章循環(huán)結(jié)構(gòu)程序設計內(nèi)容提要:概述構(gòu)成循環(huán)的語句:while、do-while、for幾種循環(huán)的比較循環(huán)的嵌套break語句和continue語句概述實現(xiàn)循環(huán)的語句:1.用while語句;當型循環(huán)—先判斷再執(zhí)行2.用do-while語句;直到型循環(huán)—先執(zhí)行再判斷3.用for語句。多功能while循環(huán)(實現(xiàn)當型循環(huán))while語句的一般形式:
while(表達式)語句當表達式的值為真(非0)時,執(zhí)行其中的內(nèi)嵌語句(循環(huán)體),然后回過頭來再判斷表達式的值,如此重復;當表達式為假(0)時結(jié)束循環(huán)。如:s=0;k=1;while(k<=100)
{s=s+k;k++;}
(循環(huán)控制表達式、循環(huán)控制變量、循環(huán)體)
k=11<=100s=0+1 k=22<=100s=0+1+2 k=33<=100s=0+1+2+3
……k=100100<=100s=0+1+…+99+100k=101101<=100結(jié)束循環(huán)
s=0;k=1;while(k<=100)
{s=s+k;k++;}注意:若循環(huán)體包含一條以上的語句,應以復合語句形式出現(xiàn);循環(huán)前,必須給循環(huán)控制變量賦初值;循環(huán)體中,必須有改變循環(huán)控制變量值的語句(使循環(huán)趨向結(jié)束的語句);循環(huán)體可以為空,如:while((c=getchar())!=‘A’);
等價于:c=getchar();while(c!=‘A’)c=getchar();例:計算S=分析:這是一個累加求和問題。
s=1+2+3s=0s=s+1s=s+2s=s+3s=s+k和的新值和的當前值求和項當前值用while語句的程序如下:#include<stdio.h>intmain(){intk,s;s=0;k=1;while(k<=3){s=s+k;k++;}printf(“s=%d”,s);}注意:s、k的初值與位置。若交換這兩句的位置,要實現(xiàn)同樣功能怎么改?用while語句的程序如下:#include<stdio.h>intmain(){intk,s;s=0;k=1;while(k<=3){s=s+k;k++;}printf(“s=%d”,s);}s=0k=1k=11<=3s=0+1k=22<=3s=0+1+2k=33<=3s=0+1+2+3k=44<=3不成立用while語句的程序如下:#include<stdio.h>intmain(){intk,s;s=0;k=1;while(k<=3){k++;
s=s+k;}printf(“s=%d”,s);}s=0k=11<=3k=2s=0+22<=3k=3s=0+2+33<=3k=4s=0+2+3+44<=3不成立用while語句的程序如下:#include<stdio.h>intmain(){intk,s;s=0;k=0;while(k<=3){k++;
s=s+k;}printf(“s=%d”,s);}s=0k=00<=3k=1s=0+11<=3k=2s=0+1+22<=3k=3s=0+1+2+33<=3k=4s=0+1+2+3+44<=3不成立例:讀程序#include<stdio.h>intmain(){intk,s,n;printf(“entern:”);scanf(“%d”,&n);s=0;k=1;while(k<=n){s+=k;k++;}printf(“%d=%d\n”,n,s);}#include<stdio.h>intmain(){intk,t,n;printf(“entern:”);scanf(“%d”,&n);t=1;k=1;while(k<=n){t*=k;k++;}printf(“%d!=%d\n”,n,t);}#include<stdio.h>intmain(){intk,t,n,s=0;printf(“entern:”);scanf(“%d”,&n);t=1;k=1;while(k<=n){t*=k;s+=t;k++;}printf(“s=%d\n”,s);}s=0k=1t=1n=3k=11<=3t=1*1s=0+1!k=22<=3t=1*2s=0+1!+2!k=33<=3t=1*2*3s=0+1!+2!+3!k=44<=3不成立【例】求100以內(nèi)的奇數(shù)、偶數(shù)之和分析:偶數(shù)和s1=2+4+6+…+100
奇數(shù)和s2=1+3+5+…+99#include<stdio.h>intmain(){intk=1,s1=0,s2=0;
while(k<=100){if(k%2==0)s1+=k;elses2+=k;k++;}printf(“偶數(shù)和為%d,奇數(shù)和為%d\n”,s1,s2);}do-while循環(huán)do-while語句用來實現(xiàn)“直到型”循環(huán),它的一般形式為:do語句
while(表達式);例:計算S=#include<stdio.h>intmain(){intk,s;s=0;k=1;
while(k<=3){s=s+k;k++;}printf(“s=%d”,s);}#include<stdio.h>intmain(){intk,s;s=0;k=1;do{s=s+k;k++;}while(k<=3);printf(“s=%d”,s);}先判斷后做先做后判斷例:計算S=#include<stdio.h>intmain(){intk,s;s=0;k=1;do{s=s+k;k++;}while(k<=3);printf(“s=%d”,s);}s=0k=1s=0+1k=22<=3s=0+1+2k=33<=3s=0+1+2+3k=44<=3不成立for循環(huán)for循環(huán)的一般形式:for(表達式1;表達式2;表達式3)
語句
表達式1在進入循環(huán)之前求解(循環(huán)變量賦初值);表達式3是循環(huán)體的一部分。s=0;for(k=1;k<=3;k++)s=s+k;s=0k=1k=11<=3s=0+1k=22<=3s=0+1+2k=33<=3s=0+1+2+3k=44<=3不成立例:for循環(huán)的其他形式:
表達式1;1)表達式1可以移到for語句的前邊2)表達式3可以移到內(nèi)嵌語句中for(表達式1;表達式2;表達式3)
語句表達式1;for(;表達式2;){語句表達式3;}for(;表達式2;表達式3)
語句for循環(huán)的其他形式:
3)表達式2為空,值永遠為真稱為死循環(huán)for(表達式1;表達式2;表達式3)
語句表達式1;for(;;){語句表達式3;}for循環(huán)的其他形式:
for(表達式1;表達式2;表達式3)
語句表達式1;1)表達式1可以移到for語句的前邊2)表達式3可以移到內(nèi)嵌語句中{語句表達式3;}3)表達式2為空,值永遠為真稱為死循環(huán)說明:1、表達式1省略時,應在for前給循環(huán)變量賦初值如:s=0;k=1;for(;k<=3;k++)s=s+k;2、表達式2省略時,不判斷循環(huán)條件,將成為“死循環(huán)”,需要在循環(huán)體中引入break語句以退出循環(huán)。3、表達式3省略時,循環(huán)體內(nèi)應有使循環(huán)條件改變的語句。如:for(k=1;k<=3;){s=s+k;
k++;}4、同時省略表達式1和表達式3,只有表達式2,此時相當于while語句。如:
k=1;for(;k<=3;){s=s+k;k++;}5、表達式2一般是關(guān)系表達式或邏輯表達式,但也可以是數(shù)值表達式或字符表達式,只要其值不等于0就執(zhí)行循環(huán)體。如:s=0;for(k=1;k-4;k++)s=s+k;
僅當k的值等于4時終止循環(huán),k-4是數(shù)值表達式。k=1;while(k<=3){s=s+k;k++;}如:s=0;for(k=1;k-4;k++)s=s+k;
僅當k的值等于4時終止循環(huán),k-4是數(shù)值表達式。s=0k=11-4=-3s=0+1k=22-4=-2s=0+1+2k=33-4=-1s=0+1+2+3k=44-4=0結(jié)束例:讀程序,判斷程序的功能。#include<stdio.h>intmain(){charc;for(;(c=getchar())!=‘\n’;)putchar(c);putchar(‘\n’);}讀入一個字符,當它不是回車符時就輸出。注意:getchar()僅當遇到回車符時才開始執(zhí)行,從鍵盤緩沖區(qū)中取字符。如:OK!輸入
OK!輸出
僅輸出字母怎么做?而不是OOKK!!循環(huán)的嵌套一個循環(huán)體內(nèi)包含著另一個完整的循環(huán)結(jié)構(gòu),稱為循環(huán)嵌套;內(nèi)嵌的循環(huán)中又可以嵌套循環(huán),從而構(gòu)成多重循環(huán);三種循環(huán)可以互相嵌套。下面幾種都是合法的形式:(1)while()(2)do(3)for(;;){…{…{
while()
do
for(;;){…}{…}{…}}while();}}while();
(4)while()(5)for(;;)(6)do{…{…{…
do{…}
while()for(;;){}while();{}
…
…
…}}}while();
例:打印圖形分析:1)圖形每行的起始位置相同2)每行的字符數(shù)相同3)用一重循環(huán)控制輸出行數(shù)#include<stdio.h>intmain(){introw;for(row=1;row<=5;row++)
printf(“********\n”);}例:打印圖形#include<stdio.h>intmain(){introw;for(row=1;row<=5;row++)
printf(“********\n”);}#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++)
{for(col=1;col<=8;col++)printf(“*”);printf(“\n”);}}循環(huán)嵌套的說明:1、嵌套的循環(huán)控制變量不能相同;2、內(nèi)循環(huán)變化快,外循環(huán)變化慢如:for(i=1;i<=3;i++){for(j=1;j<=i;j++)printf(“%d+%d=%2d”,i,j,i+j);printf(“\n”);}3、正確確定循環(huán)體4、循環(huán)控制變量常與求解的問題掛鉤for(i=1;i<=3;i++){for(j=1;j<=i;j++) printf(“%d+%d=%2d”,i,j,i+j);printf(“\n”);}i=1j=11<=11+1=2j=22<=1i=2j=11<=22+1=3j=22<=22+2=4j=33<=2i=3j=11<=33+1=4j=22<=33+2=5j=33<=33+3=6j=44<=31+1=22+1=32+2=43+1=43+2=53+3=6編程實現(xiàn):按如下形式打印九九乘法口訣表
1*1=12*1=22*2=43*1=33*2=63*3=9……9*1=99*2=189*3=27…9*9=81for(i=1;i<=9;i++){for(j=1;j<=i;j++) printf(“%d*%d=%2d”,i,j,i*j);printf(“\n”);}例:打印圖形分析:1)每行的起始位置不同,空格數(shù)遞減12)每行的字符數(shù)相同3)用二重循環(huán)實現(xiàn):外循環(huán)控制輸出行數(shù);內(nèi)循環(huán)控制輸出空格數(shù)第1行4個空格第2行3個空格第3行2個空格第4行1個空格第5行0個空格第row行5-row個空格例:打印圖形#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++){for(col=1;col<=5-row;col++)printf(“
”);printf(“********\n”);}}例:打印圖形#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++){for(col=1;col<=5-row;col++)printf(“
”);for(col=1;col<=8;col++)printf(“*”);printf(“\n”);}}例:試找出滿足下列條件的所有兩位數(shù)
1)其十位數(shù)不大于2
2)將個位與十位對換,得到的兩位數(shù)是原兩位數(shù)的兩倍多分析:用二重循環(huán)的循環(huán)控制變量分別表示十位數(shù)和個位數(shù)。十位數(shù)i取值1~2
個位數(shù)j取值2~9n=10*i+jm=10*j+i
若m>=2*n并m<3*n,則n為滿足條件的兩位數(shù)。#include<stdio.h>intmain(){inti,j,n,m;for(i=1;i<=2;++i)for(j=2;j<=9;++j){n=10*i+j;m=10*j+i;if(m>=2*n&&m<3*n)printf(“%d”,n);}}i=1j=2n=12m=21j=3n=13m=31……j=9n=19m=91i=2j=2n=22m=22j=3n=23m=32……j=9n=29m=92#include<stdio.h>intmain(){inti,j,n,m,s=0;for(i=1;i<=2;++i)for(j=2;j<=9;++j){n=10*i+j;m=10*j+i;if(m>=2*n&&m<3*n){++s;printf(“%d”,n);
if(s%5==0)printf(“\n”);}}}i=1j=2n=12m=21j=3n=13m=31……j=9n=19m=91i=2j=2n=22m=22j=3n=23m=32……j=9n=29m=92幾種循環(huán)的比較1、關(guān)于循環(huán)的控制2、循環(huán)體的執(zhí)行先判斷條件,循環(huán)體可能一次也不執(zhí)行:
while(表達式)語句后判斷條件,循環(huán)體至少執(zhí)行一次:
do語句
while(表達式);3、for循環(huán)功能強兩個界限不清,使程序設計較隨意。
for(表達式1;表達式2;表達式3)語句4、都可以用break語句終止循環(huán),用continue語句結(jié)束本次循環(huán)。break語句用break語句可以結(jié)束switch結(jié)構(gòu)和三種循環(huán)。例:對所有輸入的字符進行計數(shù),直到輸入的字符為換行符為止。intmain(){ charc;inti=0; while(1) {c=getchar(); if(c=='\n')break; i++;} printf("字符數(shù)為%d\n",i);}break語句用break語句可以結(jié)束switch結(jié)構(gòu)和三種循環(huán)。例:判斷m是否為素數(shù)。分析:素數(shù)是指除了1和它本身以外,不能被其他整數(shù)整除的數(shù)。i的取值范圍可以縮小到2~k=因此,判斷m是否為素數(shù)的算法是:1、依次用2~k之間的數(shù)整除m,如果找到某個整數(shù)i能整除m,則m必不是素數(shù);2、如果找不到i,則可以斷定m為素數(shù)。#include<stdio.h>#include<math.h>intmain(){intm,i,k;
scanf(″%d″,&m);k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;/*結(jié)束循環(huán)*/
if(i>k)printf(“%d是素數(shù)\n″,m);
elseprintf(”%d是合數(shù)\n″,m);
}i初值能否為1?#include<stdio.h>#include<math.h>intmain(){intm,i,k,flag=1;
scanf(″%d″,&m);k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0){flag=0;break;}
if(flag)printf(“%d是素數(shù)\n″,m);
elseprintf(”%d是合數(shù)\n″,m);
}continue語句用continue語句可以結(jié)束本次循環(huán),即忽略循環(huán)體中剩余的語句。例:把100~200之間的不能被3整除的數(shù)輸出#include<stdio.h>
intmain()
{intn;
for(n=100;n<=200;n++)
{if(n%3==0)continue;
printf("%d″,n);
}
}本次循環(huán)結(jié)束,循環(huán)體的剩余語句被忽略,執(zhí)行表達式3,進入下一循環(huán),continue總是作if的內(nèi)嵌語句if(n%3)printf(“%d”,n);例:用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,直到某一項的絕對值小于10-6為止。分析:pi---求和結(jié)果,其初值為0;n---求和項分母,初值為1,每次前進2;s---符號項,初值為1;t---求和項,值為s/n;|t|>=10-6---循環(huán)控制條件#include<stdio.h>#include<math.h>intmain(){ints;floatpi,n,t;pi=0;n=1;t=1;s=1;while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=4*pi;printf(“π=%8.6f\n”,pi);}n改為整型如何?例:求Fibonacci數(shù)列前40個數(shù),每行輸出4個數(shù)。這個數(shù)列有如下特點:第1,2兩個數(shù)為1,1。從第3個數(shù)開始,該數(shù)是其前面兩個數(shù)之和。即:F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n≥3)
分析:(1)f1、f2直接賦值;(2)進行20次循環(huán),每次計算并輸出兩項;(3)f3=f1+f2,此后f1已無用,f3可存于f1,即用語句f1=f1+f2;f4=f2+f3,f3已在f1中,此后f2已無用,f4可存于f2,即用語句f2=f2+f1。(4)此數(shù)列增長很快,輸出宜用長整型(%ld),每行輸出4個數(shù),即每輸出4個數(shù)后輸出一個換行符。#include<stdio.h>
intmain()
{longintf1,f2;
inti;
f1=1;f2=1;
for(i=1;i<=20;i++)
{printf(″%12ld%12ld″,f1,f2);
f1=f1+f2;
f2=f2+f1;}
}#include<stdio.h>
intmain()
{longintf1,f2;
inti;
f1=1;f2=1;
for(i=1;i<=20;i++)
{printf(″%12ld%12ld″,f1,f2);
if(i%2==0)printf(″\n″);
f1=f1+f2;
f2=f2+f1;}
}編程實現(xiàn):打印輸出以下圖案***************#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++){for(col=1;col<=row;col++)printf(“*”);printf(“\n”);}}作業(yè)3:編程實現(xiàn):打印輸出以下圖案(兩個并列的內(nèi)循環(huán)控制輸出每行的空格數(shù)和字符數(shù))#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++){for(col=1;col<=5-row;col++)printf(“
”);for(col=1;col<=2*row-1;col++)printf(“*”);printf(“\n”);}}作業(yè)4:1、編程實現(xiàn):統(tǒng)計全班某門功課期末考試的平均分和最高分。(設全班人數(shù)10人,10位同學的成績都用變量score存儲)2、編程實現(xiàn):按如下形式打印九九乘法口訣表
1*1=12*1=22*2=43*1=33*2=63*3=9……9*1=99*2=189*3=27…9*9=81#include<stdio.h>intmain(){inti=1,a,max=0;while(i<=3){scanf(“%d”,&a);if(max<=a)max=a;i++;}printf(“最大值為%d”,max);}max0a90假設有三位同學成績分別為90,85,9590859595#include<stdio.h>intmain(){inti=1,score,max=0;floatsum=0;while(i<=10){printf(“請輸入第%d位同學的成績:”,i);scanf(“%d”,&score);sum=sum+score;if(max<=score)max=score;i++;}printf(“平均分為%f,最高分為%d”,sum/10,max);}例:輸入兩個正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù)。分析:1、用輾轉(zhuǎn)相除法求最大公約數(shù)。
m對n求余數(shù)為a,若a≠0,則m<-n,n<-a,繼續(xù)求余;否則n為最大公約數(shù)。如:m=12,n=212、最小公倍數(shù)=兩個數(shù)的積/最大公約數(shù)#include<stdio.h>intmain(){intm,n,s=1,t=1,i,j;scanf("%d,%d",&m,&n);if(m<n){t=m;m=n;n=t;}for(i=1;i<=m;i++) if(m%i==0&&n%i==0)s=i;j=m;while(1){if(j%m==0&&j%n==0){t=j;break;}elsej++;}printf(“最大公約數(shù)s=%d,最小公倍數(shù)t=%d\n",s,t);}用while語句編寫的程序如下:#include<stdio.h>intmain(){intm,n,m1,n1,a;printf(“輸入兩個正整數(shù):\n”);scanf(“%d%d”,&m,&n);m1=m;n1=n;a=m1%n1;while(a!=0){m1=n1;n1=a;a=m1%n1;}printf(“最大公約數(shù)是%d\n”,n1);printf(“最小公倍數(shù)是%d\n”,m*n/n1);}m*n/n1注意循環(huán)變量賦初值,改變循環(huán)變量值。1.若i,j已定義為int型,則以下程序段中循環(huán)體的總的執(zhí)行次數(shù)是
。
for(i=5;i;i--)for(j=0;j<4;j++){}A)20B)24C)25D)302.下面程序的運行結(jié)果是:
。#include<stdio.h>main(){intI;for(I=1;I<=5;I++)switch(I%5){case0:printf(“*”);break;case1:printf(“#”);break;default:printf(“\n”);case2:printf(“&”);break;}}A)#&&*B)#&C)#D)#&&&&*&*&*3.在下列程序中,while循環(huán)的循環(huán)次數(shù)是
。main(){ inti=0; while(i<10) { if(i<1)continue; if(i==5)break; i++; } ......}A)1B)10C)6D)死循環(huán)、不能確定次數(shù)2.程序段如下intk=-20;while(k=0)k=k+1;則
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 土石方工程施工合作協(xié)議范本
- 砌磚分包商合同模板
- 旅游租車協(xié)議書范本
- 蔬菜采購合同的修改記錄
- 二手房屋買賣合同范本點評
- 工程勞務分包結(jié)算單填寫指南
- 雞苗買賣合同示例
- 國際采購合同條款解析
- 河北工程分包協(xié)議樣本
- 保健品交易合同
- 韋尼克腦病病因介紹
- 死亡醫(yī)學證明管理規(guī)定(3篇)
- 2024-2030年中國三氧化二砷行業(yè)運行狀況及發(fā)展可行性分析報告
- 2024年制造業(yè)代工生產(chǎn)保密協(xié)議樣本版
- 醫(yī)院維修維保工程合同范文
- 2024年度學校工作總結(jié)校長匯報:六大支柱筑夢教育新征程
- 學生體質(zhì)健康狀況與體能發(fā)展質(zhì)量的幾個問題課件
- 《奇效的敷臍療法》課件
- 2024《整治形式主義為基層減負若干規(guī)定》全文課件
- 常用統(tǒng)計軟件應用智慧樹知到期末考試答案章節(jié)答案2024年揚州大學
- 中國法律史-第三次平時作業(yè)-國開-參考資料
評論
0/150
提交評論