版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/7/10,a,1,在C语言中可以用以下语句来实现循环: 1. 用while语句; 2. 用do-while语句; 3. 用for语句。,循环: 就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。,2020/7/10,a,2,S=1+2+3+100,0,S,1,2,100,S+1,S,S+2,S,S+100,S,作100次加法,S+i,S,累加器,计数器,2020/7/10,a,3,1 while语句,真(非零),循环体,假(零),1、while 语句的形式: while (表达式) 循环体;,2 、 while 语句 常称为“当型”循环语句。,2020/7/10
2、,a,4,3、说明:,先判断表达式,后执行语句。,表达式同if语句后的表达式一样,可以是任何类型的表达式。,循环体多于一句时,用一对 括起。,while循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。,2020/7/10,a,5,i=1; s =0; while (i=100) s=s+i; i+; printf(“n1+2+3+100=%d”,s);,循环变量的初始化 计数器的初始化,累加器的初始化,循环控制条件,累加,修改循环变量,循环语句的三要素,循环次数固定的循环语句,2020/7/10,a,6,#include stdio.h int main() float
3、x; scanf( %f ,【例1】 输入一系列整数,判断其正负号,当输入0时,结束循环。,输入数据,为第一次判断做准备,while(x!=0),判断是否结束, if(x0) printf( + ); else printf( - ); scanf( %f , ,判断正负号,2020/7/10,a,7,#include stdio.h int main() char ch;int num=0; ch=getchar();,【例2】 统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。,while(ch!=n),判断是否输入结束, num+; ch=getchar(); printf(“
4、%dn”,num); return 0; ,2020/7/10,a,8,注意,表达式在判断前,必须要有明确的值。,循环体中一般有改变条件表达式的语句。,while (表达式)后面没有分号。,#include stdio.h int main() char ch;int num=0; ch=getchar();,while(ch!=n), num+; ch=getchar(); printf(“%dn”,num); ,2020/7/10,a,9,2 do-while语句,1)、 do-while的形式: do 循环体; while (表达式);,2)、 do-while语句 常称为“直到型”循环
5、语句。,真(非零),循环体,假(零),2020/7/10,a,10,3)、说明:,先执行语句,后判断表达式。,第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同。,2020/7/10,a,11,【例3】 用do-while语句编写程序统计从键盘输入的一行非空字符的个数(以回车键作为输入结束标记)。,#include stdio.h int main() char ch; int num=0; ch=getchar(); do num+; ch= getchar(); while(ch!=n); printf(num=%dn,num); ,2020/7/10,a,12
6、,注意,在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。,do-while和while语句相互替换时,要注意修改循环控制条件 。,2020/7/10,a,13,3 for语句,for的形式: for (初始表达式1;条件表达式2;循环表达式3) 循环体 ;,表达式1:用于循环开始前为循环变量设置初始值。,表达式2:控制循环执行的条件,决定循环次数。,表达式3:循环控制变量修改表达式。,循环体语句: 被重复执行的语句。,2020/7/10,a,14,表达式3,计算表达式1,循环体,零,非零,for的下一条语句,执行过程,2020/7/10,a,1
7、5,for(i=1;i=100;i+) sum=sum+i;,例如:,它相当于以下语句: i=1; while (i=100) sum=sum+i; i+; ,表达式1;,while(表达式2),表达式3;,2020/7/10,a,16,3、 说明,三个表达式都可以是逗号表达式。,三个表达式都是任选项,都可以省略,但要注意省略表达式后分号间隔符不能省略。,2020/7/10,a,17,for语句中表达式省略的形式,(1)for语句一般形式中的“表达式1”可以省略; 如: sum=0;i=1; for ( ; i=100;i+) sum=sum+i;,2020/7/10,a,18,(2)表达式2
8、省略,即不判断循环条件,循环无终止地进行下去; 如: for(sum=0,i=1;i+) if(i100) break; sum=sum+i; ,2020/7/10,a,19,(3)表达式3也可以省略,但此时保证循环能正常结束如: for(sum=0,i=1;i=100;) sum=sum+i; i+; ,2020/7/10,a,20,(4) 可以省略表达式1和表达式3,只有表达式2,如: i=1; sum=0; for (;i=100;) sum=sum+i; i+; ,i=1;sum=0; while (i=100) sum=sum+i; i+; ,相当于,2020/7/10,a,21,w
9、hile (1) 循环体; 即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。,(5)三个表达式都可省略,如 for ( ; ; ) 循环体;,如: sum=0,i=1; for(;) if(i100) break; sum=sum+i; i+; ,相当于,2020/7/10,a,22,(6)循环体为空语句 对for语句,循环体为空语句的一般形式为: for (表达式1;表达式2;表达式3) ; 如:for(sum=0,i=1;i=100;sum+=i, i+) ;,要在显示器上复制输入的字符,输入的字符为.时, 结束循环。 输入abcdefg. 输出abcdefg. while(
10、putchar(getchar( ) )!=. ) ;,2020/7/10,a,23,(1)在进入累加前先给累加器赋初值(一般为0); (2)用循环语句实现累加; for(循环变量赋初值;循环条件;循环变量改变规律) (3)循环体语句的设计。 累加器当前值=累加器原值+循环变量当前值 ;,典型例题分析,【例4】 求累加和1+2+3+1000,基本方法:,属于“累加器”类型问题。,2020/7/10,a,24,累加器赋初值,求偶数和?奇数和? 2+4+6+ 1+3+5+,参考程序:,void main() long int k,s;,s=0;,for(k=1;k=1000;k+) s=s+k;,
11、printf( s=%ld ,s); ,累加,思考,for(s=0,k=1;k=1000;k+,s=s+k);,2020/7/10,a,25,(1)给累乘器赋初值,一般为1; (2)用循环语句实现累乘; for(循环变量赋初值;循环条件;循环变量改变规律) (3)循环体设计。 累乘器当前值=累乘器原值*循环变量当前值;,例5: 求累乘积。 如:123.100,基本方法:,属于“累乘器”类型问题。,2020/7/10,a,26,累乘器赋初值,求n!=1 2 3 n,参考程序:,void main() double s=1;,int k;,for(k=1;k=100;k+) s=s*k;,prin
12、tf( s=%lf ,s); ,累乘,思考,2020/7/10,a,27,例6 判断一个数是否为素数?,一个数x在2,sqrt(x)范围内没有因子,我们就称其为素数(质数),主要编程方法:循环变量终值法、标记变量法,2020/7/10,a,28,#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 no
13、t a prime ,x); ,在判断范围内无因子,程序正常终止,有因子,程序非正常终止,2020/7/10,a,29,#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); ,在判断范围内无因子,程序正常终止,有因子,程序非正常终止,标记变量法,2020/7/10,a,3
14、0,例7 用0-9这十个数字可以组成多少无重复的三位数?,编程方法: “枚举法” 按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。,2020/7/10,a,31,#include stdio.h void main() /*a,b,c代表百位、十位、个位*/ int x,a,b,c,num=0; /*num存放满足条件的数的个数,注意num要赋初值*/ for(x=100;x=999;x+) a=x/100;b=x/10%10;c=x%10; if(a!=b ,202
15、0/7/10,a,32,编程方法: “递推法”,例8 裴波那契数列的第1、2项分别为1、1,以后各项的值均是其前两项之和。求前30项菲波那契数。,所谓递推法就是从初值出发,归纳出新值与旧值间的关系,直到求出所需值为止。新值的求出依赖于旧值,不知道旧值,无法推导出新值。数学上递推公式正是这一类问题。,2020/7/10,a,33,f1-第一个数 f2-第二个数 f3-第三个数 f1=1; f2=1; f3=f1+f2;,以后只要改变f1,f2的值,即可求出下一个数. f1=f2; f2=f3; f3=f1+f2;,递推,2020/7/10,a,34,void main() long f1=1,
16、f2=1, f3; int k;,参考程序:,printf( %ldt%ldt , f1,f2);,for(k=3;k=30;k+) f3=f1+f2; printf( %ldt ,f3); f1=f2; f2=f3; ,递推,2020/7/10,a,35,问题: 如果要求每行输出5项,且每项的输出宽度等宽,程序应如何改写?,#include void main() long f1=1, f2=1, f3; int k; printf( %12ld%12ld , f1,f2); for(k=3;k=30;k+) f3=f1+f2; printf( %12ld ,f3); f1=f2; f2=f
17、3; ,if(k%5=0) printf(“n”);,2020/7/10,a,36,4.循环语句的选择,if(循环次数已知) 使用for语句 else /* 循环次数未知 */ if (循环条件在进入循环时明确) 使用while语句 else /* 循环条件需要在循环体中明确 */ 使用do-while语句,2020/7/10,a,37,1).break语句,(1) 语句形式: break;,(2)作用: 结束break所在的 switch语句。 结束当前循环,跳出break所在的循 环结构。,5. break语句和continue语句,2020/7/10,a,38,【例10】 求300以内能
18、被17整除的最大的数。,#include stdio.h void main() int x,k; for(x=300; x=1; x- -) if(x%17=0) break; printf(x=%dn,x); ,找到满足条件的最大数,结束循环,2020/7/10,a,39,(1)语句形式: continue;,(2)语句作用: 结束本次循环。,2)、continue 语句,(3)语句执行流程: continue语句可以结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。,2020/7/10,a,40,【例11】 求300以内能被17整除的所有整
19、数。,#include stdio.h void main() int x,k; for(x=1;x=300;x+) if(x%17!=0) continue; printf(%dt,x); ,2020/7/10,a,41,while(条件) 语句A; break; 语句 B; ,真,语句B,条件,语句A,break,假,结束循环,6.break语句与continue语句的区别,至此位置,2020/7/10,a,42,while(条件) 语句A; continue; 语句 B; ,真,语句B,条件,语句A,continue,假,结束循环,至此位置,2020/7/10,a,43,#include
20、 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); ,【例12】 分析以下程序的运行结果。,程序运行结果: 4,2020/7/10,a,44,在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。,7. 循环的嵌套,嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。,while 、do-while、for三种循环都可以互相嵌套。,2020/7/10,a,45,循环语句之间的关系,for
21、(.) . for(.) . . ,内循环,外循环,并列循环,嵌套循环,错误,2020/7/10,a,46,真,真,外循环初始条件,内循环初始条件,内循环体,外循环条件,假,内循环条件,假,内循环循环条件,外循环循环条件,循环结束,二重循环嵌套结构执行流程,2020/7/10,a,47,例13:输出图形:,* * * *,编程分析:,采用双重循环,一行一行输出。,每一行输出步骤:一般3步。 1)光标定位,3)每输完一行光标换行(n),2)输出图形。 例如本题:共4行,若行号用k表示,则每一行有2*k-1个*号。,2020/7/10,a,48,#include stdio.h “ void ma
22、in() int k1,k2; for(k1=1;k1=4;k1+) putchar(t); for(k2=1;k2=k1;k2+) putchar(b);,for(k2=1;k2=k1*2-1;k2+) putchar(*);,putchar(n);, ,定位(还可以用空格的方法),输出,2020/7/10,a,49,#include stdio.h void main() int k1,k2,k3; for(k1=1;k1= 1;k1-) for(k2=1;k2=8-2*k1;k2+) printf( ); for(k3=1;k3=k1*2-1;k3+) printf( *); print
23、f(n); ,控制行数,控制每行的起始位,控制每行要输出的个数,* * * * * * * * * * * * * * * * * * * * * * * * *,2020/7/10,a,50,8. 循环结构程序设计举例,【例14】 求,#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; /*累加器当前值=累加器原来的值+新的要加的数据*/ f=f*(-1);t=f2;f2=f1;f1=f1+t; /*为求下一个要加的数据做准备*/ printf(s
24、=%fn,s); ,2020/7/10,a,51,循环程序设计,循环程序的实现要点: 归纳出哪些操作需要反复执行? 循环体 这些操作在什么情况下重复执行? 循环条件 选用合适的循环语句 for while do-while 循环具体实现时考虑(循环条件): 事先给定循环次数,首选for 通过其他条件控制循环,考虑while或do-while,2020/7/10,a,52,#include void main() int i, mark, max, n; printf(Enter n: ); scanf (%d, ,【例15】输入一批学生的成绩,求最高分(for),max,mark,Enter
25、n: 5 Enter 5 maks:67 88 73 54 82 Max = 88,Enter n: 0,2020/7/10,a,53,#include void main () int mark, max; printf(“Enter marks:); scanf (%d, ,输入一批学生的成绩,求最高分(while),Enter marks:67 88 73 54 82 -1 Max = 88,Enter marks:-1,2020/7/10,a,54,【例16】将一个正整数逆序输出,确定:循环条件和循环体(循环不变式),12345 5 4 3 2 1 12345 % 10 = 5 123
26、45 / 10 = 1234 1234 % 10 = 4 1234 / 10 = 123 123 % 10 = 3 123 / 10 = 12 12 % 10 = 2 12 / 10 = 1 1 % 10 = 1 1 / 10 = 0 结束,循环体 x%10 x=x/10 循环结束条件 x=0,scanf( “%d”, ,用do-while实现?,2020/7/10,a,55,循环程序设计习题,输入一个整数,从高位开始逐个数字输出。,12345 /10000 = 1 12345 %10000 =2345 2345 /1000 = 2 2345%1000 =345 345 /100 = 3 34
27、5%100 =45 45 /10 = 4 45%10 =5 5/1= 5 5%1=0,(1) 如何得到10000 找输入数据对应的幂 pow=1; temp = x; while (x != 0) pow = pow * 10; x =x /10; pow = pow /10; (2) 每次循环pow缩小1/10 (3) pow=0 结束,2020/7/10,a,56,#include void main() int x,pow,temp,y; scanf(%d, ,参考程序:,2020/7/10,a,57,【例17】古典算术问题搬砖头,某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小
28、孩两人搬一块。 问用45人正好搬45块砖,有多少种搬法?,for (men = 0; men = 45; men+) for (women = 0; women = 45; women+) for (child = 0; child = 45; child+) if (men+women+child=45) ,2020/7/10,a,58,for (men = 0; men = 15; men+) for (women = 0; women = 22; women+) child = 45 women men; if (men * 3 + women * 2 + child * 0.5 = 4
29、5) printf(men=%d women=%d child=%dn, men, women, child); ,for (men = 0; men = 45; men+) for (women = 0; women = 45; women+) for (child = 0; child = 45; child+) if (men+women+child=45) ,比较循环次数,2020/7/10,a,59,1、写出程序运行结果: (1)void main() int i,j,x=0; for(i=0;i2;i+) x+; for(j=0;j=3;j+) if(j%2) continue; x+; x+; printf(“x=%dn”,x); ,运行结果: x=8,练 习,2020/7/10,a,60,(2)void main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0: a+;break; case
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 停课反省协议书
- 协议抵押合同范本
- 周末补课协议书模板
- 夫妻义务旅游协议书
- 婚后双方签订的协议书
- 孩子辍学调解协议书
- 家庭旅行协议书模板
- 建设用地购买合同范本
- 总裁心机女分手协议书
- xx大学留学生在外住宿申请表
- 中学美术校本教材《素描》
- 第七讲 社会主义现代化建设的教育科技人才战略PPT习概论2023优化版教学课件
- 马克思主义基本原理概论知到章节答案智慧树2023年西安交通大学
- 注塑工艺监控记录表
- GB/T 22419-2023工业车辆集装箱吊具和抓臂操作用指示灯技术要求
- 项目经理转正述职报告PPT
- 中职护理专业课程标准
- 2021年肺癌分期(中文版)-肺癌第8版
- GB/T 6742-2007色漆和清漆弯曲试验(圆柱轴)
- 理论力学 第一章点的运动学课件
- 资金流量核算 课件
评论
0/150
提交评论