(中职)计算机程序设计(C语言)第五章第6节教学课件工信版.ppt

上传人:春哥&#****71; 文档编号:88335794 上传时间:2023-04-25 格式:PPT 页数:29 大小:799.50KB
返回 下载 相关 举报
(中职)计算机程序设计(C语言)第五章第6节教学课件工信版.ppt_第1页
第1页 / 共29页
(中职)计算机程序设计(C语言)第五章第6节教学课件工信版.ppt_第2页
第2页 / 共29页
点击查看更多>>
资源描述

《(中职)计算机程序设计(C语言)第五章第6节教学课件工信版.ppt》由会员分享,可在线阅读,更多相关《(中职)计算机程序设计(C语言)第五章第6节教学课件工信版.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、YCF(中职)计算机程序设计(C语言)第五章第6节教学课件工信版第五章循环结构程序设计第第5.6循环结构程序设计应用举例循环结构程序设计应用举例5.6.15.6.1循环次数类应用循环次数类应用5.6.25.6.2文本作图类应用文本作图类应用5.6.35.6.3素数类应用素数类应用5.6.45.6.4穷举法应用穷举法应用5.6.55.6.5递推法应用递推法应用5.6.15.6.1循环次数类应用循环次数类应用 有关循环次数类问题的求解,特别是多重循环中循环次数的求解,既是循环结构程序设计的重点也是难点,解此类问题时分两种情况:(1)循环次数固定,直接采用各层循环次数相乘。(2)循环次数随循环变量值

2、的变化而变化,则需要逐层加以计算后累加出各层循环次数,一般要用到“口算”、“心算”来模拟计算机的运算过程。5.6.15.6.1循环次数类应用循环次数类应用【例5.7】写出下面程序的运行结果。#include main()int k,j,m,e=0,f=0,g;for(j=1;j=5;j+)e+;f+;g=0;for(k=1;k=7;k+)e+=1;g+=2;for(m=1;m=10;m+)f+=1;e+=1;g+=1;printf(“e=%d,f=%d,g=%d”,e,f,g);5.6.15.6.1循环次数类应用循环次数类应用【例5.7】写出下面程序的运行结果。程序运行结果:程序运行结果:e=

3、75,f=355,g=15e=75,f=355,g=15说明:这是一个三重循环结构的问题,且每层循环的次数是固定循环的次数是固定的,遇到此类问题,应针对printf输出项一个一个变量值进行求解,可以按输出顺序,先求e的值,找出所有e的地方进行求解,然后再求f和g的值。首先分析外层、中间层和内层循环中的循环次数,则根据循环次数公式n=(b-a)/c+1则可以得出外层循环次数=(5-1)/1+1=5中间层循环次数=外层循环次数*中间层循环次数=5*(7-1)/1+1)=35内层循环次数=中间层循环次数*内层循环次数=35*(10-1)/1+1)=350再分析e,f,g三个变量在各层的中的每循环一次

4、增量大小和次数。e是一个计数器,它的值=在外层循环中每次增加1*次数5=5,在中间层循环中两次都加1为2*中间层次数35=70,内层循环中没有e,所以e=5+70=75。f也是一个计数器,同样在外层循环中每次加1,则得5,中间层循环中没有,内层循环每次增加1*350=350,所以f=5+350=355。g还是一个计数器,由于在外层循环中,每次都赋0,所以只有在最后一次外循环执行时g的值才被累加到值存入内存单元中,所以g的值只有一次中间层循环2*7=14加一次外循环1*1=1,所以g=14+1=15。5.6.15.6.1循环次数类应用循环次数类应用拓展练习拓展练习 通过本例的学习,我们了解了循环

5、结构程序的执行过程,当然,此例是循环次数固定循环次数固定的情况,运算起来还相对简单一些,如果多层循环的次数都不固定,而是随着内外循环变量值的变化而变化,那么循环次数又如何求解呢?5.6.15.6.1循环次数类应用循环次数类应用拓展练习拓展练习例如:写出下面程序的运行结果。#includemain()intk,j,m,e=0,f=0;for(j=1;j=3;j+)e+;for(k=1;k=j;k+)e+=1;for(m=1;m=k;m+)f+=1;printf(“e=%d,f=%d”,e,f);程序运行结果:程序运行结果:e=9,f=10e=9,f=10说明:这也是一个三重循环结构的问题,且每层

6、循环的次数是不固定循环的次数是不固定的,遇到此类问题,还是针对printf输出项一个一个变量值进行求解,可以按输出顺序,先求e的值,找出所有e的地方进行求解,然后再求f的值,但是求解过程要细心。e值求解,它的值=在外层循环中每次增加1*次数3=3,在中间层循环中次数跟i的值有关,当j=1时,循环1次,j=2时,循环2次,j=3时,循环3次,共循环1+2+3=6次,每循环一次增加1*6=6,内层循环没有e,所以e=3+6=9。f值求解,在外层和中间层都没有,内层循环每次增加1,内循环次数跟外层、中间层循环变量取值有关:当j=1时,则k=1,则m共循环1次;当j=2时,则k=1、k=2,则m=1循

7、环1次+m=1、m=2循环2次,共循环1+2=3次;当j=3时,则k=1、k=2、k=3,则当k=1,m=1循环1次;当k=2,m=1、m=2循环共2次;当k=3,m=1、m=2、m=3循环共3次,总共次数=1+2+3=6次;所以f=1*(1+3+6)=10。由此例可以看出内循环次数跟外循环变量取值有关,对于此类问题进行计算时一定要小心,要用到“口算”、“心算”来模拟计算机的运算过程。这也是循环结构应用中循环次数类应用中较难的地方,请读者仔细阅读,认真理解掌握。5.6.15.6.1循环次数类应用循环次数类应用拓展练习拓展练习返回返回5.6.25.6.2文本作图类应用文本作图类应用文本作图类问题

8、,也是C语句中常见的应用之一。这类问题通常用双重循环来完成。一般情况下有一个通用的框架:for(循环变量i)/外循环次数代表图形的行数 for(循环变量是j)/内层第一个循环次数代表图形每行开头的空格数 printf(“”);for(循环变量k)/内层第二个循环次数代表每行输出字符的个数 printf(“?”);/?代表输出的字符,具体内容根据题目要求确定 printf(“n”);/内层循环结束,则一行图形结束,必须要换行 5.6.25.6.2文本作图类应用文本作图类应用*【例5.8】编程打印输出如下图形:程序设计:#include main()int i,j,k;for(i=1;i=5;i+

9、)/外循环5次数代表图形5行 for(k=1;k=5-i;k+)/循环次数随i值增大,每行开头空格减少,图形呈中间往边上变化 printf(“);for(j=1;j=2*i-1;j+)/内层循环次数决定每行图形个数,2*i-1格式表示图形奇数个变化 printf(“*”);/输出的图形符号是“*”printf(“n”);/每行结束换行 5.6.25.6.2文本作图类应用文本作图类应用*【例5.8】编程打印输出如下图形:说明:对于图形类题,要用双重循环实现,外层循环确定图形的行数,内循环可以分成三部分:第一部分是确定图形每行开始的位置,一般用循环输出空格来实现;第二部分是循环输出每行要看到的图形

10、,这是关键部分,也是比较复杂的部分;第三部分是每行图形部分结束了,要换行。5.6.25.6.2文本作图类拓展练习文本作图类拓展练习由上例中我们学习了用双重循环语句实现图形的输出,也了解了图形类问题的设计方法,但是仔细看一下,上图是图形符号都是相同的图形题目,那么,如何图形符号每行或每列不同,则又如何设计呢?例如:用双重循环编程打印输出如下图形:11211232112343211234543215.6.25.6.2文本作图类拓展练习文本作图类拓展练习例如:用双重循环编程打印输出如下图形:1121123211234321123454321程序设计:#include main()int i,j,m,

11、a;for(i=1;i=5;i+)/图形共5行,外循环循环5次 for(j=1;j=6-i;j+)printf(“”);/内循环开始部分用空格来确定后面图形的开始位置 for(m=1;m=2*i-1;m+)/内循环第二部分循环次数跟每行图形数有关 if(m=i)a=m;else a=2*i-m;/先要计算出每行要显示的图形内容,该部分相对比较复杂 printf(“%d”,a);/输出要显示的图形 printf(“n”);/内循环第三部分,每行图形输出结束后换行 5.6.25.6.2文本作图类拓展练习文本作图类拓展练习例如:用双重循环编程打印输出如下图形:11211232112343211234

12、54321 说明:本例是每行、每列的图形符号都不一样的图形题,则解此类题时,主要的是在内部循环中,输出图形部分要重点考虑每次输出的符号要如何设计,才能跟要求的变化一致,这就是图形类问题设计时的难点所在,望读者仔细理解掌握。返回返回5.6.35.6.3素数类应用素数类应用素数是一个数学概念,即如果一个数只能被1和本身整除,那么这个数就是素数。如何判断一个数是不是素数,解决的方法有以下几种:1、从概念出发,用这个数n除以除1 和本身以外的所有数(2到n-1),都不能整除,则n就是素数。2、除以它平方根之前的所有数(2到sqrt(n)),如果都不能整除,则n就是素数。因为对于n要么只能被1和本身整除

13、,要么能分解成质因数,至少有两素数因子。n=p*q,因为不可能p 和q都大于sqrt(n)(否则乘积就大于n了),所以只要判断那个小的素数能不能被n整除就可以了。3、筛选法求素数,适用于一次性求出多个素数,如求出1-m中所有的素数,把1-m个数排成一排,从2开始,将2的倍数去除,因为它们肯定不是素数,剩下的数中再将3的倍数也除去,然后是5(4是2的倍数已除去)的倍数,7的倍数,依次类推,最后剩下的数必然都是素数,因为它没有被筛选出去,说明它不是任何数的倍数,除了1和本身。在实际应用中,读者可以选用其中任意一种。在实际应用中,读者可以选用其中任意一种。【例5.9】从键盘输入一个数,判断其是否是素

14、数。5.6.35.6.3素数类应用素数类应用程序设计:#include main()int i,x,f=1;scanf(“%d”,&x);/输入x值 for(i=2;ix;i+)/从2到x-1逐个判断 if(x%i=0)f=0;break;/只要x除i有一次能除尽,就不是素数,则退出判断 if(f=1)/上面循环退出,f的值还是1则说明x除i没有除尽过 printf(“%d is a prime”,x);/说明x是素数 else printf(“%d isnt a prime”,x);/否则x不是素数 【例5.9】从键盘输入一个数,判断其是否是素数。5.6.35.6.3素数类应用素数类应用程序

15、运行结果:1717 is a prime 说明:本例用第一种方法(x除以除了1和本身以外的所有数)判断x是不是素数的,这种方法也比较常用的方法之一,请读者能熟练掌握。通过判断一个数是否是素数的学习,我们掌握了判断素数的基本方法,那么如何找出一组数中所有的素数等诸如此类的问题呢?5.6.35.6.3素数类应用素数类应用拓展练习拓展练习例如:找出1090之间所有的素数。通过判断一个数是否是素数的学习,我们掌握了判断素数的基本方法,那么如何找出一组数中所有的素数等诸如此类的问题呢?5.6.35.6.3素数类应用素数类应用拓展练习拓展练习例如:找出1090之间所有的素数。程序设计:#include#i

16、nclude main()int i,j,f;for(j=10;j=90;j+)/j从10到90之间逐个数进行判断 f=1;for(i=2;i=sqrt(j);i+)/从2到sqrt(j)逐个判断 if(j%i=0)f=0;break;/只要j除i有一次能除尽,就不是素数,则退出判断 if(f=1)/上面循环退出,f的值还是1则说明j除i没有除尽过 printf(“%3d”,j);/说明j是素数,就输出 程序运行结果:11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 73 79 83 895.6.35.6.3素数类应用素数类应用拓展练习拓展练习例如:找出

17、1090之间所有的素数。说明:本例是用第二种方法:除以它平方根之前的所有数(2到sqrt(n)),如果都不能整除,则j就是素数,这种方法也是常用方法之一。当然,还可以求解比如在自然数中求出前n个素数,每行m个输出等等一类的问题,又将如何来设计呢?请读者自己思考。返回返回5.6.45.6.4穷举法类应用穷举法类应用所谓穷举法:就是对要解决问题所有可能的情况一个不漏的检查,从中找出符合要求的答案。“穷举法”这是一种非常朴素的解题思想,可以用来解决“有多少种可能”和“是否存在”等类型的问题,穷举法的结构多用循环来实现。这种方法虽然看上去好像很“笨”,要把全部可能的情况都一一测试,但是却能解决一般数学

18、方法无法解决的问题,因此也叫“没有办法的办法”,好在现在有计算机这个快速的运算工具,所以穷举法也能很快得到结果。5.6.45.6.4穷举法类应用穷举法类应用所谓穷举法:就是对要解决问题所有可能的情况一个不漏的检查,从中找出符合要求的答案。【例5.10】经典的数学问题:百钱买百鸡,是我国古代数学家张邱建提出的一个不定方程,要求用一百个钱买一百只鸡,其中大公鸡每只5 个钱,母鸡每只3个钱,每3只小鸡1个钱,问大公鸡、母鸡、小鸡各应买多少只?分析:用数学方程做,设大公鸡x只、母鸡y只、小鸡z只,根据题目可以列出如下方程组:x+y+z=100 5x+3y+z/3=100但是根据数学知识,两个方程,解3

19、个未知数是无法解答的,那我们就可以根据实际情况分析,x,y,z可能的取值范围,在可能的范围内逐一去试试,从而找出其中符合要求的解来。可得x的取值在020,y的取值是033,而z的取值是0300,5.6.45.6.4穷举法类应用穷举法类应用【例5.10】经典的数学问题:百钱买百鸡,是我国古代数学家张邱建提出的一个不定方程,要求用一百个钱买一百只鸡,其中大公鸡每只5 个钱,母鸡每只3个钱,每3只小鸡1个钱,问大公鸡、母鸡、小鸡各应买多少只?程序设计:#include main()int x,y,z;for(x=0;x=20;x+)for(y=0;y=33;y+)for(z=0;z=300;z+)i

20、f(x+y+z=100)&(5*x+3*y+z/3=100)printf(“x=%d,y=%d,z=%dn”,x,y,z);程序运行结果:x=0,y=25,z=75x=3,y=20,z=77x=4,y=18,z=78x=7,y=13,z=80 x=8,y=11,z=81x=11,y=6,z=83x=12,y=4,z=84说明说明:从本例运行结果可以看出,它将所有可能的情况都找出来了。根据穷举法的思想,我们可以对许多问题用“穷举法”的方法去解决。例如:求1999之间所有满足各位数值的立方和等于它本身的数,如:13+53+33=153。5.6.45.6.4穷举法类应用拓展练习穷举法类应用拓展练习程

21、序设计:#include#include main()int i,x,m,s;for(i=1;i0)/内循环对外循环每个值都进行分解计算出,各位数的立方和 x=m%10;s+=pow(x,3);m=m/10;if(s=i)printf(“%d“,i);/如果某个数的各位数的立方和跟原来的数相等,即为满足条件的数,就要输出 返回返回所谓“递推”,即要求解的问题没有一个直接的表达式可以一步得出结果,只有在前面一个(或几个)结果的基础上按照一定的变化规律逐步推导才能得到其结果。5.6.55.6.5递推法应用递推法应用如:要求出10!的结果,只有知道1!的结果再用1!*2得到2!的结果,然后再得出2!

22、*3得3!,依次类推,最后得出10!,即如果没有9!的结果就无法得到10!的结果。在实际应用中有许多问题没有现成的公式直接求解,而必须采用递推的方法逐步求解,才能得出结果。【例5.11】有一典型的数学题,猴子吃桃问题。有一猴子某天摘下若干个桃子,当即就吃了一半,觉得还不过瘾,就又吃了一个。第二天早上又吃了剩下桃子的一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半又多一个,到第十天早上想吃时,只剩下一个桃子了。求第一天它一共摘下多少个桃子?5.6.55.6.5递推法应用递推法应用分析:本题就是一个递推类问题,要求第一天的桃子数,应在第十天的基础上往前推导,推导出第九天的桃子数就是第十天的加

23、1的2倍,在第九天的基础上再推出第八天的桃子是第九天的桃子数加1的2倍,依此类推才能得到第一天的总桃子数。解:设第n天的桃子数为xn,则前一天的桃子数xn-1=(xn+1)*2,即由题目知道,第十天是1个,则第九天应=(1+1)*2=4个,则第八天应=(4+1)*2=10个,最后才能得到第一天的桃子数。【例5.11】有一典型的数学题,猴子吃桃问题。有一猴子某天摘下若干个桃子,当即就吃了一半,觉得还不过瘾,就又吃了一个。第二天早上又吃了剩下桃子的一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半又多一个,到第十天早上想吃时,只剩下一个桃子了。求第一天它一共摘下多少个桃子?5.6.55.6.5

24、递推法应用递推法应用程序设计:#include main()int x=1,i;/x=1是第十天的桃子数是1 for(i=9;i=1;i-)/从第9天开始,逐步往前推导第1天 x=(x+1)*2;/每天的桃子数都是它后一天桃子数+1的2倍 printf(“The number of 1st day is:%dn”,x);程序运行结果:The number of 1st day is:1534说明:说明:本例中,要想求解猴子第一天摘下桃子的总数,只能根据第十天的桃子数先算出第九天的,再由第九天的算出第八天的,这样依次类推,直到算出第一天的桃子数,就为猴子摘的桃子总数,即要求的问题无法用一个直接的

25、表达式实现,只能根据某一结果,按照一定的规律逐步推导才能得出最终的结果。5.6.55.6.5递推法应用递推法应用拓展练习拓展练习例如:已知某一数列,前两项的值分别是1、1,从第三项开始,每项的值都等于它前面两项的和,编程输出该数列前20项。上例中的递推法也被称着“倒递推”,即根据后面的结果,按照规律逐步推导出初始的值;当然,常见的递推多是“正递推”,即要求解某个结果,根据初始,并按一定的规律逐步推导,就可以得出后面项的结果,如数学上常见的数列类问题等。程序设计:#include main()int i,n=2,f1=1,f2=1,f3;/定义前两项,并赋初值 printf(“%d%d”,f1,f2);/输出前两项 for(i=3;i=20;i+)/从第3项到20项循环进行求解 f3=f1+f2;/按规律求出每一项 printf(“%d”,f3);f1=f2;f2=f3;printf(“n”);说明:数列问题是数学上常见的,在数学上通常是要找出通项式的,而通项的求解就是按照已有项的变化趋势、规律找出通项的,然后才能得到最后结果。

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

当前位置:首页 > 教育专区 > 大学资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁