部分C语言程序设计算法与实现.doc

上传人:飞****2 文档编号:60895712 上传时间:2022-11-19 格式:DOC 页数:13 大小:160KB
返回 下载 相关 举报
部分C语言程序设计算法与实现.doc_第1页
第1页 / 共13页
部分C语言程序设计算法与实现.doc_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《部分C语言程序设计算法与实现.doc》由会员分享,可在线阅读,更多相关《部分C语言程序设计算法与实现.doc(13页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、程序设计算法与实现一、数据结构给定一段数组a20(为了便于以后的插入移动操作,这里我们给这个数组分配的空间大些)初始化10个数,即a0a9。原数组为a0a19大小,我们只用了a0a9,因此称这段区域为有效区域。当然删除有效区域的数据元素,有效区要变小。最后只输出有效区。图示一问题一:如何删除数组里一段连续的数据?先定义数组a10,用于存放10个数字,由于是向前覆盖删除数据,所以这里可以不需要多定义空间。有效区域是a0a9上面是为这个数组分配了空间,下面需要初始化数组.初始化数组有两种方法,一种是定义后直接赋值初始化,一种是用户输入用scanf接收后赋值初始化,第一种明显没有第二种灵活,建议使用

2、第二种做法。代码片段如下int a10,i;/这里定义了数组a10和变量ifor(i=0;i10;i+)scanf(“%d”,&ai);代码一上述代码用一个for循环让用户自己输入数值进行a10的初始化。为检验初始化的结果,我们可以将a0a9的初始化数值也用for循环配合printf输出出来,代码如下:for(i=0;i10;i+)printf(“%-5d”,ai);/*这里%-5d为格式化输出控制符,%d表示输出整型(int)%5d为先输出5个列空格再输出数字,%-5d为先输出数字后输出5个列空格。*/代码二为了解决删除数组中连续的元素这个问题,可以先考虑如何删除数组里某个元素。我们知道,若

3、要删除某个元素,其做法就是让这个元素后面的元素依次向前移动,这样这个待删除的元素就会被他后面的元素所替代,这样依次下去,达到目的。图示二这里要用到for自增运算,我们根据上图列出后面的数据覆盖前面的数据的关系。开始:a3=a4a4=a5a5=a6a6=a7a7=a8a8=a9结束;由上可以找出替换规律:an=an+1n为要替换的数据元素的数组下标,这里n+1中止于数组最后一个元素的下标。由此可见,n是从要删除的那个元素的数组下标开始,结束于最后一个元素的下标减去1。以上图为列,数组已经初始化为1、6、0、7、12、55、8、4、2、16,删除数组这些元素中的7,获得7的数组下标3,已知数组最后

4、一个元素16的数组下标为9。代码片段如下:for(i=3;i9;i+)/这里的i是从3开始结束于8,当i为9时已经不执行循环ai=ai+1;代码三综合以上,我们不难得到删除数组任意元素的C语言源代码,完整的代码如下:#include /*头文件,标准C语言库函数,包含下面要用的printf()和scanf()*/void main()int a10,i,b; /*这里定义了数组a10、变量i变量b,这里变量b用于保存删除元素的位置*/printf(Please give me 10 numbersn);/输出这行文字for(i=0;i10;i+)/for循环,从09scanf(%d,&ai);

5、/循环体得到用户的输入并且分别赋给a0a9printf(You give me these numbersn);/输出这行文字for(i=0;i10;i+)printf(“%-5d”,ai);/*这里%-5d为格式化输出控制符,%d表示输出整型(int)%5d为先输出5个列空格再输出数字,%-5d为先输出数字后输出5个列空格。*/printf(nDelete number,give me the location:);/输出这行文字scanf(%d,&b);/得到用户的输入并且赋值给b变量,作为要删除的元素的位置b-;/这里主要将用户输入的“第几个数”转化为这个数的数组下标for(i=b;i9

6、;i+)/主要环节,for循环,执行删除ai=ai+1;/依次后面替换前面的for(i=0;i9;i+)/for循环显示有效区的,由于删掉一个元素,有效区变为9printf(“%-5d”,ai);putchar(n);/输出回车代码四通过以上,我们已经了解了如何删除数组里任意一个元素了,但是如何去删除一段范围连续的元素呢?其实我们可以通过两层for嵌套循环一个一个去删除这段范围的数组元素。就如下图所示:图示三通过以上图示我们发现一个有趣的现象,就是说每次我们需要删除的元素的数组下标都是固定的,因此我们只需找到这个要删除范围的第一个元素的下标,并且根据这个范围包含元素的个数控制删除次数就可以达到

7、我们的目的。因此这里需要在上面提到的删除一个元素的for循环代码上再加上一个控制删除次数的循环代码即可。下面根据上图列出关系如下:循环次数s=6-3+1=4开始:s=1while(s5)a3=a4a4=a5a5=a6a6=a7a7=a8a8=a9s+;结束;下面的代码通过嵌套for实现目的:for(i=0;i(6-3+1);i+)for(j=3;j9;j+)/这里的for和上面讲的删除一个元素的原理一样aj=aj+1;代码五下面的代码通过外嵌套while实现目的:i=0;/初始i为0while(i(6-3+1)for(j=3;j9;j+)/这里的for和上面讲的删除一个元素的原理一样aj=aj

8、+1;i+;代码六下面的代码通过外嵌套dowhile实现目的:i=0;/初始i为0dofor(j=3;j9;j+)/这里的for和上面讲的删除一个元素的原理一样aj=aj+1;i+; while(i(6-3+1);代码七综上,我们可以得到第一个问题的具体C语言代码(for嵌套):#include void main()int a10,i,j,b,c; /*这里定义了数组a10、变量i、变量j、变量b、变量c,这里变量b用于保存删除元素群的起始位置c用来保存中止位置*/printf(Please give me 10 numbersn);/输出这行文字for(i=0;i10;i+)/for循环,

9、从09scanf(%d,&ai);/循环体得到用户的输入并且分别赋给a0a9printf(You give me these numbersn);/输出这行文字for(i=0;i10;i+)printf(“%-5d”,ai);/*这里%-5d为格式化输出控制符,%d表示输出整型(int)%5d为先输出5个列空格再输出数字,%-5d为先输出数字后输出5个列空格。*/printf(nI want delete numbers from:);scanf(%d,&b);printf(To:);scanf(%d,&c);b-;/将b转换为这个数的数组下标c-;/同上for(i=0;i(c-b+1);i+

10、)for(j=b;j9;j+)/这里的for和上面讲的删除一个元素的原理一样aj=aj+1;for(i=0;i10-(c-b+1);i+)/for循环显示有效区的printf(“%-5d”,ai);putchar(n);/输出回车代码八写到这里似乎我又想到一个比较高效率的算法,分享如下:图示四这里可以跳跃替换,以上图为例,列出关系如下:开始:a3=a7a4=a8a5=a9结束;好,到这里我们输出a0a5六个元素,你会发现这个方法似乎比上个方法还要简单而且效率高,但怎样实现呢?具体方法如下:得到要删除元素的个数s这里通过数组下标运算很容易得到s=6-3+1=4得到要删除元素最后个元素到数组最后元

11、素的包含元素个数,还是通过数组下标得到h=9-6=3算出删除后数组元素个数t=9-4=5for循环如下:j=3;/*得到要删除元素最后个元素到数组最后元素的包含元素个数,还是通过数组下标得到h=9-6=3*/for(i=0;ih;i+)aj+=a7+i;代码九最后输出需要这样/算出删除后数组元素个数t=9-4=5for(i=0;i(t+1);i+)printf(“%-5d”,ai);代码十最终C语言代码如下:#include void main()int a10,i,j,b,c,h; /*这里定义了数组a10、变量i、变量j、变量b、变量c、变量h,这里变量b用于保存删除元素群的起始位置c用来

12、保存中止位置,h的作用见上文*/printf(Please give me 10 numbersn);/输出这行文字for(i=0;i10;i+)/for循环,从09scanf(%d,&ai);/循环体得到用户的输入并且分别赋给a0a9printf(You give me these numbersn);/输出这行文字for(i=0;i10;i+)printf(“%-5d”,ai);/*这里%-5d为格式化输出控制符,%d表示输出整型(int)%5d为先输出5个列空格再输出数字,%-5d为先输出数字后输出5个列空格。*/printf(nI want delete numbers from:);

13、scanf(%d,&b);printf(To:);scanf(%d,&c);b-;/将b转换为这个数的数组下标c-;/同上h=9-c;j=b;for(i=0;ih;i+)aj+=ac+1+i;for(i=0;i5for(i=9;i5;i-)ai+1=ai;代码十二最后别忘了把要插入的数字插入到这个移动过的数组里_。使用ai+1=26;/这里i经过上面循环变为5所以需要再加上1整理一下方法,可以通过下面的C语言代码实现单元素的插入:#include void main()int a20,i, b,c; /*这里定义了数组a20、变量i、变量b、变量c,这里变量b用于保存插入元素的位置c用来保存要

14、插入的元素*/printf(Please give me 10 numbersn);/输出这行文字for(i=0;i10;i+)/for循环,从09scanf(%d,&ai);/循环体得到用户的输入并且分别赋给a0a9printf(You give me these numbersn);/输出这行文字for(i=0;ib-1;i-)ai+1=ai;ai+1=c;for(i=0;i11;i+)/for循环显示有效区的printf(%-5d,ai);putchar(n);/输出回车代码十三好,对于单个元素的插入我们研究到这里,下面再来看这个关于选定元素进行分类的问题,对于这个问题,我的想法可能比较

15、复杂,需要用到插入和删除的方法。循环读取数组元素并且与数组内的这个元素b进行比较,满足条件,b元素前面或者后面自动移出一个位置用于存放这个元素,同时删除原有位置的这个元素,说起来比较麻烦,还是先看图示(下图是将小于这个固定元素b的排前面,大于的排后面):图示六可能有点夸张,但理清思路,下面继续:大家可能注意到上图中8是个特殊的元素,这个元素起主要作用,数组中其它元素将与她进行比较,比她大的将排到其右边(后面),比她小的将排到她左边(前面)。这里需要进行比较也就是if语句;注意我们将与8一样大的归类于比8小的排到左边(前面)。现在思路有了,先枚举数组元素但跳过8这个元素,为保险起见,可以记录下其

16、数组下标。循环开始,如果一个元素比8小并且在8的后面,我们就在8前面移动空个位置用于插入这个元素,在插入完成后,我们需要删除原有位置的这个元素,同理如果比8大且在8的前面,我们就在8后面移动空个位置用于插入这个元素,当然也要删除原有位置的这个元素。这样外循环一次即可。外循环代码如下:for(i=0;i10;i+)if(i!=6)/程序代码在这里代码十四比较代码如下:if(ai6)/a6前面空出位置插入ai并删除原位置ai,a6变为a7else if(aia6&i6)/ a6后面空出位置插入ai并删除原位置ai,a6变为a5代码十五综上关键代码如下:s=6;/记录位置for(i=0;i10;i+

17、)if(i!=s)if(ais)/a6前面空出位置插入ai并删除原位置ai,a6变为a7for(j=9;j(s-1-1);j-)aj+1=aj;aj+1=ai;for(j=i;jas&i(s+1-1);j-)aj+1=aj;aj+1=ai;for(j=i;j9;j+)/for循环,执行删除aj=aj+1;/依次后面替换前面的s-;代码十六上面的代码可能比较长,找出共同点,优化一下代码:s=6;/记录位置for(i=0;i10;i+)if(i!=s)isp=0;if(ais)/a6前面空出位置插入ai并删除原位置ai,a6变为a7h=s-1;isp=1;s+;else if(aias&i(h-1);j-)aj+1=aj;aj+1=ai;for(j=i;j9;j+)/for循环,执行删除aj=aj+1;/依次后面替换前面的代码十七最终我们可以整理出其C语言代码:二、计算方法

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

当前位置:首页 > 教育专区 > 教案示例

本站为文档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