收藏 分享(赏)

第11章 C语言综合应用.ppt

上传人:gsy285395 文档编号:10122609 上传时间:2019-10-12 格式:PPT 页数:21 大小:196.50KB
下载 相关 举报
第11章 C语言综合应用.ppt_第1页
第1页 / 共21页
第11章 C语言综合应用.ppt_第2页
第2页 / 共21页
第11章 C语言综合应用.ppt_第3页
第3页 / 共21页
第11章 C语言综合应用.ppt_第4页
第4页 / 共21页
第11章 C语言综合应用.ppt_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、第11章 C语言综合应用,教学目的:掌握数组设计算法,活用指针设计特效算法,用算法提高程序的速度 重点:数组设计算法,指针设计特效算法 难点:指针设计特效算法,第11章 C语言综合应用,11.1 巧用数组设计算法11.2 活用指针设计特效算法11.3 用算法提高程序的速度,11.1 巧用数组设计算法,数组不仅是一种最基本最重要的数据结构,描述静态的表,而且利用数组可以设计出许多新颖高效的算法,解决许多复杂的难题。数组元素的下标可以是常量、变量、函数、算术表达式,还可以是数组元素。数组元素的妙用全在对下标的构思设计上。,【实例11-1】编写一个程序,将连续的自然数1,2,3,4,n2-1,n2,

2、共n2个数,按由大到小、由里向外、顺时针方向或逆时针方向,排成一个nn的螺旋形状的方阵,如图11-1和图11-2所示。要求:结果正确,排列整齐;算法简洁,思路清晰;行数n的值从键盘输入,顺时针、逆时针方向可以选择。程序可连续运行,键入0或大于19的数结束。,图11-1:顺时针陀螺数阵 图11-2:逆时针陀螺数阵,#include main() int i,j,k,m,n,h,a2020,o;while(1)printf(“Please input n(between 1 and 19)n“);scanf(“%d“, /*逐行填,逆序 */,else /*逆时针方向 */ for(i=1;i=i

3、;h-) ahk = m+; /*逐列填,逆序 */h=i; /*填写第h行 */for(k=n-i;k=i+1;k-) ahk = m+; /*逐行填,逆序 */if(n%2=1) an/2+1n/2+1 = m; /*n为奇数时填中心数 */for(i=1;i=n;i+)for(j=1;j=n;j+) printf(“%4d“,aij); /*输出螺旋数阵 */printf(“n“);break; ,算法:定义二维数组a2020,表示螺旋形状的方阵。设行变量为h,列变量为k。 难点是根据螺旋数阵的方向,准确地确定需填数的行或需填数的列的数组元素的个数以及填数的次序(正序:元素下标由小到大,

4、逆序:元素下标由大到小),灵活运用数组元素的两个下标h、k及n和另外的变量,正确地为数组元素赋值。,具体步骤:(1)由用户键入行数n、选择螺旋数阵的方向。(2)无论是顺时针方向还是逆时针方向的螺旋数阵,都是从外向里一圈一圈为二维数组元素赋值。n行螺旋数阵,如果n是偶数,则有n/2圈;如果n是奇数,则有(n-1)/2圈,在中心再赋最后一个值。完全赋完值后,再逐行打印。(3)数组a中顺时针方向填螺旋数,程序运行结果如图11-3所示。,图11-3: 【实例11-1】的运行结果,11.2 活用指针设计特效算法,排序是将无序的数据按递增或递减的顺序排列起来。在现今的计算机系统中,花费在排序上的时间多者可

5、占到CPU运行时间的15%70%。人们研究出了交换排序法(如冒泡排序法、快速排序法)、选择排序法(如直接选择法、堆排序)、归并排序法等多种方法。,随着排序数量的增加,计算机所花费的时间更是惊人的增长,有时甚至令人不可接受,因此人们还在研究、寻找更为有效的排序方法。C语言中有多种类型的指针,也为排序提供了方便。只要认真分析数据的特点,活用指针就有可能用指针解决一些排序问题。,【实例11-2】随机产生两组两位的整数,分别有小到大排序。然后将它们合并,仍以大到小排序。,main() static int a25,b25,c50,*p=a,*r=c,*q=b;clrscr();random(-2);p

6、rintf(“nFirst random array:n“);randomSort(a); /*随机生成数组a并排序 */printf(“nSecond random array:n“);randomSort(b); /*随机生成数组b并排序 */while(*p!=-1 | *q!=-1) /*合并排序 */if(*p!=-1) ,else if(*p=-1) ,void pr(int *s) /*数组输出函数,s为数组指针 */ while(*s != -1)printf(“%4d“,*s);s+;printf(“n“); ,void randomSort(int d) /*随机生成数组并

7、排序 */ int i,j,n,k,t;n = random(9)+15; /*产生将生成的随机数的个数 */printf(“n=%dn“,n);for(i=0;in;i+) /*生成n个随机数 */di=random(100);di = -1; /*结束标志 */pr(d); /*输出生成的随机数 */for(i=0;in-1;i+) /*选择法排序 */k=i;for(j=i+1;jn;j+)if(dkdj) k=j;t=di; di=dk; dk=t;printf(“Sorted array:n“);pr(d); ,(1)编写随机数数组生成及排序函数randomSort和数组输出函数pr

8、。 (2)两次调用randomSort函数,生成a、b两数组、输出,并由大到小排序、再次输出。 (3)两组随机数a、b合并排序到数组c,调用pr函数输出c。 程序运行结果如图11-4所示。,图11-4: 【实例11-2】的运行结果,11.3 用算法提高程序的速度,有的问题很难找到这样的算法,或者根本就不存在这样的算法,但它们具有这样的特点:如果问题有解,一组或多组解 ,必定全在某个集合之内,如果集合内无解,集合外肯定也无解。这样,我们就可以把集合中的元素一一列举出来,验证问题是否有解,这就是穷举法。穷举法不是理想的方法,也不是万能的方法,而是没有办法的办法,但往往又是高效的方法(算法构造快、程

9、序编写快、运行快),有时还是唯一有效的方法。,用穷举法编程,步骤: 如何把实际问题定义成穷举问题,将可能的解限定在一个容易表达的集合内 然后用循环或循环嵌套编程,验证是否满足问题要求的条件。所以,穷举法是基本的重要的编程方法之一。,分析:(1)设鸡翁、母、雏分别买x、y、z只(每种至少买一只),列出方程组:三个未知数、两个方程,肯能有无穷多组解。这个题是应用题,只应求正整数解。(2)用穷举法编程,三重循环。根据可能性分析,不难得出可能的取值范围为:鸡翁x:119之间,不可能为20,否则无鸡母、鸡雏了;鸡母y:132之间,不可能超过32(已达96钱),还有鸡翁、鸡雏;鸡雏z:398之间,且是3的

10、整倍数。(3)解的判断条件:如果x、y、z的值同时满足两个方程,则是问题的一组解。,【实例11-3】公元前五世纪,我国数学家张丘建在算经一书中提出有趣的百鸡问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、母、雏各几何?,#include main() int x,y,z;printf(“%5c%5c%5cn“,x,y,z);for(x=1;x=19;x+)for(y=1;y=32;y+)for(z=3;z=98;z+=3)if(x+y+z=100 ,图11-5: 【实例11-3】的运行结果,算法的优化:程序运行时间的长短与穷举的次数成正比,如果运行时间超过了人的忍耐程度,就

11、会认为穷举法对这个问题是失败的。为了不遗漏解,需要把“圈”划大一点;为了提高运行速度,又要尽量把“圈”缩小一点。程序运行速度与循环嵌套重数、加减乘数次数、逻辑判断次数以及所选用的数据结构有关,要根据问题进行优化。,先考虑压缩循环重数。用z=100-x-y代入另一方程,化简得:7x+4y=100。可用二重循环编程,x、y的取值范围同上,解的判断条件也就剩了这一个。 #include main() int x,y,z;printf(“%5c%5c%5cn“,x,y,z);for(x=1;x=19;x+)for(y=1;y=32;y+)if(7*x+4*y = 100)printf(“%5d%5d%5dn“,x,y,z);break; ,能否优化算法为一重循环编程呢?可以,要作数学上的进一步变换。 #include main() int x,y,z;printf(“%5c%5c%5cn“,x,y,z);for(x=4;x0 ,三个不同的程序,内循环执行次数及其它运算的次数等见表11-1。三重循环程序用的各种运算次数都多,是一重循环程序次数的几千倍,所以,反过来一重循环程序的速度也就比三重循环程序的速度快几千倍。,表11-1 三个程序的内循环执行次数及其它运算的次数比较,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报