版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第3章. 循环结构程序,1.概述 2. 用 goto 语句和 if 语句构成循环 例: int i=1,sum=0; loop: if(i=100) sum=sum+i; i+; gotoloop; ,P,A,N,A,P,N,2,4.1 循环结构引例 引例:求s=1+2+3+100的和。 这个问题看似简单,但如果限制使用非结构化的goto语句,迄今也只能使用如下编程思路: s=1; s=s+2;/s为1+2 s=s+3;/ s为1+2+3 s=s+99;/ s为1+2+3+99 s=s+100;/ s为1+2+3+99+100,3,循环结构基本思路为: 第1步: s=0; j=1; 第2步
2、: s=s+j; j=j+1; 第3步:如果j100,继续第2步,否则结束。 上述3步操作,第2步是关键,它是循环的主体,称循环体;第1步是循环的初始条件,第3步是循环的终止条件。循环体、初始条件、终止条件是设计循环程序的三要素,4,4.2.1 while语句(当型) 一般形式: while(表达式) 循环体语句 先判表达式,若非0,执行循环体语句,再判表达式 例: 求 main( ) int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(“sum=%d”,sum); 注:循环体中必须有使循环测试条件变化的语句。,i sum 1 1 2 1+
3、2 3 1+2+3 . 100 1+2+3+100,5,【例4.2】输入若干名学生成绩,求最高分、最低分,直到输入成绩为0止。 算法分析:该问题只知道成绩输入的结束条件,并不知道要输入多少个成绩,这是当型循环问题。另外,求若干个数的最大值、最小值也是经常遇到的问题,解决的基本思想是:先将第一个数既放在变量max中,也放在min中;再将第二个数分别与max和min比较,这样就可以求出前2个数中最大的和最小的数,分别将它们放到max和min中,依次类推;最后,变量max和min的值就是最大数和最小数。程序如下:,6,#include void main( ) float x,max,min; sc
4、anf(%f, ,7,4.2.2 do-while语句 (直到型) 一般形式: do 语句 while(表达式); 先执行语句,然后判断表达式,当非0时,返回重 新执行,直到表达式为0时结束。 例: main( ) int i,sum=0; i=1; do sum=sum+i; i+; while(i=100) printf(“sum=%d”,sum); ,8,【例4.3】输入若干名学生成绩,统计各分数段人数(90,8090,7080,6070,60),总人数及求平均成绩,直到输入成绩为0止。 算法分析:这是分类计数问题,根据成绩所处的分数段,相应的变量加1,直到所有成绩都处理完为止。设变量c
5、1、c2、c3、c4、c5分别表示各分数段人数,c1、c2等称为计数变量。假设成绩输入的个数由直到型循环控制,程序如下:,9,#include void main( ) float x,sum=0,aver;/ 变量分别表示成绩、总成绩、平均成绩 int c1,c2,c3,c4,c5,c;/ 计数变量代表各分数段人数和总人数 c1=c2=c3=c4=c5=c=0;/ 从0开始计数 scanf(%f, ,10,【例4.4】从键盘上输入若干字符,以换行为结束符,统计输入字符的个数。 #include void main( ) int s; char c; s=-1;/ 存放统计结果变量的初值 do
6、 s+; while (c=getchar( )!=n);/ 判断是否为换行符 printf(字符数为:%dn,s); 本程序中,换行结束符n也被统计在内,所以将s的初值设置为-1。在循环中通过函数getchar( )从键盘读取1个字符并赋给变量c,然后判断变量c是否不等于换行符n。,11,4.2.3 for语句 While 和 do. while一般在循环次数不确定的情况下使用,for循环是C语言中使用最为灵活的语句。 一般形式: for(表达式1;表达式2;表达式3) 循环体语句 执行过程: 先求表达式1(一般是循环控制变量赋初值) 求表达式2,若非0,则执行循环体语句, 再转到第步,否则
7、循环结束。 求表达式3(一般是循环控制变量增值) 转回到第步继续执行。,非0,图4-3 for循环,0,12,例: 求 main( ) int i,sum=0; for(i=1;i=100;i+)sum=sum+i; printf(“sum=%d”,sum); 注: for(表达式1;表达式2;表达式3); 循环体是空语句。 表达式1,表达式2,表达式3,都省略,死循环。 for (;). 表达式1和表达式3也可以是逗号表达式。 表达式2一般是关系或逻辑表达式,也可以是数值或字符表达式,只要非0,就执行循环体。,13,例:for(i=0;(c=getchar()!=n;i+=c); 不断地输入
8、一个字符,将它们的ASCII码相加,直到 输入一个回车键。 for(;(c=getchar()!=n;) printf(“%c”,c); 从键盘输入一个字符,再输出,直到输入一个回车键。 【例4.5】用for语句编写程序求6的阶乘。 #include void main( ) int k,p; p=1; for(k=1; k7; k+) p=p*k;/ 循环执行6次 printf(6!=%dn,p); printf(k=%dn,k); 运行结果如图所示。,14,【例4.6】统计222到333之间能同时被3和5整除的数的个数。 #include void main( ) int k,s; for
9、(s=0, k=222; k=333; k+) if(k%3=0 s=0, k=222是逗号表达式,完成给变量s、k赋初值,if语句的条件(k%3= =0 for(k=1; k=8; k+) if(k%4=0) break;/终止循环 printf(k=%dn,k); printf(退出for循环时:k=%dn,k); ,16,(2).continue语句:结束本次循环,即跳过循环中 continue 语句之后的语句,转去执行循环体后面的操作。 若将上述程序改用continue语句,程序代码如下: #include void main( ) int k; for(k=1; k=8; k+) i
10、f(k%4=0) continue; /只退出本次循环 printf(k=%dn,k); printf(退出for循环时:k=%dn,k); ,17,4.4循环的嵌套 循环体内包含另一个循环结构。 【例4.8】用for语句编写程序输出乘法九九表 #include void main() int k,j,m; printf(t乘法九九表n); for(k=1; k=9; k+) / k为外循环控制变量 / 外循环体开始 for(j=1; j=9; j+) / j为内循环控制变量 / 内循环体开始 m=k*j; / 共执行81次 printf(%d*%d=%2d ,k,j,m); / 内循环体结束
11、 printf(n); / 共9次换行 / 外循环结束 ,18,思考:要输出如图4.9形式的乘法九九表,如何修改程序?,19,【例4.9】用while语句编程序输出乘法九九表。 #include void main( ) int k,j,m; k=1;/ 外层循环控制变量赋初值 while(k=9) / 外层循环共执行9次 j=1;/ 内层循环控制变量赋初值 while(j=9) / 判断内层循环执行9次 m=k*j;/ 内循环体共执行81次 printf(%d*%d=%d,k,j,m); j=j+1;/ 修改内层循环控制变量 printf(n);/ 9次换行 k=k+1;/ 修改外层循环控制
12、变量 ,20,下面输出图形形状,也是多重循环问题。程序功能:输入n(0 void main() int i,j,n; scanf(%d, / 每行结束输出换行符 ,21,4.5 应用举例 【例3.10】判断m是否为素数。 算法描述:素数就是质数。它除了能表示为它自身和1的乘积以外,不能表示为任何其它两个整数的乘积。要判断正整数m是否是素数,用m分别除以2到m/2间的整数,如果2到m/2间的整数没有一个数能将m整除,则m是素数,否则m不是素数。 在循环中用2到m/2间的整数k去除m,若k能整除m,用break语句终止循环。程序可根据循环控制变量k的值是否超过m/2,来判断m是否为素数。即循环是正
13、常结束, 还是用break语句终止。 程序如下:,22,#include void main() int k,m; scanf(%d, 读者思考:要求100200间的全部素数,如何编写程序?,23,【例4.11】求3位的水仙花数。 水仙花数是指一个n位整数,它的每个位上的数字的n次幂之和等于它本身。例如3位数153是水仙花数,各位数字的立方和135333153。 分析:通过取整、求余等运算,把3位整数的每一位数字分离出来,将他们的 立方和与该整数比较即可。 #include void main( ) int x,j,k,m; printf(100到999间的水仙花数有:n); for(x=10
14、0;x1000;x+) j=x/100; / 分离出高位 k=(x/10)%10; / 分离出中间位 m=x%10; / 分离出低位 if(j*j*j+k*k*k+m*m*m=x) printf( %dn,x); ,24,【例4.12】假设有10位裁判给运动员评分,去掉最高分、最低分,剩余8位裁判的平均分为运动员最后得分。 该问题的数学描述为:求10个数的最大值、最小值和其余8个数的平均值。 求最大值max的方法是先假定第一个数为最大值,然后将该数与下一个数进行比较,若下一个数大于max,则修改max的值为新的数,如此重复,直到与最后一个数比较完毕,max就是最大值。类似地可求最小值。,25,
15、#include void main( ) int c; float x,max,min,s,aver; scanf(%f, ,26,【例4.13】用下列公式计算圆周率的值。 精度要求为 分析: 循环次数不知,用while或do-while比较好。 在循环中要产生级数的当前项,需要找出它的规律。当前项分母是前一项分母加2;用f存放为项的符号,f= -f;可实现项的符号交替改变;t存放当前项,pi存放 /4的值。,27,#include #include #define EPS 1.0e-6 void main( ) float pi=0.0,n=1.0,f=1.0,t; do t=f/n; p
16、i+=t; f= -f; n+=2; while(fabs(t)=EPS); pi=4*pi; printf(=%fn,pi); ,pi n f t 1 1 1 1 1-1/3 3 -1 -1/3 1-1/3+1/5 5 1 1/5 ,28,【补充例 】求Fibonacci数列前40个数。 1,1,2,3,5,8,13,21,. #include void main( ) int i ; long int f1=1,f2=1; for (i=1;i=20;i+) printf(“%12ld %12ld”,f1,f2); if ( i%2= 0)printf(“n” ); f1 = f1+f2;
17、 f2 = f1+f2; ,29,4.6 自主学习 1枚举法 枚举法也称穷举法,就是将所有可能出现的情况都测试一遍,从中找出满足条件的答案。 【例4.14】填数字游戏。求满足下列加法算式的数字。 算式中要求求出满足ABCCB=BCA的数字A、B和C。 分析:用枚举法将所有可能出现的3位数ABC与2位数CB的和,与3位数BCA比较,如果相等就是需要的算式。,30,#include void main( ) int a,b,c; for(a=1;a10;a+) / 不考虑000 for(b=1;b10;b+) for(c=1;c10;c+) if(a*100+b*10+c+c*10+b=b*100+c*10+a) printf(“%d+%d=%d”, a*100+b*10+c, c*10+b, b*100+c*10+a); ,31,牛顿迭代法的基本思想: 选一个近似根x0 由x0求f(x0),得交点p0 通过p0点作f(x)的切线交x轴于x1, x1=x0-f(x0)/f(x0) 由x1求f(x1),得交点p1 再通过p1点作f(x)的 切线交x轴于x2, x2=x1-f(x1)/f(x1) 再由x2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创新思维与创业实战-课件全套 模块1-10 企业家本人 - 创业机遇
- 各地法官入额考试试题及答案
- 2026年贵州水族口语考试试题及答案
- 职员职业发展计划承诺书(3篇)
- 产品设计迭代原型快速生成模板
- 个人信息与数据安全保护承诺书3篇
- 2026年河北省武安市高二历史上册期末考试考试卷附答案【轻巧夺冠】
- 2025年湖南省涟源市高三历史上册期末考试自测卷【黄金题型】附答案
- 餐饮业成本控制策略手册
- 高新技术企业技术创新路径研究研究设计方案
- 河南省顶级名校2026届高三年级5月押题导向卷(一)语文试卷(含答案及解析)
- 2026中国土地征收补偿机制改革与社会稳定风险评估报告
- 2026年《医疗器械质量管理规范》培训试题及答案
- 2026年青岛市市级机关遴选考试笔试试题(含答案)
- 工程项目经理奖惩制度
- 初中三年级数学《网格背景下无刻度直尺作图-几何直观与逻辑推理的深度融合》教案
- 财报思维:写给忙碌者的财报学习书阅读记录
- 党建引领妇幼健康服务优化
- 游泳馆卫生管理制度(标准版)
- GB/T 28253-2025挤压丝锥
- 高校横向合同管理
评论
0/150
提交评论