c语言第6章 循环控制2.ppt

上传人:思*** 文档编号:1080197 上传时间:2019-09-22 格式:PPT 页数:73 大小:1.17MB
返回 下载 相关 举报
c语言第6章 循环控制2.ppt_第1页
第1页 / 共73页
c语言第6章 循环控制2.ppt_第2页
第2页 / 共73页
点击查看更多>>
资源描述

《c语言第6章 循环控制2.ppt》由会员分享,可在线阅读,更多相关《c语言第6章 循环控制2.ppt(73页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、switch语句: (通常实现是多分支的选择结构!),要点: 1) switch语句的固定格式 2) switch语句的执行过程,如,switch (n) case 2: f=a+b; break; case 4: f=a-b; break; case 6: f=a*b; break; case 8: f=a/b; break; default: printf(数据n错误.n);,整型、字符型或枚举型,Ex5.6:输入百分制分数,输出等级制分数。,#include void main() int score,n; char c; printf(请输入百分制分数 (0-100):); scanf

2、(%d, ,一般形式:switch (开关表达式) case 常量表达式1: 语句1 break; case 常量表达式2: 语句2 break; case 常量表达式3: 语句3 break; case 常量表达式n: 语句n break; default: 语句n+1 ,第 六 章 循环控制,本章主要内容 三种循环语句:for、while、do-while (重点!) for 语句的变化形式 循环嵌套 两种中断语句:break 和 continue 语句 几种关于循环的经典算法(重点!),6.1 概述,1 什么是循环结构? 根据条件P成立与否,决定是否重复执行某部分操作2 循环结构的程序设

3、计能解决什么样的实际问题? 用来解决包含有重复操作的实际问题. 如, 求和:1+2+3+4+100 输入全班同学的成绩 等等3 循环结构的问题要素: 1)哪一部分操作在重复-循环体 2)循环什么时候要重复-循环控制条件 (循环在循环控制条件不成立的时候结束),4 实现循环结构的四种方法:1)goto-if语句 (不提倡)2)while语句 (主要实现当型循环)3)dowhile语句 (主要实现直到型循环)4)for语句 (多功能),6.2 goto-if 语句实现的循环,1 无条件转移语句: 一般格式:goto 标号;语句标号必须是合法的标识符,不能用整数!,格式1标号: if(表达式) go

4、to 标号;,2 实现循环的格式:,格式2标号:if(表达式)goto 标号;,例6.1 求 = 1+2+3+4+100,#include void main() int sum=0,i=1; loop: /* 标号*/ if(i=100) sum=sum+i; i+; goto loop; printf(sum=%dn,sum);,6.3 while语句(主要用于实现当型循环),一般格式: while(表达式) 语句,问题: 10 求 sum= i i=1 int sum; sum = 1+2+3+4+5+6+7+8+9+10;,100 求 sum= i ? i=1 n 求 sum= i ?

5、 (n由键盘输入) i=1,用 while语句实现,一般格式: while(表达式) 语句,#include void main() int sum=0,i=1; while (i=100) sum=sum+i; i+; printf(sum=%dn,sum); ,根据流程图写出程序:,sum=0,sum=0,整个循环由 i 控制,i 称循环变量 i=1; 循环变量必须有初值 sum=0;累加变量必须有初值 while (i=10) 继续循环的条件 sum=sum+i; i+; 循环变量的改变 ,循环体,while实现要点,6.4 do-while 语句 (主要用实现直到型循环),一般格式:

6、do 语句 while(表达式);,一般格式: do 语句 while(表达式);,#include void main() int sum=0,i=1; do sum+=i; i+; while(i=100); printf(sum=%dn,sum); ,用 do-while语句实现,分析两程序作用是否相同?为什么?,程序1:#include void main() int sum=0,i=11; while(i=10) sum=sum+i; i+; printf(sum=%dn,sum);,程序2:#include void main() int sum=0,i=11; do sum=su

7、m+i; i+; while(i=10); printf(sum=%dn,sum);,输出结果: sum=11,输出结果: sum=0,6.5 for 语句,一般格式:for(表达式1;表达式2;表达式3) 语句,给循环变量赋初值,循环控制条件,给循环变量加增量,循环体,用 for语句实现,#include void main ( ) int sum,i; sum=0; for(i=1;i=100;i+) sum=sum+i; printf(sum=%dn,sum);,一般格式:for(表达式1;表达式2;表达式3) 语句,考虑:for(i=0;i=100;i+) 后面加一个分号,会怎样?循环

8、一共多少次?执行完循环语句后i等于多少?,for (i=1; i=100; i+) sum=sum+i;,for 语句与while 语句比较 main() int i,sum=0; i=1; for (i=1; i=100; i+) while (i=100) sum=sum+i; sum=sum+i; printf(%d,sum); i+; ,for 语句的变化形式,原形: int i,sum=0; for (i=1; i=10; i+) sum=sum+i; i=10,sum=0;,i=1;,sum=sum+i,i+,下一条语句,变形1 int i=1 , sum=0; for ( ;i=

9、10; i+) sum= sum+i;,变形2 int i=1, sum=0; for ( ; i=10 ; ) sum = sum+i; i+; ,相当于: while,6.3 for 语句的变化形式,原形: int i,sum=0; for (i=1; i=10; i+) sum=sum+i; i=10,sum=0;,i=1;,sum=sum+i,i+,下一条语句,变形3 int i=1,sum=0; for( ; ; ) 无限循环 sum=sum+i ; i+ ,变形4 int i,sum; for(i=1,sum=0;i10) break;,6.3 for 语句的变化形式,原形: in

10、t i,sum=0; for (i=1; i10) break; 无限循环 sum=sum+i ; i+ 变形 int i,sum; for (i=1,sum=0 ; i 4 ? (1) 12345%100/10 (2) 12345/10%10,(1)反复执行 x%10 x=x/10(2)何时结束 x= =0scanf( “%d”, ,循环结构的实现,循环实现要点:(1) 找出什么要反复执行 (2) 重复到何时结束 假定输入x=12345 顺序输出,从高位开始分割,12345 /10000 = 1 12345 %10000 =23452345 /1000 = 2 2345%1000 =3453

11、45 /100 = 3 345%100 =4545 /10 = 4 45%10 =55/1= 5 5%1=5,(1)开始如何得到10000 找输入数据的位数 d=1; for ( i=10; x/i0 ; i=i*10) d+ ;(2) 每次循环缩小10倍(3) 缩小到 0 结束,6.6 循环嵌套,循环体中又包含了循环语句称循环嵌套。例:求 S = 1!+2!+3!+ + n! 分析: 首先要循环n次来累加 i! for (i=1; i=n; i+) s = s + i! ; 如果存在求阶乘的运算!,计算完成。,嵌套,for (i=1; i=n; i+) t = i! ;s = s + t ;

12、 ,for (t=1, j=1 ; j=i; j+) t = t * j ;,t = t * i ;,6. 6 循环嵌套,循环嵌套均是大循环包小循环 绝对不允许循环体交叉 ! for ( ) . do . while(.),for ( ) . do . while(.) ,6.8 break 和 continue 语句,1) break: 跳出循环体,提前结束循环语句。 2) continue: 结束本次循环,提前进入下一轮循环。 (执行一次循环体,叫做一轮循环。),6.8 break 和 continue 语句,例:读入一行字符(不超过10个),给予输出 #include stdio.h m

13、ain() char c; int i=0; for (i=0;i=10 是结束条件 */ c=getchar(); putchar(c); ,if (c=n) break;,/* c=回车 也是结束条件 */,有两个条件决定循环的结束,main() char c; int i=0; for (i=0; i10 & c! =n; i+) putchar(c);两个结束条件合并 c=getchar(); ,c=getchar();,真(非0),break 流程,for的下一条语句,假(0),表达式1,表达式2,语 句1,表达式3,否,break,语 句2,循环体,是,程序:for (表1;表2;

14、表3) 语句1 ; if ( . ) break ; 语句2 ; for后的下一条语句;,是,真(非0),continue 流程,for的下一条语句,假(0),表达式1,表达式2,语 句1,表达式3,否,continue,语 句2,循环体,程序:for (表1;表2;表3) 语句1 ; if ( . ) continue; 语句2 ; for后的下一条语句;,continue 语句例子,#include stdio.h main() char c; int i; for (i=0;i=10 是结束条件 */ c=getchar(); if (c=n) continue; putchar(c);

15、 /* c=回车 也是结束条件 */ 问:若把break 改成 continue, 结果会怎样?,输入:abc efgh 123 ,输出:abcefgh1,将要介绍的常用算法: 一 求序列的前n项或求级数的部分和 二 筛选具有某性质的数 三 逐个处理字符串中字符的算法 四 穷举法 五 其他算法实例,循环结构的问题要素: 1)哪一部分操作在重复-循环体 2)循环什么时候要重复-循环控制条件! 3) 选择哪个循环语句比较合适,6.9 常用循环算法举例,一 求序列的前n项或求级数的部分和,#include void main() double sum=0,t,i; for(i=1,t=1;i=1e-

16、6) pi=pi+t; s=-s; /符号 n=n+2; /分母 t=s/n; /下一项 pi=pi*4; printf(pi=%f n,pi); ,pi=3.141591,例 6.7 求Fibonacci数列 1,1,2,3,5,8的前40项。其通项公式为:,#include void main() long f1,f2; int i; f1=1; f2=1; for(i=1;i=20;i+) printf(%12ld %12ld,f1,f2); if(i%2=0) printf(n); /循环两次换一次行: 控制一行输出4个数据 f1=f1+f2; f2=f2+f1; ,二 筛选具有某性质

17、的数,算法思路: 判定给定数m是否具有此性质(对于复杂的性质往往需要用一段程序代码来辅助判定),如果具有此性质则输出m.,例6.5 输出100-200之间不能被3整除的数。 #include void main() int n; for(n=100;n=200;n+) if(n%3!=0)printf(%-4d,n); printf(n); ,例6.8 判断m是否为素数。,(m=a*b 则a,b中至少有一个是不大于m的平方根的),2 中没有m的因子,算法分析: 检验从2 ,每一个数i都不是m的因子.,题意分析:素数m:即除了自身m及1外没有真因子的自然数2m-1中没有m的因子,如, for(i

18、=1;i1): ); scanf(%d,例6.9 求100200之间的全部素数。,算法分析: 显然只需把上题中的m从100取到200就可以了。,#include #include void main() int m,k,i,n=0; for(m=101;m200;m=m+2) k=sqrt(m); for(i=2;i=k;i+) if(m%i=0)break; if(i=k+1) n+; printf(%5d,m); if(n%10=0)printf(n); printf(n100200之间共有%d个素数。n,n);,for m=101 to 200; m=m+2,ex6.7 一个数恰好等于它

19、的因子和,则称它为完数: 如,6=1+2+3。求1-1000之间的完数。输出格式为: 6 的因子是: 1, 2, 3,#include void main() int m,s,i,n=0; for(m=1;m=1000;m+) s=0; /求因子和开始 for(i=1;im;i+) if(m%i=0) s=s+i; /求因子和结束 if(m=s) n+; printf(%d 的因子是: ,m); for(i=1;i=a ,China! Glmre!,四 穷举法算法思路:利用循环将所有可能情况一一检验, 挑出所有满足要求的情况。,例(百钱买百鸡)百钱买百鸡。鸡翁1,钱值5; 鸡母1,钱值3;鸡雏

20、3,钱值1;何以百钱买百鸡?,算法分析:用穷举法检验所有可能情况:公:x 母:y 小:z 0 0 100 0 1 99 0 2 98 再进一步:x:0 - 20 (5元一只,最多买20只)。y:0 - 33 (3元一只,100元最多买33只)。z:z=100-x-y (z由x,y所决定)。,例 程序: (百钱买百鸡),#include void main() int x,y,z; printf(公鸡 母鸡 小鸡n); for(x=0;x20;x+) for(y=0;y33;y+) z=100-x-y; if(x*5+y*3+z/3=100 ,五 其他算法实例:,Ex6.1 输入两个整数m和n,

21、求其最大公约数和最小公倍数。,问题分析: 最小公倍数 q=m*n/最大公约数 关键:求最大公约数p=gcd(m,n),如:gcd(64,24) = gcd (24,16) = gcd (16,8) = gcd (8,0)=8 即 :8为64和24的最大公约数。,辗转相除法求最大公约数: gcd(m,n)=m 当n=0 =gcd( n,r) 当n0 其中 r=m%n(余数),对于一般的问题,你没见过的类型,首先自己考虑如何解决它,然后分析此方法中的处理规律,找出循环部分,再编程实现它.,Ex6.1 输入两个整数m和n,求其最大公约数和最小公倍数。,#include void main() int

22、 m,n,r,m0,n0; printf(请输入m,n (m0, n0): ); scanf(%d%d, ,辗转相除法:gcd(m,n)=m 当n=0 =gcd (n,r) 当n0 其中 r=m%n(余数),作业: P129,Ex 6.2 6.3 6.5 6.6 6.11 6.15,选做题:1 (棋盘上的小麦)相传古代印度国王舍罕要褒赏他的聪明能干的宰相达依尔(国际象棋的发明者),问他需要什么,达依尔回答说:“国王只要在国际象棋的棋盘第一格放1粒麦子,第二格放2粒麦子,第三格放4粒麦子,以后按此比例每一格加一倍,一直放到第64格(国际象棋棋盘是8*8=64格),我就感恩不尽,其他我什么也不要了

23、。”,国王想:“这有多少!还不容易!”,于是让人扛来一袋小麦,但是不到一会就全用完了,再来一袋很快又没有了,结果全印度的粮食全部用完还是不够。国王非常奇怪,到底需要多少呢?请你编程计算需要多少体积的小麦? s=1+21+22+23+263 (1m31.42*108粒)2 (换零钞票)要将100元的大钞票,换成等值的10元、5元、2元、1元一张的小钞票,要求每次换成40张小钞票,每种至少一张。输出所有换法。(穷举法),四 穷举法 例2 谁做的好事? 师大附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。C说:是D。D说:他胡说。 已知

24、三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。,分析: m代表做好事的人A说:不是我。写成关系表达式为(m!=A)B说:是C。 写成关系表达式为(m=C)C说:是D。 写成关系表达式为(m=D)D说:他胡说。写成关系表达式为(m!=D)已知三个人说的是真话: 即,上面4个表达式有三个是真的!用穷举法: 对所有可能做好事的人(m)一个一个检验:A,B,C,D,是否满足4个表达式有三个是真的的条件,满足条件者是做好事的人.,四 穷举法 例2 谁做的好事? (流程图),A说:不是我。写成关系表达式为(m!=A)B说:是C。 写成关系表达式为(m=C)C说:是D。 写成关系

25、表达式为(m=D)D说:他胡说。写成关系表达式为(m!=D) 对所有可能做好事的人(m)一个一个检验:A,B,C,D,是否满足4句话有三句是真的的条件,满足条件者是做好事的人.,例2 程序,#include void main() char m;/放代表做好事的人的字符 int sum,flag=0; for(m=A; m=12) a、e、f三人中至少有两人参与作案; a+e+f=23) a、d不可能是同案犯;a+d=14) b、c或同时作案,或与本案无关; (b+c=2)|(b+c=0)5) c、d中有且仅有一人作案; c+d=16)如果d没有参与作案,则e也不可能参与作案。 !d&!e|d

26、,例3 程序,#includevoid main()int a,b,c,d,e,f; /放6个犯罪嫌疑人是否作案: =0 没作案,=1 作案 int flag; /放案件分析的6个结果for(a=0;a=1); /A、B至少有一人作案 flag=flag ,例 由迭代法求立平方根,求a的近似立方根的迭代公式为: xn+1=2/3(xn+a/3xn2)要求前后两次求出的近似立方根xn的差的绝对值小于10-5。,#include #include void main() float a,x0,x; printf(Enter a: ); scanf(%f,例 由迭代法求立平方根 ,输出前面的所有近似

27、根.,#include #include void main() float a,x0,x;int n=1; printf(Enter a: ); scanf(%f,#include #include void main() float a,x0,x; printf(Enter a: ); scanf(%f,ex6.5 求,#include void main() double sum=0;int k; for(k=1;k=100;k+) sum+=k; /= k=1; while(k=50) sum+=k*k;k+; /= k=1; do sum+=1.0/k;k+; while(k=10)

28、; printf(sum=%fn,sum); ,五 (其他算法) 显示有规律的由字符(如,星号)组成的图形算法思路: 通常是用二重循环。外循环控制星号的行数,在它的循环体内完成一排星号的打印。,* * *,例:写一个程序打印下列图形,#define N0 4/ 星号的排数#define D0 30 / 第一个星号的位置#include void main()int i,j; for(i=1;i=N0;i+) for(j=1;j=D0-i;j+)printf( ); for(j=1;j=2*i-1;j+)printf(*); printf(n); ,回顾四个常用循环算法:,一 求序列的前n项或求

29、级数的部分和: 求一项,加一项 技巧:利用前项求后项,或:分成分子、分母和符号分别求。二 筛选具有某性质的数 for(m=N0;m=N1;m+) 判断m是否具有某性质,如果有,则输出 三 逐个处理字符串中字符的算法 while(c=getchar()!=n) 按要求处理变量c中的字符 四 穷举法 检验所有可能情况, 挑出其中所有满足要求的情况(通常用多重循环)。,ex6.2 输入一串字符,统计字符英文字母、空格、数字和其他字符个数。,#include void main ( ) char c; int n1,n2,n3,n4; n1=n2=n3=n4=0; printf(请输入一串字符:n);

30、 while(c=getchar()!=n) if(a=c,ex6.3 求s=a+aa+aaa+aaaa的值。,#include void main() long sum; int n,t,a,i; printf(请输入n,a(0a=9):); scanf(%d%d, ,ex6.6 求水仙花数。(如,153=13+53+33),#include void main() int i,a,b,c; for(i=100; i=999;i+) a=i/100; b=i/10-a*10; c=i%10; if(i=a*a*a+b*b*b+c*c*c)printf(%6d,i); printf(n);,e

31、x6.6 求水仙花数。(如,153=13+53+33)(穷举法),#include void main() int a,b,c,m,n; for(a=1; a=9;a+) for(b=0; b=9;b+) for(c=0; c%cn,b); printf(c-%cn,c); ,例 : (棋盘上的小麦),相传古代印度国王舍罕要褒赏他的聪明能干的宰相达依尔(国际象棋的发明者),问他需要什么,达依尔回答说:“国王只要在国际象棋的棋盘第一格放1粒麦子,第二格放2粒麦子,第三格放4粒麦子,以后按此比例每一格加一倍,一直放到第64格(国际象棋棋盘是8*8=64格),我就感恩不尽,其他我什么也不要了。”,国王想:“这有多少!还不容易!”,于是让人扛来一袋小麦,但是不到一会就全用完了,再来一袋很快又没有了,结果全印度的粮食全部用完还是不够。国王非常奇怪,到底需要多少呢?请你编程计算需要多少体积的小麦?(1m31.42*108粒),#include void main() double sum=1,t,i; for(i=1,t=1;i=63;i+) t=t*2; sum+=t; sum/=1.42e8; printf(需要小麦%.0f立方米.n,sum); ,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com