版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第六章循环结构2什么是循环?为什么要使用循环??循环的基本概念循环是有规律的重复操作。将复杂问题分解为简单的操作过程,程序只对简单过程描述,这些过程的多次重复就可完成对问题的求解。重复的频繁性决定了循环在程序设计中必不可少!问题1:问题2:求学生平均成绩
成绩相加后除以人数做99次加法问题3:找出数x中能同时被3和7整除的数
找数问题分解循环控制3
if--goto循环
while循环
for循环
dowhile循环
先判断后循环
先循环后判断特点:难点:循环嵌套C提供四种循环控制:46.1goto语句与标号一般形式:goto标号;
其中:标号用标识符表示,即由字母、数字和下划线组成,且首字符必须是字母或下划线。不能用整数作标号功能:当程序执行到语句时,改变程序自上而下的执行顺序,执行语句标号指定的语句,并从该语句往下顺序执行程序。用途:1.与if语句一起构成循环结构2.从循环体内跳到循环体外3.改变程序自上而下的执行顺序。缺点:滥用goto语句,可使程序无规律、可读性差。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构成“当型”循环76.2while循环语句1.while循环语句的形式
while(表达式)语句while循环语句的执行过程是:先判断条件,后执行语句。表达式语句零非零2.执行过程这是内嵌语句,也称为循环体,它可以是单语句,也可以是复合语句
循环体内应注意设置修改循环条件的语句。否则循环无法终止。循环体8说明:(1)执行while循环语句时,如果表达式的值第一次计算就等于0,则循环体一次也不执行。(2)发生下列情况之一时,while循环结束执行:表达式的值为0;循环体内遇到break语句;循环体内遇到goto语句,且与该goto语句配合使用的标号所指定的语句在本循环体外;循环体内遇到return语句,此时退出while循环后,执行的流程从包含该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结束零非零框图:循环体思考:删除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思考:取消循环内的输入语句后果?循环次数未知,标记控制的循环121.do—while循环语句的形式
do语句while(表达式);2.执行过程说明:(1)do—while循环语句首先执行循环体,然后计算表达式并检查循环条件,所以循环体至少执行一次。(2)退出do—while循环的条件与退出while循环的条件相同。表达式语句零非零6.3
do—while循环语句注意:不要丢掉分号do—while循环执行过程是:先执行语句,后判断条件。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打印:0main(){inti,s=0;scanf("%d",&i);
do
{s=s+i;i++;}
while(i<=10);printf("s=%d\n",s);}
输入:1打印:55
输入:11打印:11156.4for循环语句1.for循环语句的形式
for([表达式1];[表达式2];[表达式3])语句表达式2表达式1语句表达式3零非零2.执行过程说明:(1)表达式1仅被执行一次;表达式2决定了是否继续执行循环;表达式3则不断修改循环控制变量的值。(2)三个表达式均可省略,分号不能省略。163.说明:(1)最简单的应用形式:for(循环变量赋初值;循环条件;循环变量增值)语句如前例:求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之前对循环变量赋初值
……i=1;for(;i<=100;i++)sum=sum+i;……while(1){...if(表达式)break;...}表达式1放在for前18表达式2省略,则不判断条件,循环无终止进行下去。
……for(i=1;;i++)sum+=i;
表达式3省略,则应另设法保证循环的结束.
……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!
循环体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,然后反复执行语句,则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项和,要循环n次,每次累加1项。除第1项外,每次循环分母都递增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;/*改变符号,为下次循环做准备*/t=t+2;/*分母递增2,为下次循环做准备*/}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三种循环语句的比较for语句和while语句先判断条件,后执行语句,故循环体有可能一次也不执行,而do—while语句的循环体至少执行一次。用while和do—while循环时循环变量初始化的操作应在while和do—while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。26选择三种循环的一般原则如果循环次数已知,计数控制的循环用for如果循环次数未知,条件控制的循环用while如果循环体至少要执行一次用do-while这只是“一般”原则,不是“原则”276.6循环语句的嵌套1.定义:在循环体内又包含一个循环结构,称为循环嵌套。三种循环(while、do_while、for)都可以互相嵌套。例如:以下几种都是合法的嵌套形式for(;;){···
while(){···}
}for循环体嵌套while循环体for(;;){···
for(;;){···}}for循环体嵌套for循环28do{
do{···}while();
}while();do_while循环体嵌套do_while循环while(){
do{···}while();
}while循环体嵌套do_while循环while(){
while(){···}}while循环体嵌套while循环
do{
for(;;){···}}while();do_while循环体嵌套for循环292.嵌套结构规则外循环内循环交叉循环外循环入口内循环出口内循环出口外循环出口30
例10:循环嵌套举例。
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循环结束,再换行.输出结果:
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:按规定的格式输出九九乘法表。main(){inti,j;for(i=1;i<=9;i++)
{for(j=1;j<=i;j++)printf("%d",i*j);printf("\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循环嵌套while循环:
输入6名学生5门课程的成绩,分别统计每名学生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需要双重循环:内循环计算分子和分母,外循环实现累加。作业选作题:习题五第四小题。#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;功能:结束包含该语句的最内层循环
main(){intn;for(n=100;n<=200;n++)
{if(n%3==0)break;printf(″%6d″,n);
}}2.continue语句语法:continue;功能:结束循环体的本次循环main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf(″%6d″,n);}}100-200之间只要遇到能被3整除的数就结束循环。输出:100101本程序将100-200之间不能被3整除的数输出与下列语句等效:if(n%3!=0)printf(″%6d″,n);只能出现在switch和循环语句中只能出现在循环语句的循环体中40for循环结构中的break结构for循环结构中的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时死循环。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循环体“;”是空语句。44注意在for和while语句之后一般没有分号有分号表示循环体就是分号之前的内容空语句——表示循环体内什么都不做
while
(i<100);
i++;死循环
for
(i=0;i<100;i++);
printf("%d",i);用于延时注意!45练习2:下列程序段,选项正确的是()。
inti,k;for(i=0,k=-1;k=1;i++,k++)printf("***");
A.判断循环结束的条件非法
B.无限循环。
C.只循环一次
D.一次也不循环
表达式2:k=1,非零,是无限循环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;
}
循环体共执行了多少次?
S=506次当条件i>j成立时才能执行到break语句For循环是死循环注意: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,结束本次循环。
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外循环的循环体包括内循环和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. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甜菜种植合同法院判决书
- 《蓝田股份分析案例》课件
- 2025年南宁货运从业资格证模拟考试题库及答案解析
- 2025年盐城道路运输从业资格证考哪些项目
- 2025年许昌货运从业资格证模拟考试系统
- 2025年云南货运从业资格证考试题及答案详解
- 健身房环境卫生保洁员招聘合同
- 城市景观照明施工合同范本
- 智能家居网络安全操作规程
- 印刷行业安全规程
- 高三英语二轮复习写作专项读后续写人物情绪描写方法课件
- 殡仪馆物业服务方案
- 电厂缺陷分析报告
- 化工装备的选型与设计
- 外卖小哥培训道路安全管理
- 上市公司投资报告分析报告
- 中医诊疗设备种类目录
- (完整)马克思主义政治经济学习题及参考答案
- 医院预防保健科工作制度及职责范本
- 分离工程课件
- 中国风古诗词诗歌朗读比赛大会唐诗宋词含内容课件两篇
评论
0/150
提交评论