c语言教案ch循环结构_第1页
c语言教案ch循环结构_第2页
c语言教案ch循环结构_第3页
c语言教案ch循环结构_第4页
c语言教案ch循环结构_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、制作人:制作人: 黄黄 荧荧制作人单位:河师大数学与信息科学学院制作人单位:河师大数学与信息科学学院1.1.此刻打盹,你将做梦;而此刻学习,你将圆梦。此刻打盹,你将做梦;而此刻学习,你将圆梦。2.2.我荒废的今日,正是昨日殒身之人祈求的明日。我荒废的今日,正是昨日殒身之人祈求的明日。3.3.觉得为时已晚的时候,恰恰是最早的时候。觉得为时已晚的时候,恰恰是最早的时候。4.4.勿将今日之事拖到明日。勿将今日之事拖到明日。5.5.学习时的苦痛是暂时的,未学到的痛苦是终生的。学习时的苦痛是暂时的,未学到的痛苦是终生的。6.6.学习这件事,不是缺乏时间,而是缺乏努力。学习这件事,不是缺乏时间,而是缺乏努

2、力。7.7.幸福或许不排名次,但成功必排名次。幸福或许不排名次,但成功必排名次。8.8.学习并不是人生的全部。但,既然连人生的一部分学习并不是人生的全部。但,既然连人生的一部分学习也无法征服,还能做什么呢?学习也无法征服,还能做什么呢?9.9.请享受无法回避的痛苦。请享受无法回避的痛苦。10.10.只有比别人更早、更勤奋地努力,才能尝到成功的滋味。只有比别人更早、更勤奋地努力,才能尝到成功的滋味。11.11.谁也不能随随便便成功,它来自彻底的自我管理和毅力。谁也不能随随便便成功,它来自彻底的自我管理和毅力。12.12.时间在流逝。时间在流逝。13.13.现在淌的哈喇子,将成为明天的眼泪。现在淌

3、的哈喇子,将成为明天的眼泪。14.14.狗一样地学,绅士一样地玩。狗一样地学,绅士一样地玩。15.15.今天不走,明天要跑。今天不走,明天要跑。16.16.投资未来的人是忠于现实的人。投资未来的人是忠于现实的人。17.17.教育程度代表收入。教育程度代表收入。18.18.一天过完,不会再来。一天过完,不会再来。19.19.即使现在,对手也不停地翻动书页。即使现在,对手也不停地翻动书页。20.20.没有艰辛,便无所获。没有艰辛,便无所获。回顾:回顾:1 1 顺序结构程序能解决的问题:顺序结构程序能解决的问题: 直接能用直接能用计算的问题计算的问题. .如,如, ex4.8ex4.8#includ

4、e #include #define PI 3.14159#define PI 3.14159void main()void main() float r,h,l,s,s1,v,v1; float r,h,l,s,s1,v,v1; printfprintf(请输入半径请输入半径r r和高和高h:nh:n);); scanf(%f%f,&r,&hscanf(%f%f,&r,&h);); l=2.0 l=2.0* *PIPI* *r;r; s=PI s=PI* *r r* *r;r; s1=4.0 s1=4.0* *PIPI* *r r* *r;r; v=4.0 v=4.0* *PIPI* *r

5、r* *r r* *r/3.0; r/3.0; v1=PI v1=PI* *r r* *r r* *h;h; printfprintf(圆周长圆周长 L=%.2fn,l);L=%.2fn,l); printfprintf(圆面积圆面积: S=%.2fn,s);: S=%.2fn,s); printfprintf(圆球表面积圆球表面积 S1=%.2fn,s1);S1=%.2fn,s1); printfprintf(圆球体积圆球体积: V=%.2fn,v);: V=%.2fn,v); printfprintf(圆柱体积圆柱体积: V1=%.2fn,v1);: V1=%.2fn,v1); 例例 鸡兔

6、同笼鸡兔同笼. .已知鸡兔总头数为已知鸡兔总头数为h=8,h=8,总脚数为总脚数为f=22,f=22,求鸡兔各多少只求鸡兔各多少只? ?#include #include void main() void main() intint x,y,h,fx,y,h,f; ; h=8; f=22;h=8; f=22; x=2x=2* *h-f/2;h-f/2; y=f/2-h; y=f/2-h; printfprintf(头头=%d,=%d,脚脚=%=%dn,h,fdn,h,f); ); printfprintf(鸡鸡=%d,=%d,兔兔=%=%dn,x,ydn,x,y);); #include vo

7、id main() int a, b, sum; a=123; b=456; sum=; printf(sum=%dn, sum); 在一个实际问题中在一个实际问题中. .解决这类问题就需要用解决这类问题就需要用. .如,如,Ex5.5 Ex5.5 计算分段函数计算分段函数: : #include #include void main()void main() float float x,yx,y; ; printfprintf(请输入请输入x: );x: ); scanf(%fscanf(%f,x);x); printf(f(%.2f)=%.2fn,x,y); printf(f(%.2f)=

8、%.2fn,x,y); Ex6.5 Ex6.5 将百分制转化为等级分将百分制转化为等级分(A B C D E)(A B C D E)。 #include #include void main()void main() intint score;charscore;char grade; grade; printfprintf(请输入你的百分制分数(请输入你的百分制分数(0-1000-100) :n);:n); scanf(%d,&scorescanf(%d,&score); ); switch (n) switch (n) case 10:case 10: case 9: grade=A; b

9、reak; case 9: grade=A; break; case 8: grade=B; break; case 8: grade=B; break; case 7: grade=C; break; case 7: grade=C; break; case 6: grade=D; break; case 6: grade=D; break; default: grade=E; default: grade=E; printf(gradeprintf(grade=%=%cn,gradecn,grade);); 1011310121)(xxxxxxxf6.1 概述概述1 1 什么是循环结构什么

10、是循环结构? ?,2 2 循环结构的程序设计能解决什么样的实际问题循环结构的程序设计能解决什么样的实际问题? ? 用来解决包含用来解决包含的实际问题的实际问题. . 如如, , 求和求和:1+2+3+4+:1+2+3+4+100+100 输入全班同学的成绩输入全班同学的成绩 等等等等3 3 循环结构的问题要素循环结构的问题要素: : 1 1)操作操作 2 2)循环)循环( (循环在循环控制条件循环在循环控制条件不成立不成立的时候的时候结束结束) )4 4 实现循环结构的四种方法:实现循环结构的四种方法:1 1)gotogoto-if-if语句语句 (不提倡)(不提倡)2 2)whilewhil

11、e语句语句 (主要实现当型循环)(主要实现当型循环)3 3)dodowhilewhile语句语句 ( (主要实现直到型循环主要实现直到型循环) )4 4)forfor语句语句 (多功能)(多功能)语句语句非006.2 goto-if 语句实现的循环。语句实现的循环。1 1 无条件转移语句:无条件转移语句: 一般格式:一般格式:goto goto 标号;标号;语句语句必须是必须是, ,不能用整数!不能用整数!格式格式1 1标号标号: : if(if() ) goto goto 标号标号;2 2 实现循环的格式:实现循环的格式:格式格式2 2标号:标号: if(if()goto )goto 标号标

12、号; ;例例6.1 6.1 求求 = 1+2+3+4+= 1+2+3+4+100+1001001ii#include #include void main()void main() intint sum=0,i=1;sum=0,i=1; loop:loop: / /* * 标号标号* */ / if(if() ) sum=sum=sum+isum+i; ; i+; i+; gotogoto loop; loop; printf(sumprintf(sum=%=%dn,sumdn,sum);); 6.3 while语句(主要用于实现当型循环语句(主要用于实现当型循环) A块块一般格式:一般格式:

13、 whilewhile() 语句语句语句非00执行过程执行过程一般格式:一般格式: whilewhile() 语句语句例例6.2 6.2 求求 (用(用 whilewhile语句)语句)#include #include void main()void main() intint sum=0,i=1; sum=0,i=1; while ( while () ) sum=sum=sum+isum+i; ; printf(sumprintf(sum=%=%dn,sumdn,sum);); 1001ii语句非00执行过程执行过程6.4 do-while 语句语句 (主要用实现直到型循环主要用实现直到

14、型循环)一般格式:一般格式: dodo 语句语句 whilewhile() 语句非00执行过程执行过程 A块例例6.3 6.3 求求 (用(用 do-whiledo-while语句)语句)1001ii一般格式:一般格式: dodo 语句语句 whilewhile(); ; #include #include void main()void main() intint sum=0,i=1; sum=0,i=1; do do sum+=i; sum+=i; i+; i+; while(while(i i=100=100);); printf(sumprintf(sum=%=%dn,sumdn,su

15、m);); 语句非00执行过程执行过程分析两程序作用是否相同分析两程序作用是否相同? ?为什么为什么? ?程序程序1 1:#include #include void main()void main() intint sum=0, sum=0,i=11i=11; ; while(while(i i=10=10) ) sum= sum=sum+isum+i; ; i+; i+; printf(sumprintf(sum=%=%dn,sumdn,sum);); 程序程序2 2:#include #include void main()void main() intint sum=0, sum=0,

16、i=11i=11; ; do do sum= sum=sum+isum+i; ; i+; i+; while(while(i i=10=10);); printf(sumprintf(sum=%=%dn,sumdn,sum);); 输出结果:输出结果: sum=11 sum=11 输出结果:输出结果: sum=0 sum=0 6.5 for 语句语句一般格式:一般格式:for(for(表达式表达式1;1; ;表达式表达式3)3) 语句语句执行过程执行过程:语句非00求解表达式1求解表达式3语句求解表达式3为真求解表达式1给循环变量赋初值给循环变量赋初值循环控制条件循环控制条件给循环变量加增量给

17、循环变量加增量循环体循环体sum=0;sum=0;for(for(; ;i+) ;i+) sum=sum=sum+isum+i; ; 例例6.4 6.4 求求 (用(用 for for 语句)语句)#include #include void main ( )void main ( ) int sum,i; int sum,i; sum=0;sum=0; for(i=1; for(i=1;i+) ;i+) sum=sum+i;sum=sum+i; printf(sum=%dn,sum); printf(sum=%dn,sum); 1001ii考虑:考虑: 求求 , S=5+10+15+, S=

18、5+10+15+100 , , 20+100 , , 20!1001/1ii10013ii一般格式:一般格式:for(for(表达式表达式1;1; ;表达式表达式3)3) 语句语句例例6.4a 6.4a 求求 (用(用 for for 语句可以代替语句可以代替whilewhile)#include #include voidvoid main()main() int sum,i; int sum,i; sum=0;sum=0; for(i=0; for(i=0;i+) ;i+) sum=sum+i; sum=sum+i; printf(sum=%dn,sum);printf(sum=%dn,s

19、um); 1001ii i=0;i=0; while (i=100)while (i=100) sum= sum=sum+isum+i; ; i+; i+; 一般地一般地,对一般格式对一般格式 : for(for(表达式表达式1;1; ;表达式表达式3)3) 语句语句表达式表达式1;1;while (while () ) 语句语句 表达式表达式3;3;表达式2语句非00求解表达式1求解表达式3注意到:注意到:for语句中的三个表达式都是可以省略的。语句中的三个表达式都是可以省略的。如:如: for(ifor(i=1;i=100;i+ )=1;i100)break;100)break; sum=

20、 sum=sum+isum+i;i=1;i=1;for( ;i=100;i+ )for( ;i=100;i+ ) sum= sum=sum+isum+i; ;for(ifor(i=1;i=100; )=1;i100)break;100)break; sum= sum=sum+isum+i; ; i+; i+; for(ifor(i=1;i=100; sum=1;i=100; sum=sum+i,isum+i,i+);+);6.6 循环的嵌套循环的嵌套 P113. 1) while ( )1) while ( ) 2) do2) do while ( ); while ( );3) for (

21、; ; ;)3) for ( ; ; ;) 4) while ( )4) while ( ) 6.8 break语句和语句和continue语句语句 1) break 1) break: 跳出循环体跳出循环体, ,提前结束循环语句。提前结束循环语句。 2) continue2) continue: 结束本次循环结束本次循环, ,提前进入下一轮循环。提前进入下一轮循环。 (执行一次循环体(执行一次循环体, ,叫做一轮循环。)叫做一轮循环。)例例 从从1 1开始累加自然数开始累加自然数, ,输出和不超过输出和不超过8 8的的i i和累加和的值和累加和的值. .#include #include v

22、oid main()void main() int i,sum=0; int i,sum=0; printf(i, sumn); / printf(i, sumn); /* * 表头表头 * */ / for(i=1;for(i=1;i+);i+) sum=sum+i; sum=sum+i; if(sum8) if(sum8) printf(%d, %dn,i,sum); printf(%d, %dn,i,sum); 一一 break语句:语句: 读程序读程序,说出程序的功能和运行结果说出程序的功能和运行结果.breakbreak:跳出循环体:跳出循环体, ,提前结束循环语句。提前结束循环语句

23、。二二 continue语句语句 例例6.5 输出输出100200之间不能被之间不能被3整除的数。整除的数。#include #include voidvoid main()main() int n; int n; for(n=100;n=200;n+) for(n=100;n=200;n+) if(n%3=0) if(n%3=0) printf(%-4d,n); printf(%-4d,n); printf(n); printf(n); 读程序读程序,说出程序的功能说出程序的功能.continuecontinue:结束本次循环:结束本次循环, ,提前进入下一轮循环。提前进入下一轮循环。例例6

24、.5 输出输出100200之间不能被之间不能被3整除的数。整除的数。(另法。另法。) #include #include voidvoid main()main() intint n; n; for(nfor(n=100;n=200;n+)=100;n=200;n+) if(n%3!=0)printf(%-4d,n);if(n%3!=0)printf(%-4d,n); printf(nprintf(n); ); 回顾回顾: 三种三种语句语句 do do 语句语句 whilewhile() for(for(表达式表达式1;1; ;表达式表达式3)3) 语句语句 while while() 语句语

25、句6.9 常用循环算法举例常用循环算法举例将要介绍的常用算法将要介绍的常用算法: : 一一 求序列的前求序列的前n n项或求级数的部分和项或求级数的部分和 二二 筛选具有某性质的数筛选具有某性质的数 三三 处理字符串中字符的算法处理字符串中字符的算法 四四 穷举法穷举法 五五 其他算法实例其他算法实例循环结构的问题要素循环结构的问题要素: : 1 1)操作操作 2 2)循环)循环 3) 3) 选择哪个循环语句比较合适选择哪个循环语句比较合适一一 求序列的前求序列的前n n项或求级数的部分和项或求级数的部分和#include #include void main()void main() sum

26、=0,t,i; sum=0,t,i; for(for(i i=1,t=1=1,t=1; ;i+);i+) t=t t=t* *i; i; sum+=t; sum+=t; printf(sumprintf(sum=%.0fn,sum);=%.0fn,sum); Ex6.4 Ex6.4 求求 1!1!+2!+3!+ +2!+3!+ +20! +20! 的值的值. .算法思路算法思路: : 1) 1) 建立一个累加变量建立一个累加变量( (如如,sum),sum),通常初始化为通常初始化为0.0. 2) 2) 然后然后, ,到累加变量到累加变量. . 3) 3) 重复重复2)2)直到满足要求为止直到

27、满足要求为止. . 1) 1) 当前后项有关系时当前后项有关系时, ,往往利用前一项求往往利用前一项求下一项下一项. . 2) 2) 当序列或级数的当序列或级数的比较复杂的时候比较复杂的时候, ,可可以分成以分成符号符号、分子分子、分母分母三部分三部分分别计算分别计算。 3) 3) 当序列有通项公式当序列有通项公式, ,直接利用通项公式直接利用通项公式来求项来求项. . (当通项公式比较复杂的时候也可以当通项公式比较复杂的时候也可以分成分成符号符号、分子分子、分母分母三部分三部分分别计算分别计算。)。)例例 6.6 6.6 求求 的近似值的近似值, ,最后一项的最后一项的小于小于1010-6-

28、6。 利用公式利用公式 : /4 = 1/4 = 1 1/3+1/51/3+1/5 1/7+ 1/7+ #include #include #include #include void main()void main() double double s,n,t,pis,n,t,pi ; ; t=1; pi=0;s=1;n=1; t=1; pi=0;s=1;n=1; while ( while () ) pi= pi=pi+tpi+t; ; s=-s; s=-s; /符号符号 n=n+2; n=n+2; /分母分母 t=t=s/ns/n; ; /下一项下一项 pi= pi=pipi* *4;4;

29、 printf(piprintf(pi=%f =%f n,pin,pi);); pi=3.141591pi=3.141591例例 6.7 6.7 求求FibonacciFibonacci数列数列 1,1,2,3,5,81,1,2,3,5,8的前的前4040项。项。 其通项公式为:其通项公式为:农场里有一对兔子,农场里有一对兔子,1 1) 从出生后第从出生后第3 3个月起每个月都生一对小兔子个月起每个月都生一对小兔子( (包括出生的这个月包括出生的这个月) ) ,2 2) 而生出的每一对小兔子,也是从出生后而生出的每一对小兔子,也是从出生后第第3 3个月个月起,每个月都生一对起,每个月都生一对小

30、兔子,小兔子,( (所有兔子永远不死所有兔子永远不死) ) 则:每月的兔子数,为一个则:每月的兔子数,为一个FibonacciFibonacci数列。数列。背景介绍背景介绍 :f fn n= = 1 n=1,21 n=1,2 f fn-1n-1+f+fn-2n-2 n n3 3题意分析:题意分析: 通项公式:通项公式: f fn n= = 1 n=1,21 n=1,2 f fn-1n-1+f+fn-2n-2 n3 n31 1) 上个月原有的兔子数:上个月原有的兔子数: f fn-1n-1对。对。2 2) 上上个月已有的兔子(上上个月已有的兔子( f fn-2n-2对),对), 上上个月已有的兔

31、子上上个月已有的兔子已成为老兔子已成为老兔子,。 即,这个月的新生兔子数为即,这个月的新生兔子数为f fn-2n-2对对!3 3)从而,上个月原有的兔子数:()从而,上个月原有的兔子数:(f fn-1n-1对)对)加上加上 这个月的新生兔子数这个月的新生兔子数(f fn-2n-2对),即为本月的兔子总数。对),即为本月的兔子总数。例例 6.7 求求FibonacciFibonacci数列数列 1,1,2,3,5,81,1,2,3,5,8的前的前4040项。项。其通项公式为:其通项公式为:f fn n= = 1 n=1,21 n=1,2 f fn-1n-1+f+fn-2n-2 n n3 3f1=

32、1,f2=1输出输出f1,f2f1=f1+f2f2=f2+f1#include #include void main()void main() f1,f2; int i; f1,f2; int i; f1=1; f2=1;f1=1; f2=1; for(i=1; for(i=1;i+);i+) printf(% printf(%1212 % %1212,f1,f2); ,f1,f2); if(i%2=0) printf(n);if(i%2=0) printf(n); /循环两次换一次行循环两次换一次行: : 控制一行输出控制一行输出4 4个数据个数据 f1=f1=f1f1+f2; +f2; f

33、2=f2+ f2=f2+f1f1; ; 二二 筛选具有某性质的数筛选具有某性质的数算法思路算法思路: 判定给定数判定给定数m是否具有此性质(是否具有此性质(对于对于往往需要用往往需要用来来判定判定),如果具有此性质则输出),如果具有此性质则输出m.例例6.5 6.5 输出输出100-200100-200之间之间的数。的数。( (另法。另法。) ) #include #include voidvoid main()main() int n; int n; for(n=100;n=200;n+) for(n=100;n=200;n+) if(if()printf(%-4d,n);)printf(%

34、-4d,n); printf(n); printf(n); 例例6.8 判断判断m是否为素数。是否为素数。(m=a(m=a* *b b 则则a,ba,b中至少有一个是不大于中至少有一个是不大于m m的平方根的的平方根的) )2 2 中没有中没有m m的因子的因子m输出m不是素数输出m是素数k=sqrt(m) 真 假 break 真 假 输入整数m算法分析算法分析: 检验从检验从2 2 , ,都不是都不是m m的因子的因子. .m题意分析题意分析: :素数素数m m:即除了自身:即除了自身m m及及1 1外没有真因子的自然数外没有真因子的自然数2 2m-1m-1中没有中没有m m的因子的因子例例

35、6.8 判断判断m是否为素数。是否为素数。 P118 输出m不是素数输出m是素数k=sqrt(m) 真 假 break 真 假 输入整数m#include #include #include #include void main()void main() intint m,i,km,i,k; ; printfprintf(输入整数输入整数m(mm(m1): 1): ) ); scanf(%d,scanf(%d,&m m); ); k= k=sqrt(msqrt(m);); for(ifor(i=2;i=2;i=k;ik;i+) +) if(m%iif(m%i=0)break;=0)break;

36、 if(iif(i=k+1)=k+1) printf(%dprintf(%d是素数是素数.n,mn,m);); else else printf(%dprintf(%d不是素数不是素数.n,mn,m);); 例例6.9 求求100200之间的全部素数。之间的全部素数。算法分析:算法分析: 显然只需把上题中的显然只需把上题中的m m从从100100取到取到200200就可以了。就可以了。 breakm%i=0真 假输出mi=k+1真 假k=sqrt(m)#include #include #include #include void main()void main() int m,k,i,n=0

37、; int m,k,i,n=0; for(m=101; for(m=101; ;m=m+2m=m+2) ) k=sqrt(m);k=sqrt(m); for(i=2; for(i=2;i+);i+) if(m%i=0)break; if(m%i=0)break; if( if() ) n+; n+; printf(%5d,m); printf(%5d,m); if(n%10=0)printf(n);if(n%10=0)printf(n); printf(n100printf(n100200200之间共有之间共有%d%d个素数个素数。n,n);n,n); ex6.7 一个数恰好等于它的因子和,则

38、称它为完数:一个数恰好等于它的因子和,则称它为完数: 如,如,6=1+2+3。求求1-1000之间的完数。输出格式为之间的完数。输出格式为: 6 的因子是的因子是: 1, 2, 3#include #include void main()void main() intint m,s,i,nm,s,i,n=0;=0; for(mfor(m=1;m=1000;m+) =1;m=1000;m+) for(ifor(i=1;=1;i;i+) +) if(m%iif(m%i=0) s=0) s=s+is+i; ; if(if() ) n+; n+; printf(%dprintf(%d 的因子是的因子是

39、: : ,m); ,m); for(ifor(i=1;=1;i;i+) +) if(m%iif(m%i=0) =0) printfprintf( %( %d,id,i);); printf(bprintf(b n); n); printf(printf(1110001000中共有中共有%d%d个完数个完数。 n,nn,n);); 输出m和它的因子m=s真 假求m的因子和s(条件累加)输入整数m一个整数是否是完数的算法:一个整数是否是完数的算法: 三三 处理字符串中字符的算法处理字符串中字符的算法一个常用的格式是一个常用的格式是: : while( while() ) 按按处理变量处理变量c c

40、中的字符中的字符 算法思路算法思路: 从从一个字符一个字符,处理一个字符处理一个字符,利用循环利用循环反复执行反复执行.:从从一个字符的函数是:一个字符的函数是: 例例6.10 译密码。译密码。题意分析:题意分析: 编密码规则:编密码规则:A A V V 和和 a a v v 的转换规则是的转换规则是: c: c对应对应c+4 c+4 W X Y ZW X Y Z和和w x y zw x y z的转换规则是的转换规则是:c:c对应对应c+4-26c+4-26输出字符输出字符c cc=c-26;c=c-26;是由W-Z或w-z转换的吗? 真 假c=c+4;c=c+4; 真 假#include #

41、include void main()void main() char c; char c; while(while() ) if(cif(c=a&ca&c=A&cA&c=Z)z)|cz) c=c-26; c=c-26; printf(%c,cprintf(%c,c);); printf(nprintf(n);); China! China! GlmreGlmre! !四四 穷举法穷举法算法思路:利用循环将算法思路:利用循环将一一检验一一检验, 挑出所有满足要求的情况。挑出所有满足要求的情况。例(百钱买百鸡)例(百钱买百鸡)鸡翁鸡翁1,1,钱值钱值5; 5; 鸡母鸡母1,1,钱值钱值3;3;鸡

42、雏鸡雏3,3,钱值钱值1;1;何以何以百钱买百鸡百钱买百鸡? ? 算法分析:算法分析:用穷举法检验所有可能情况:用穷举法检验所有可能情况:公:公:x x 母:母:y y 小:小:z z 0 0 100 0 0 100 0 1 99 0 1 99 0 2 98 0 2 98 再进一步:再进一步:x x:0 - 20 (50 - 20 (5元一只元一只, ,最多买最多买2020只只) )。y y:0 - 33 0 - 33 (3 3元一只元一只,100,100元最多买元最多买3333只)。只)。z z:z=100-x-y z=100-x-y (z z由由x,yx,y所决定)。所决定)。输出:(x,

43、y,z)(z%3=0)&(5*x+3*y+z/3100)真 假 z=100-x-y z=100-x-y for y=0 to 33 for x=0 to 20例例 程序:程序: (百钱买百鸡)(百钱买百鸡)#include #include void main()void main() intint x,y,zx,y,z; ; printfprintf(公鸡公鸡 母鸡母鸡 小鸡小鸡n);n); for(xfor(x=0;x20;x+)=0;x20;x+) for(yfor(y=0;y33;y+)=0;y33;y+) z=100-x-y; z=100-x-y; if(z%3=0&x if(z%3

44、=0&x* *5+y5+y* *3+z/3=100)3+z/3=100) printf(%-6d%-6d%-6dn,x,y,z); printf(%-6d%-6d%-6dn,x,y,z); 输出:(x,y,z)(z%3=0) &(5*x+3*y+z/3100)真 假 z=100-x-y z=100-x-y for y=0 to 33 for x=0 to 20 五五 其他算法实例其他算法实例:Ex6.1 Ex6.1 输入两个整数输入两个整数m m和和n n,求其最大公约数和最小公倍数。,求其最大公约数和最小公倍数。 问题分析:问题分析: 最小公倍数最小公倍数 q=mq=m* *n/n/最大公约

45、数最大公约数 关键:求最大公约数关键:求最大公约数p =p =(m,nm,n) ( (个人临时的记号个人临时的记号) )输入输入m,nm0=m,n0=n将大数放在将大数放在m中中n0r=m%n; m=n;n=r;输出最大公约数:输出最大公约数:m输出最小公倍数:输出最小公倍数:m0*n0/m如如:(:(6464,2424) = = (2424,1616) = = (1616,8 8) = = (8 8,0 0)=8=8 即即 :8 8为为6464和和2424的最大公约数。的最大公约数。 辗转相除法辗转相除法 求最大公约数:求最大公约数: ( (m,nm,n)=m )=m 当当n=0n=0 =

46、= ( ( n,rn,r) ) 当当n n0 0其中其中 r=r=m%nm%n(余数)(余数) 对于一般的问题对于一般的问题, ,你没见过的类型你没见过的类型, ,首先自己考虑如何首先自己考虑如何解决它解决它, ,然后分析然后分析的的, ,找出循环部分找出循环部分, ,再再编程实现它编程实现它. .考虑那一部分操作在重复:考虑那一部分操作在重复: 1) 1) 求余:求余:r=r=m%nm%n 2) 2) n n作为新的作为新的m m , r r作为新的作为新的n n 3) 3) 重复重复1)-2)1)-2),当前的,当前的m m是最初是最初m,nm,n的的最大公约数最大公约数Ex6.1 Ex6

47、.1 输入两个整数输入两个整数m m和和n n,求其最大公约数和最小公倍数。,求其最大公约数和最小公倍数。输入m,nm0=m,n0=n将大数放在m中r=m%n; m=n;n=r;输出最大公约数:m输出最小公倍数:m0*n0/m#include #include void main()void main() intint m,n,r,m0,n0; m,n,r,m0,n0; printfprintf(请输入请输入m,nm,n (m0, n0): ); (m0, n0): ); scanf(%d%d,&m,&nscanf(%d%d,&m,&n);); m0=m;n0=n; m0=m;n0=n; if

48、(nif(n m)rm)r= =m;mm;m= =n;nn;n=r; =r; /排序排序m m和和n n while(nwhile(n!=0)r=!=0)r=m%n;mm%n;m= =n;nn;n=r;=r; printf(%dprintf(%d和和%d%d的最大公约数为:的最大公约数为:%dn,m0,n0,m);%dn,m0,n0,m); printfprintf(最小公倍数为:最小公倍数为:%dn,m0%dn,m0* *n0/m);n0/m); 辗转相除法辗转相除法 :( (m,nm,n)= m )= m 当当n=0n=0 = ( = (n,rn,r) ) 当当n n0 0 其中其中 r=

49、r=m%nm%n(余数)(余数)Ch6Ch6循环控制循环控制循环编程所解决的问题和两个要点循环编程所解决的问题和两个要点1 1三种循环语句三种循环语句2 2两种中断语句两种中断语句forforwhilewhilebreakbreakcontinuecontinue3 3几种关于循环的经典算法几种关于循环的经典算法求序列和级数求序列和级数筛选某性质的数筛选某性质的数逐个字符的处理字符串逐个字符的处理字符串穷举法穷举法其他算法其他算法do-whiledo-while作业作业: P129: P129Ex 6.2 6.3 Ex 6.2 6.3 6.6 6.11 6.6 6.11选做题:选做题:1 1

50、(棋盘上的小麦)(棋盘上的小麦)相传古代印度国王舍罕要褒赏他的聪明能干的宰相达依尔相传古代印度国王舍罕要褒赏他的聪明能干的宰相达依尔(国际象棋的发明者),问他需要什么,达依尔回答说:(国际象棋的发明者),问他需要什么,达依尔回答说:“国王只要在国际象棋国王只要在国际象棋的棋盘第一格放的棋盘第一格放1 1粒麦子,第二格放粒麦子,第二格放2 2粒麦子,第三格放粒麦子,第三格放4 4粒麦子,以后按此比例每粒麦子,以后按此比例每一格加一倍,一直放到第一格加一倍,一直放到第6464格(国际象棋棋盘是格(国际象棋棋盘是8 8* *8=648=64格),我就感恩不尽,其格),我就感恩不尽,其他我什么也不要了

51、。他我什么也不要了。”,国王想:,国王想:“这有多少!还不容易!这有多少!还不容易!”,于是让人扛来一,于是让人扛来一袋小麦,但是不到一会就全用完了,再来一袋很快又没有了,结果全印度的粮食袋小麦,但是不到一会就全用完了,再来一袋很快又没有了,结果全印度的粮食全部用完还是不够。国王非常奇怪,到底需要多少呢?请你编程计算需要多少体全部用完还是不够。国王非常奇怪,到底需要多少呢?请你编程计算需要多少体积的小麦?积的小麦? s=1+2s=1+21 1+2+22 2+2+23 3+ +2+26363 (1m1m3 31.421.42* *10108 8粒)粒)2 2 (换零钞票)(换零钞票)要将要将10

52、0100元的大钞票元的大钞票, ,换成等值的换成等值的1010元、元、5 5元、元、2 2元、元、1 1元一张的小钞元一张的小钞票,要求每次换成票,要求每次换成4040张小钞票,每种至少一张。输出所有换法。(穷举法)张小钞票,每种至少一张。输出所有换法。(穷举法)ex6.2 ex6.2 输入一串字符,统计英文字母、空格、数字和其他字符个数。输入一串字符,统计英文字母、空格、数字和其他字符个数。#include #include void main ( )void main ( ) char c; int n1,n2,n3,n4; char c; int n1,n2,n3,n4; n1=n2=n

53、3=n4=0; n1=n2=n3=n4=0; printf(printf(请输入一串字符请输入一串字符:n);:n); while( while(!=n)!=n) printf( printf(英文字母个数英文字母个数=%dn,n1);=%dn,n1); printf( printf(空格字符个数空格字符个数=%dn,n2);=%dn,n2); printf( printf(数字字符个数数字字符个数=%dn,n3);=%dn,n3); printf( printf(其他字符个数其他字符个数=%dn,n4);=%dn,n4); ex6.3 ex6.3 求求s=s=a+aa+aaaa+aa+aaa

54、+ + +aaaaaaa a的值。的值。#include #include void main()void main() long sum; long sum; intint n,t,a,in,t,a,i; ; printfprintf(请输入请输入n,a(0a=9):);n,a(0a=9):); scanf(%d%d,&n,&ascanf(%d%d,&n,&a);); sum=0;t=0; sum=0;t=0; for(ifor(i=0;i=0;in;in;i+)+) t=t t=t* *10+a;10+a; sum= sum=sum+tsum+t; ; printf(aprintf(a=%

55、d, n=%=%d, n=%dn,a,ndn,a,n);); printf(Snprintf(Sn= =a+aa+aaaa+aa+aaa+ + +aaaaa=%lda=%ldn,sumn,sum);); ex6.5 ex6.5 求求501101210011kkkkkk#include #include void main()void main() double sum=0;int k; double sum=0;int k; for(k=1;k=100;k+) sum+=k; for(k=1;k=100;k+) sum+=k; /=/= while( while(k=50k=50) ) sum

56、+=k sum+=k* *k;k+; k;k+; /= /= dodo sum+=1.0/k;k+; sum+=1.0/k;k+; while( while(k=10k=10);); printf(sum=%fn,sum); printf(sum=%fn,sum); ex6.6 ex6.6 求水仙花数。求水仙花数。( (如,如,153=1153=13 3+5+53 3+3+33 3) )#include #include void main()void main() int i,a,b,c; int i,a,b,c; for(i=100; i=999;i+) for(i=100; i=999;

57、i+) if( if()printf(%6d,i);)printf(%6d,i); printf(n); printf(n); ex6.6 ex6.6 求水仙花数。求水仙花数。( (如,如,153=1153=13 3+5+53 3+3+33 3) )(穷举法)(穷举法)#include #include void main()void main() int a,b,c,m,n; int a,b,c,m,n; for(a=1; a=9;a+) for(a=1; a=9;a+) for(b=0; b=9;b+) for(b=0; b=9;b+) for(c=0; c=9;c+) for(c=0;

58、c=9;c+) m=a m=a* *100+b100+b* *10+c;10+c; n=a n=a* *a a* *a+ba+b* *b b* *b+cb+c* *c c* *c;c; if( if()printf(%6d,m);)printf(%6d,m); printf(n); printf(n); Ex6.11 P120(由迭代公式求平方根)(由迭代公式求平方根)用迭代法求用迭代法求x= .x= .求平方根的迭代公式为:求平方根的迭代公式为: x xn+1n+1=(x=(xn n+a/x+a/xn n)/2)/2要求前后两次求出的要求前后两次求出的x x的差的绝对值小于的差的绝对值小于1

59、010-5-5。a#include #include #include #include void main()void main() float a,x0,x1; float a,x0,x1; printfprintf(请输入请输入 a: );a: ); scanf(%f,&ascanf(%f,&a);); x1=a; x1=a; do do x0=x1; x0=x1; x1=(x0+a/x0)/2; x1=(x0+a/x0)/2; while(fabs(x1-x0)=1e-6); while(fabs(x1-x0)=1e-6); printf(sqrt(%.2f)=%.2fn,a,x1);

60、printf(sqrt(%.2f)=%.2fn,a,x1); 例例 : (棋盘上的小麦)(棋盘上的小麦) 相传古代印度国王舍罕要褒赏他的聪相传古代印度国王舍罕要褒赏他的聪明能干的宰相达依尔(国际象棋的发明明能干的宰相达依尔(国际象棋的发明者),问他需要什么,达依尔回答说:者),问他需要什么,达依尔回答说:“国王只要在国际象棋的棋盘第一格放国王只要在国际象棋的棋盘第一格放1 1粒麦子,第二格放粒麦子,第二格放2 2粒麦子,第三格放粒麦子,第三格放4 4粒粒麦子,以后按此比例每一格加一倍,一直麦子,以后按此比例每一格加一倍,一直放到第放到第6464格(国际象棋棋盘是格(国际象棋棋盘是8 8* *8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论