幻灯片 中南民族大学_第1页
幻灯片 中南民族大学_第2页
幻灯片 中南民族大学_第3页
幻灯片 中南民族大学_第4页
幻灯片 中南民族大学_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章循环控制§5.1问题的提出与程序示例前面已介绍了顺序结构,选择结构,本章介绍循环结构。如:

问题1:在屏幕上输出整数1~20问题2:sum=1+2+3+…+100;实际问题:

一组重复执行的语句。则用循环结构解决。C语言有三种形式的循环:1.

当型循环:while

语句2.

直到型循环:do…while语句3.

for语句§5.2while语句

为了使程序的结构化功能强,应尽量少用goto语句。形式:while(表达式)

语句专门的当型循环语句––while语句2.功能:先判断表达式的值。若0.则执行其后面的语句,否则while执行完毕。循环条件3.

流程图:表达式语句0=0下一语句将上述第一个问题用while语句写出:i=1;while(i<=20){printf(“%d”,i);i++;}要写出一个正确的循环结构,要做以下几方面工作:控制变量赋初值;设置正确的循环条件;书写循环体,并且循环体中应有控制变量的更新、调整,使循环条件趋向于0(假)4.执行过程:先判断表达式的值。若0.则执行其后面的语句,否则while执行完毕。第二个问题:求1+2+3+……+100之和。分析:1.变量的个数,初始值:加数的变化规律,依次递增1,可用一个变量i反映加数的变化情况,应赋初始值为1;要用一个变量来存放累加的结果,其初始值应为0;2.循环条件反复要做加法一直做到什么时候停止下来呢?

做到加数变到100时停止,所以有循环条件为:i<=1003.循环体在循环体中是反复要做的事情即做加法,除此之外,循环体中应该有改变循环变量的语句,保证循环在重复执行若干次之后循环条件不再满足,从而跳出循环。语句中应有使循环变量发生变化的语句。否则会出现无限循环–––“死”循环。请阅读教材P100例5-5和例5-6注:

while后面的语句一般为复合语句,即:加{}intsum,i;sum=0;i=1;while(i<=100){sum+=i;i++;}例5-2-3:输出1---50之间的所有偶数main(){

intx=2; while(x<=50) { printf("%4d",x); x=x+2; }

printf("\n");}例5-2-4:输出100---999之间所有能被7整除的数,并统计共有几个这样的数.main(){

intx=100,n=0; while(x<=999) { if(x%7)==0) { printf("%5d",x); n++; } x++; }}阅读以下程序main(){

int

i,sum; i=0,sum=0;

while(i<=100) { sum=sum+i; i=i+7; }

printf("%d",sum);}把0—100所有7的倍数(或所有能被7整除的数)相加.赋初值循环条件循环控制变量发生变化循环体While循环是先判断表达式,后执行循环体循环体有可能一次也不执行main(){

intx=10; while(x=0) { x=x-1; }

printf("%d",x);}§5.3do…while语句

一种专门的“直到型”循环语句。2.

执行过程:先执行语句,再判表达式的值,若0,再执行语句,否则结束循环3.

流程:语句表达式0=0形式:do{

语句

}while(表达式);至少执行一次循环体!用do…while编程求s=1+2+3+…+100main(){

int

sum=0,i=1; do {

sum=sum+i;

i++;

}while(i<=100);

printf("sum=%d\n",sum);}赋初值循环条件循环控制变量发生变化循环体main(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i<=100);printf("%d",sum);}用do…while改写1+2+3+…..+100程序如下:

while语句与do…while语句的区别:

当第一次执行时,若表达式=0时,则while语句与dowhile有所不同,dowhile执行一次循环体,而while不执行。§5.5for语句1.形式首先计算表达式1,接着执行表达式2,若表达式2的值0,则执行语句,接着计算表达式3,再判断表达式2的值.依此重复下去,直到表达式2的值=0(假)。一种形式更为灵活的循环语句。2.执行过程格式:For(表达式1;表达式2;表达式3)

语句;初值循环条件循环控制变量的改变循环体3.

流程:计算表达式1求表达式2值语句计算表达式3结束for语句=0(假)0(真)例

计算s=1+2+…+100main(){

ints=0,k; for(k=1;k<=100;k++) s=s+k;

printf("s=%d\n",s);}for用while代替的流程:表达式1;

while(表达式2){

语句表达式3;}for语句完全可以用while代替,但for直观、简单、方便。for(表达式1;表达式2;表达式3)

语句;4.for语句的几种特例例:任意输入两个整数a,b,求main(){inti,j,a,b,sum;

printf("pleaseinputtwonumber!\n")

scanf("a=%d,b=%d",&a,&b);i=a;j=b;可以省略表达式1,但须保留分号;这时在for之前就得赋值给循环变量;if(a>b){i=b;j=a;}for(;i<=j;i++)sum=sum+i;printf("\nsum=%d",sum);}表达式2一般不可省略,否则为无限循环相当于:while(1){sum=sum+i;i++;}例:

for(i=1;

;i++)sum=sum+i;相当于条件永真、永不为0,若用while表示表达式3亦可省略,但在循环体中须有语句修改循环变量;以使表达式2在某一时刻为0而正常结束循环。例:

for(sum=0,i=1;i<=100;){sum=sum+i;i++;}若同时省略表达式1,表达式3,则相当于while(表达式2)语句。相当于

while(i<=100)

{sum+=i;i++;}例:for(;i<=100;){sum+=i;i++;}三个表达式均省略即for(;;)语句则相当于while(1)语句.表达式1、表达式3可以是逗号表达式,以使循环变量值在修改时可以对其它变量赋值。如

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

sum=0;for(i=1;i<=100;i=i+2)表达式2可以是关系表达式,也可以是数值表达式或字符表达式。只要值0.即执行循环体.例:

for(i=0;(c=getchar())!='\n';i+=c);请思考以下程序段的执行结果:for(i=1;i<=20;i++);printf(“%d“,i);§5.5

循环的嵌套

与其它语言一样,当循环体中又包含了另一个完整的循环语句时–––嵌套。C有三种循环语句,均可以相互嵌套:

while(){…while() …{}}for(;;){…while(){}do{}while();…

}程序举例编写程序,在一行内输出整数1-10,并连续输出五行。#include"stdio.h"voidmain(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=10;j++)printf("%d",j); printf("\n");}}程序举例编程输出”九九乘法口诀表“#include"stdio.h"voidmain(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++) printf("%d*%d=%-3d",i,j,i*j); printf("\n");}}§三种循环的比较1.for循环功能强于while,do…while.但若不是明显地给出循环变量初终值(或修改条件),则应用while或do…while.以增强程序的结构化和可读性。2.要防止无限循环––死循环。3.循环过程中,为了结束本次循环或跳出整个循环。分别要用到continue和break语句。§5.6break语句break语句语法格式:

break;在循环体中的功能:终止最内层循环。从包含它的最内层循环语句中(while、do……while、for)中退出,执行包含它的循环语句的下一条语句。

问题:计算圆的面积r2,半径取1,2,3,4…,当面积>100时结束。for(r=1;r<=10;r++)

{area=pirr;if(area>100)

break;

}

printf

(“r=%d,area=%f",area);

从结构化程序要求出发,用break;退出循环,进入for语句的下一条语句。举例:编程求3-100之间的所有素数。题目分析:假设一个数是m,判断它是素数的方法是:它不能被2~m-1中任何一个数整除。程序:

inti,j;for(i=3;i<=100;i++){for(j=2;j<=i-1;j++)if(i%j==0)break;if(i==j)printf("%4d",i);}返回1.continuce语句5.7contiune语句格式:

continue;功能:结束本次循环(即本次循环体中continue后面的部分不执行),开始下一次循环。continue用在while和do……while语句中与用在for语句中略有不同。在for语句中将终止本次循环体运行,但是要计算表达式3。

main(){intn;for(n=100;n<200;n++)if(n%3!=0)printf("%d",n);}问题:编写程序,打印100~200中不能被3整除的数。换一种方式:

main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf("%d",n);}}continue语句起了结束本次循环的作用。break与continue都可以用在循环体中,使用时要注意两者的区别:

break是使内层循环立即终止,执行循环体外的第一条语句,而continue语句是终止本次循环,执行下一次循环;

break语句可用在switch语句中,而continue则不能。2.break与continuce的区别比较break和continue在循环体中的使用inti=0;while(i<=9){i++;if(i==5)

break;printf("%d\n",i);}inti=0;while(i<=9){i++;if(i==5)

continue;printf("%d\n",i);}请思考上述两个程序的运行结果。5.8控制循环的实用方法控制循环的方法大致可以分为以下几种:计数循环哨兵循环计数哨兵循环询问循环输入验证循环等1计数循环和哨兵循环计数循环程序段:

for(i=1,sum=0;i<=99;i=i+2)sum=sum+i;哨兵循环程序段:

c=getchar();while(c!=‘$’){putchar(c);c=getchar();}2计数哨兵循环编程求3-100之间的所有素数。

inti,j,flag;for(i=3;i<=100;i++){flag=1;for(j=2;(j<=i-1)&&flag;j++)if(i%j==0)flag=0;if(flag==1)printf("%4d",i);}回顾3.询问循环例5.23:编写程序输入某门功课的若干个同学的成绩,并计算平均分,通过询问循环来控制输入是否停止本程序在每次接收用户输入的分数以前,都要询问用户是否需要继续输入数据。如果用户回答“Y”,则循环继续,如果用户回答“N”,则循环结束。具体程序代码如下:

intsum,i,score,c;sum=0;i=0;

printf("Doyouwanttoinputdata(y/n):");c=getchar();getchar();

while(c=='Y'||c=='y'){ printf("\nPleaseenterscore:"); scanf("%d",&score); getchar(); sum=sum+score; i++;

printf("\nDoyouwanttocontinueinputdata(y/n):"); c=getchar(); getchar();}if(i!=0) printf("aver=%5.2lf\n",1.0*sum/i);else printf("\nNodata!");P124习题18:假设某高速公路的一个收费站的收费标准为:小型车15元/车次、中型车35元/车次、大型车50元/车次、重型车70元/车次。编写程序,循环显示下列列表,请用户选择车型,根据用户的选择输出应交的费用,直到用户选择“退出”,程序结束。

1-小型车

2-中型车

3-大型车

4-重型车

5-退出参考P115例5.24程序代码如下:inti=0,x;while(i!=5){ printf("\n1-小型车");printf("\n2-中型车");printf("\n3-大型车");printf("\n4-重型车");

printf("\nPleaseinputyourchoice:"); scanf("%d",&i); switch(i) { case5:break; case1:printf("小型车收费15元/车次\n");break;case2:printf("中型车收费35元/车次\n");break; case3:printf("大型车收费50元/车次\n");break; case4:printf("重型车收费75元/车次\n");break; default:printf("Errorchoice!\n"); }}用循环结构解决实际问题的方法大致可以分为:穷举、求和(积)、迭代例5.26:请列出所有个位数是6,且能被3整除的两位数。§5.9程序举例

穷举法1:

inti; for(i=1;i<=9;i++) if((i*10+6)%3==0) printf("%3d\n",i*10+6);穷举法1:

inti; for(i=10;i<=99;i++) if(i%10==6&&i%3==0) printf("%3d\n",i);例5.27编程计算inti,flag;floatsum;for(i=1,sum=0,flag=1;i<=100;flag=-flag,i++) sum=sum+flag*1.0/(i*i);printf("sum=%f\n",sum);方法二:inti;floatsum;for(i=1,sum=0;i<=100;i=i+2)sum=sum+1.0/(i*i);for(i=2;i<=100;i=i+2)sum=sum-1.0/(i*i);printf("sum=%f\n",sum);方法一:例5.29:

求F

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论