版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 循环结构程序设计,5.1 while语句 5.2 do-while语句 5.3 for语句 5.5 break语句和continue语句 5.6 循环的嵌套 5.7 循环结构程序设计举例,在C语言中可以用以下语句来实现循环: 1. 用goto语句和if语句构成循环; 2. 用while语句; 3. 用do-while语句; 4. 用for语句。,循环:就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。,5.1 while语句,1、while 语句的形式: while (表达式) 循环体;,2 、 while 语句 常称为“当型”循环语句。,任意类型,非0为真,0为
2、假,利用循环结构输出10个星号,#include “stdio.h” Void main() int k=1; while(k=10) printf(“*”); k+; ,3、说明:,先判断表达式,后执行语句。,循环体多于一句时,用一对 括起。,while循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。,编程求:S=1+2+3+100,0,S,1,2,100,S+1,S,S+2,S,S+100,S,作100次加法,S+i,S,累加器,计数器,流程图,传统流程图,N-S流程图,#include “stdio.h” Void main() i=1; s =0; while (
3、i=100) s=s+i; i+; printf(“n1+2+3+100=%d”,s); ,循环变量的初始化 计数器的初始化,累加器的初始化,循环控制条件,累加,修改循环变量,循环语句的三要素,输入任意整数求和如何实现?,【例5-1】编程求 ,直到 累加的和大于或等于10000为止,输出n值,i=1 sum=0,sum1000,sum=sum+i*i,i=i+1,输出n=i-1和sum,结束,开始,#include void main() int i ,sum; i=1,sum=0; while(sum10000) sum+=i*i; i+; printf(“n=%d,sum=%dn”,i-1
4、,sum); ,变量赋初值,循环条件,累加,改变循环条件,注意,表达式在判断前,必须要有明确的值。,循环体中一般有改变条件表达式的语句,是循环趋于结束,while (表达式)后面没有分号,且一般用于循环次数不确定的情况,循环体中语句的先后位置必须符合逻辑,否则将影响运算结果。,国家等级考试练习,1.若有以下程序: main() int y=10; while(y-) ; printf(“y=%dn”,y); 程序运行的结果是 a.y=0 b.y=-1 c.y=1 d.死循环,B,2.有以下程序: main() int x=0,y=5,z=3; while(z- printf(“%d,%d,%d
5、n”,x,y,z) 程序执行后输出的结果是.,3,3,0,3.以下程序的输出结果是 main() int n=12345,d; while(n!=0) d=n%10;printf(“%d”,d);n/=10; ,54321,5.2 do-while语句,1、 do-while的形式: do 循环体; while (表达式);,真(非零),循环体,假(零),3、说明:,先执行语句,后判断表达式。,第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同。,在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。,求s=1+2+3.+
6、100和,利用do-while实现,#include “stdio.h” void main() int i=1,sum=0; do sum=sum+i; i=i+1; while(i=100); printf(“sum=%dn”,sum); ,编程求 ,直到 累加的和大于或等于10000为止。(do-while实现),#include void main() int i ,sum; i=1,sum=0; do sum+=i*i; i+; while(sum10000); printf(“n=%d,sum=%dn”,i-1,sum); ,变量赋初值,循环条件,累加,改变循环条件,国家等级考试练
7、习,1.有以下程序段 int n,t=1,s=0; scanf(“%d”, 为了使程序不陷入死循环,从键盘输入的数据应该是 a.任意正奇数 b.任意负偶数 c.任意正偶数 d.任意负奇数,D,2.若变量已正确定义,有以下程序段 i=0; do printf(“%d”,i);while(i+) ; printf(“%dn”,i); 其输出结果是 a.0,0 b.0,1 c.1,1 d.死循环,B,3.执行下面程序段的结果是 int x=234; do printf(“%3dn”,x-); while(!x);,234,5.3 for语句,1、for的形式: for (初始表达式1;条件表达式2;
8、表达式3) 循环体 ;,初始表达式1:用于循环开始前为循环变量设置初始值。,表达式2:控制循环执行的条件,决定循环次数。,表达式3:循环控制变量修改表达式。,循环体语句: 被重复执行的语句。,表达式3,计算表达式1,循环体,零,非零,for的下一条语句,2、执行过程,for(i=1,sum=0;i=100;i+) sum=sum+i;,例如:,它相当于以下语句: i=1; while (i=100) sum=sum+i; i+; ,表达式1;,while(表达式2),表达式3;,3、 说明,三个表达式都可以是逗号表达式。,三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省
9、略。,多用于循环次数确定的情况,4. for语句中表达式省略的形式,(1)for语句一般形式中的“表达式1”可以省略; 如: sum=0;i=1; for ( ; i=100;i+) sum=sum+i;,(2)表达式2省略,即不判断循环条件,循环无终止地进行下去; 如: for(sum=0,i=1;i+) if(i100) break; sum=sum+i; ,(3)表达式3也可以省略,但此时保证循环能正常结束如: for(sum=0,i=1;i=100;) sum=sum+i; i+; ,(4) 可以省略表达式1和表达式3,只有表达式2,如: i=1; sum=0; for (;i=100
10、;) sum=sum+i; i+; ,i=1;sum=0; while (i=100) sum=sum+i; i+; ,相当于,while (1) 循环体; 即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。,(5)三个表达式都可省略,如 for ( ; ; ) 循环体;,如: sum=0,i=1; for(;) if(i100) break; sum=sum+i; i+; ,相当于,(6)循环体为空语句 对for语句,循环体为空语句的一般形式为: for (表达式1;表达式2;表达式3) ; 如:for(sum=0,i=1;i=100;sum+=i, i+) ;,国家等级考试练习,
11、1.有以下程序 main() int i; for(i=1;i=40;i+) if(i+%5=0) if(+i%8=0) printf(“%d”,i); printf(“n”); 则执行后的输出结果是 a.5 b.24 c.32 d.40,C,2.若有以下程序段,且变量已正确的定义和赋值 for(s=1.0,k=1;k=n;k+) s=s+1.0/(k*(k+1); printf(“s=%fnn”,s); 请填空,使下面程序段的功能与之完全相同 s=1.0;k=1; while(_) s=s+1.0/(k*(k+1); _; printf(“s=%fnn”,s);,k=n,k+;,3.有以下程
12、序 #include main() int y=9; for(;y0;y-) if(y%3=0) printf(“%d”,-y); 程序运行的结果是 a.741 b.963 c.852 d.875421,C,(1)在进入累加前先给累加器赋初值(一般为0); (2)用循环语句实现累加; for(循环变量赋初值;循环条件;改变循环变量) 循环体语句; (3)循环体语句的设计。 累加器当前值=累加器原值+累加项当前值 ;,典型例题分析,【例5-4】 求累加和1+2+3+1000,基本方法:,属于“累加器”类型问题。,累加器赋初值,参考程序:,void main() long int k,s;,s=0
13、;,for(k=1;k=1000;k+) s=s+k;,printf( s=%ld ,s); ,累加,例:求1-1/2+1/3-1/4+1/5-1/6.-1/100的和,循环次数:确定,100次,i表示 循环体: 累加器的当前值=累加器的原值+累加项当前值 关键:如何表示累加项当前值 找关系: t=1 t=-1/2 t=1/3 . t=-1/i 由此得到:(循环体) sign=-sign (符号规律) t=sign*1/i (累加当前项的值) sum=sum+t (累加),循环变量,累加器初值: i=1,sign=-1 sum=0 流程图:,代码如下: #include stdio.h voi
14、d main() int sign=-1,i; float sum=0,t; for(i=1;i=100;i+) sign=-sign; t=sign*1.0/i; sum=sum+t; printf(sum=%fn,sum); ,(1)给累乘器赋初值,一般为1; (2)用循环语句实现累乘; for(循环变量赋初值;循环条件;循环变量改变规律) (3)循环体设计。 累乘器当前值=累乘器原值*循环变量当前值;,例5-5: 求累乘积。 如:123.100,基本方法:,属于“累乘器”类型问题。,累乘器赋初值,求n!=1 2 3 n,参考程序:,void main() double s=1;,int
15、k;,for(k=1;k=100;k+) s=s*k;,printf( s=%lf ,s); ,累乘,思考,求:1!+2!+3!+.+n!的和 分析: 循环次数确定:n(由用户输入),i作为循环变量 循环体累加: sum=sum+累加项 关键:如何表示累加项? t=1! t=2! t=n! 发现: t=i! 循环体: t=i! sum=sum+t; (t在每次循环之前必须设置为1) i!如何表示?,循环变量初值,累加器初值: i=1 sum=0 流程图:,代码: #include stdio.h void main() int i,j,n; long t,sum=0; printf(pleas
16、e input n:); scanf(%d, ,求阶乘,例5-6 判断一个数是否为素数?,一个数x在2,sqrt(x)范围内没有因子,我们就称其为素数(质数),主要编程方法:循环变量终值法、标记变量法,#include math.h void main() int x,k; scanf( %d ,排除法:如果有因子,不再往下判断是否是素数,循环变量终值法,for(k=2;k=sqrt(x);k+) if(x%k=0) break;,if(ksqrt(x) printf( %d is a prime ,x); else printf( %d is not a prime ,x); ,在判断范围内
17、无因子,程序正常终止,有因子,程序非正常终止,#include math.h void main() int x,k,f=1; scanf( %d ,排除法:如果有因子,不再往下判断是否是素数,for(k=2;k=sqrt(x);k+) if(x%k=0) f=0;break; ,if(f=1) printf( %d is a prime ,x); else printf( %d is not a prime ,x); ,在判断范围内无因子,程序正常终止,有因子,程序非正常终止,标记变量法,1.break语句,(1) 语句形式: break;,(2)作用: 结束break所在的 switch语
18、句。 结束本层循环,跳出break所在的循环结构。,5.5 break语句和continue语句,【例5-10】 求300以内能被17整除的最大的数。,#include stdio.h void main() int x,k; for(x=300;x=1;x-) if(x%17=0) break; printf(x=%dn,x); ,找到满足条件的最大数,结束循环,(1)语句形式: continue;,(2)语句作用: 结束本次循环。,2、continue 语句,(3)语句执行流程: continue语句可以结束本次循环,即不再执行循环体中continue 语句之后的语句,对于while和do
19、-while而言,转而执行条件的判断,对于for语句而言,转而执行表达式3,【例5-11】 求300以内能被17整除的所有整数。,#include stdio.h void main() int x,k; for(x=1;x=300;x+) if(x%17!=0) continue; printf(%dt,x); ,while(条件) 语句A; break; 语句 B; ,真,语句B,条件,语句A,break,假,结束循环,4、break语句与continue语句的区别,至此位置,while(条件) 语句A; continue; 语句 B; ,真,语句B,条件,语句A,continue,假,结
20、束循环,至此位置,#include stdio.h void main() int a, b; for(a=1,b=1; a=10) break; if(b%3=1) b+=3; continue; printf(%dn,a); ,【例5-12】 分析以下程序的运行结果。,程序运行结果: 4,国家等级考试练习,1.有以下程序 main() int i=0,s=0; for(;) if(i=3|i=5) continue; if(i=6) break; i+; s+=i; printf(“%dn”,s); 程序运行后的输出结果是 a.10 b.13 c.21 d.死循环,D,2.有以下程序 ma
21、in() int a=1,b; for(b=1;b=8) break; if(a%2=1) a+=5;continue; a-=3; printf(“%dn”,b); 程序运行后的输出结果是 a.3 b.4 c.5 d.6,B,3.有以下程序的运行结果是 main() int i,j; for(i=1;i=10;i+) if(i%3=0) continue; printf(“%3d”,i); printf(“n”); a.1 2 4 5 7 8 10 b.1 2 3 4 5 6 7 8 9 10 c.3 6 9 d.1 2 3,A,在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌
22、套。如果内循环体中又有嵌套的循环语句,则构成多重循环。,5.6 循环的嵌套,嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。,while 、do-while、for三种循环都可以互相嵌套。,循环语句之间的关系,for(.) . for(.) . ,并列循环,嵌套循环,for(i=1;i=3;i+) for(j=1;j=3;j+) printf(“*”); printf(“n”); ,循环嵌套的执行过程,真,真,外循环初始条件,内循环初始条件,内循环体,外循环条件,假,内循环条件,假,内循环循环条件,外循环循环条件,循环结束,二重循环嵌套结构执行流程,国家等级考试练习,1.有以下程序 m
23、ain() int i,j; for(i=1;i4;i+) for(j=i;j4;j+) printf(“%d*%d=%d ”,i,j,i*j); printf(“n”); 程序运行后的输出结果是,B,a.1*1=1 1*2=2 1*3=3 2*1=2 2*2=4 3*1=3,b.1*1=1 1*2=2 1*3=3 2*1=2 2*3=6 3*3=9,c.1*1=1 1*2=2 2*2=4; 1*3=3 2*3=6 3*3=9,d.1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9,2.有以下程序 main() int i,j,x=0; for(i=0;i2;i+) x+;
24、 for(j=0;j=3;j+) if(j%2) continue; x+; x+; printf(“x=%dn”,x); 程序运行后的输出结果是 a. x=4 b.x=8 c.x=6 d.x=12,B,3.执行以下程序后,输出#的个数是 #include main() int i,j; for(i=1;i5;i+) for(j=2;j=i;j+) putchar(#); ,6,例5-13:输出图形:,* * * *,编程分析:,编程分析:,采用双重循环,一行一行输出。,每一行输出步骤:一般3步(例如本题:共4行,若行号用i表示) 1)光标定位,输出空格代替,每行输出4-i个空格,3)每输完一
25、行光标换行(n),2)输出图形。则每一行有2*i-1个*号。,1 2 3 4,#include stdio.h void main() int i,j,k; for(i=1;i=4;i+) for(j=1;j=4-i;j+) printf( ); for(k=1;k=2*i-1;k+) printf(*); printf(n); ,5.7 循环结构程序设计举例,累加类型: 1.求,#include stdio.h void main() float s=0,f1=2,f2=1,f=1,t,n; /*累加器赋初值*/ for(n=1;n=10;n+) s=s+f*f1/f2; /*累加器当前值=
26、累加器原来的值+新的要加的数据*/ f=f*(-1);t=f2;f2=f1;f1=f1+t; /*为求下一个要加的数据做准备*/ printf(s=%fn,s); ,用0-9这十个数字可以组成多少无重复的三位数?,按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。 穷举法,通常使用循环嵌套来实现。,编程方法: “枚举法”,#include stdio.h void main() /*a,b,c代表百位、十位、个位*/ int a,b,c,num=0; for(a=1;a
27、=9;a+) for(b=0;b=9;b+) for(c=0;c=9;c+) if(a!=b ,类似问题: 1.百钱百鸡问题 百钱买百鸡.公鸡5元一只,母鸡3元一只,小鸡1元三只;一百元买一百只鸡, 且公鸡,母鸡,小鸡都要有.有几种买法? 解:设公鸡x只,母鸡y只,小鸡z只 x+y+z=100 5x+3y+z/3=100 2.从红、黄、兰、白、黑五种颜色的球中取三种颜色的球,问共有几种取法,猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个。以后每天早晨猴子都吃掉前一天剩下的一半多一个。到第5天时,猴子再去吃桃子时发现只剩下1个桃子。问第一天猴子摘了多少个桃子?,#include stdio
28、.h void main() int x0=1,n,x1; for(n=4;n=1;n-) x1=(x0+1)*2; x0=x1; printf(%d,x); ,迭代法,设:第五天剩下的桃子为x0个,和第四天x1的关系式:x1=(x0+1)*2,迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程。 迭代法又分为:精确迭代和近似迭代。 “二分法”和“牛顿迭代法”属于近似迭代法。,利用迭代算法解决问题,需要做好以下三个方面的工作: 一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直 接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出 其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键, 通常可以使用递推或倒推的方法来完成。 三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程 序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控 制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出 来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固 定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析 出用来结束迭代过程的条件。,例:裴波那契数列的第1、2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数字化新基建 社区烘焙工坊赛道 2026-2028年广东省社区烘焙工坊天使轮融资品牌策划
- 十五五规划前瞻:婴童用品产业重构与家庭消费新增长极探析
- 乡村振兴视域下农村电商发展困境与突破
- 新兴市场爆发智能冷雾香氛机:中东酒店业新宠
- 2026年新能源充电桩场站土建施工及电力接入方案
- 人工智能伦理治理框架与国际比较研究
- 2025年岷山专修学院高职高职单招职业适应性测试考试题库及完整答案详解【必刷】
- 2026年内蒙古呼和浩特青城职业学院高职单招职业技能考试模拟试卷含完整答案详解(网校专用)
- 2025年大连职业技术学院高职单招职业适应性测试考试模拟试卷附答案详解(A卷)
- 2027年成都新能源职业学院单招职业技能考试题库附完整答案详解(典优)
- 2026年安徽合肥经开区社区工作者招聘考试试卷-含答案解析
- 2026年广东省中考化学试卷(含答案及解析)
- 2026-2030泡沫金属行业市场发展分析及发展趋势与投资前景研究报告
- 2026海南万宁市总工会招聘工会社会工作者11人(第1号)笔试参考题库及答案详解
- 功能性消化不良诊疗指南(2026版)
- 2026年东风汽车校招人才测评题库
- 2026年湖北省荆门市东宝区3年级数学期中人教版考试及答案
- 跟骨骨刺微创手术知情同意书
- 中医科危急值管理流程
- 2026年支部书记任职考试题库(含答案)
- 教育培训公司人事制度
评论
0/150
提交评论