西工大C语言期末大作业.pdf

上传人:修**** 文档编号:75982901 上传时间:2023-03-06 格式:PDF 页数:22 大小:1.11MB
返回 下载 相关 举报
西工大C语言期末大作业.pdf_第1页
第1页 / 共22页
西工大C语言期末大作业.pdf_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《西工大C语言期末大作业.pdf》由会员分享,可在线阅读,更多相关《西工大C语言期末大作业.pdf(22页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、学院班级学号姓名目录1 摘要.31.1 设计题目.31.2 设计内容.31.3 开发工具.31.4 应用平台.42 详细设计.42.1 程序结构.42.2 主要功能.92.3 函数实现.112.4 开发日志.163 程序调试及运行.163.1 程序运行结果.163.2 程序使用说明.183.3 程序开发总结.184 附件(源程序).18Email:.cn21 1 摘要摘要1.1 设计题目折半法查找演示程序1.2 设计内容本程序是一个演示折半查找算法的演示程序。由用户输入查找的数据表列和查找的数据,系统在将数表排序后可以在屏幕上演示在排序后的表列中按折半查找法查找该数据的具体过程(通过每次查找的

2、中间数据、下次查找表列等,具体效果见下图),支持多次演示、错误提醒,程序暂停演示功能。1.3 开发工具CodeBlocksEmail:.cn31.4 应用平台Windows 2000/XP/Vista 32位2 2 详细设计详细设计2.1 程序结构程序功能模块:程序功能模块:本程序主要由五大模块组成:程序说明模块、输入模块、排序模块、折半法查找及显示模块、进程选择模块。各模块的主要功能如下:程序说明模块程序说明模块:给使用者营造一个较为友好的界面,同时提供程序开发人员的相关信息以及程序操作的相关说明信息。此部分模块主函数源代码如下:int aN;/*存储要查找的数表,用户输入*/int i,n

3、,num,count;/*count 为折半次数计数器,n 为数表数据个数,num 存储所查数据*/int top,bottom,mid;char c;/*存储选择函数中的输入的字符y 或 n*/int flag=1;/*折半法循环标志变量*/int loc=-1;/*存储所查找数据位置*/double k=0;p_s(76);puts(n);/*引用 p_s 函数,打出一行*/(p_s 函数位于 print_star.cpp文件中,参见下文)printf(欢迎使用折半查找法演示器n);puts(n);/*程序欢迎语*/p_s(13);printf(制作者:吴辉);/*作者信息*/p_s(11

4、);puts(n);p_s(76);puts(n);/*再次引用 p_s 函数,程序说明部分结束*/附:void p_s(int k)Email:*.cn4int i;for(i=1;i=k;i+)/*连续输出 k 个*/printf(*);输入模块输入模块:引导使用者输入要在其中查找数据的数表的数据个数和数表数据。并通过一个judge 函数判断输入是否合法,若不合法提醒用户继续输入。此部分模块主函数源代码如下:printf(请输入你想要在其中查找数据的数据表列的数据个数(1-50):n);/scanf(%d,&n);n=judge(n);/*引用 judge 函数,判断 n 值是否合法*/(

5、judge 函数位于 judge.cpp 文件,参见下文)printf(请输入你要在其中查找数据的数据表列(%d 个数据 用空格间隔 大小排序不限):n,n);/*输入要查找的 n 个数据*/for(i=0;i=n-1;i+)scanf(%d,&ai);/*将要查找的 n 个数据存入数组 a*/QuickSort(a,n);/*引用 QuickSort 函数,将数表排序*/printf(n 输出表列(从小到大排列)n);附:int judge(int n2)/*函数作用:判断 n2 的值是否在 150 范围内*/int n3;while(n250)printf(你输入的数不正确,请重新输入。n

6、);printf(请输入你想要在其中查找数据的数据表列的数据个数(1-50):n);/*不合法重新输入并传递给主函数*/scanf(%d,&n3);return n3;return n2;排序模块排序模块:将用户输入数表的按升序利用快速排序法排列并输出,为接下来的折半法查找做准备。此部分模块主要通过 QuickSort 函数实现此部分模块主函数源代码如下:void QuickSort(int A,int s,int m)/*函数作用:将数组A的元素按从下到大顺序快速排序*/int x,y,z;if(sm)Email:*.cn5x=s;y=m+1;while(1)while(x+1s+m&A+x

7、-1&A-yAs);if(x=y)break;z=Ax,Ax=Ay,Ay=z;z=As,As=Ay,Ay=z;QuickSort(A,s,y-1);QuickSort(A,y+1,m);折半法查找及显示模块:提醒用户输入要查找的数据并判断是否合法。若合法则进入折半法查找循环,在每次折半法查找过程中输出数表中间数据、查找数据与该数据的大小关系、下次再左还是右部分查找,并输出该次折半法后要查找的数表的,用来演示折半法的查找过程,并在每次折半过程中设定程序暂停一次,方便演示,最后输出该数据在排序后数表的位置,然后进入进程选择模块;若非法,则输出“这个数在表列中没有找到”,然后进入进程选择模块。此部分

8、模块主函数源代码如下:r_s:printf(请你输入要查找的数:n);/*输出要查找的数据*/scanf(%d,&num);count=0;/*折半次数计数器初值赋 0*/flag=1;top=n-1;bottom=0;mid=(top+bottom)/2;while(flag)count+;/*折半次数计数器自加 1*/if(numatop)|(numnum)printf(第%d 次折半n,count);/*利用折半次数计数器和循环显示每次折半查找后的表列*/printf(中间数据为%dn,amid);/*输出此次折半后中间数据*/printf(因为%d%d,num,amid);/*说明下步

9、折半查找原因*/printf(所以在左半部分查找n折半后查找数表为:n);top=mid-1;mid=(top+bottom)/2;putout(a,bottom,top);/*引用 putout 函数,输出该次折半后数表*/system(pause);else if(amid%d,num,amid);/*说明下步折半查找原因*/printf(所以在右半部分查找n折半后查找数表为:n);bottom=mid+1;mid=(top+bottom)/2;putout(a,bottom,top);Email:*.cn7/*引用 putout 函数,输出该次折半后数表*/system(pause);i

10、f(loc=-1)printf(%d 这个数在表列中没有找到。n,num);/*若查找数据非法,提示查找错误*/printf(请重新输入要查找的数据n);goto r_s;/*利用 goto 语句转职 r_s 语句重新查找*/此段函数会用到 putout 函数,因上文已经提到,在此不做赘述。进程选择模块进程选择模块:通过判断用户输入的字符决定程序下一步的走向,若为“y”则进入下一次折半法查找演示过程,若为“n”则进入程序退出模块。此部分模块主函数源代码如下:c_e:fflush(stdin);/*利用 fflush 语句清除按键缓存*/printf(请选择是否继续查找n);printf(是y,

11、否nn);/*选择步骤操作说明*/c=getchar();if(c!=y&c!=n)printf(选择错误!);/*若选择错误,继续选择*/goto c_e;elseif(c=y)goto r_s;/*选择 y,转至 r_s 语句继续查找*/else goto end;/*选择 n,转至 end 语句结束程序*/程序退出模块程序退出模块:与程序说明模块呼应,友好的退出程序。此部分模块源代码如下:end:printf(程序结束n);system(pause);Email:*.cn8printf(谢谢使用,再见!n);for(k=0;k1.9e8;k+)/*延时程序*/;exit(0);/*利用

12、exit 语句退出主函数*/2.2 主要功能本程序的主要功能是演示折半法在一组升序排列的数表中查找某个数据的查找过程,同时兼有数表排序、多次演示、错误提醒等功能。各功能的实现具体说明如下:演示折半法查找功能演示折半法查找功能:运用计数器的规律和选择、循环结构实现折半法的程序特点,在一般折半法的程序模块上加以改动,增加一个折半次数计数器(程序中用count 变量表示),同时在每次折半的选择结构中加入一个 for 循环语句,输出此次折半后的查找数表,配上相关的 printf 语句、程序暂停语句并输出相关文字说明,就能很好的演示折半法的查找原理和过程。具体参见下图。数表排序功能数表排序功能:通过一个

13、简单的二重循环将无序的数表按升序排列,主要运用快速排序算法。运行效果如下图。Email:*.cn9多次演示功能多次演示功能:通过提示用户做相应的操作,实现程序的多次演示或者退出,提高程序的实用性。程序中主要通过 goto 语句和若干标号的语句实现。此部分程序运行截图如下:错误提醒功能错误提醒功能:判断用户输入的数据及相关操作是否合法,如不合法提醒用户改正,增加了程序德使用性和操作便捷性。主要是通过while 循环和输入输出函数实现。相关运行截图如下:n 值输入错误的错误提醒及修正:Email:.cn10进程选择错误的错误提醒及修正程序暂停功能程序暂停功能:主要运用system(pause)语句

14、和一段延时小程序,增加程序演示时的可操作性和可讲解性。运行效果如下;2.3 函数实现本程序中含有一个主函数,四个子函数以及主函数中若干个起重要作用的函数语句,现将它们的功能、算法、数据结构等说明如下:主函数:主函数:主要思想为:由用户自主输入 n 个数据,将其排序后,在传统折半法的基础上,增加一些必要的输入输出及控制语句,输出不同阶段循环控制变量所决定的数、特征值,伴以相关文字说明,延时折半法的原理过程。再嵌套一些进程控制的语句,达到多次使用的效果。主函数代码及相关说明如下:Email:.cn11p_s(76);puts(n);printf(“欢迎使用折半查找法演示器n);puts(n);p_

15、s(13);printf(制作者:吴辉);p_s(11);puts(n);p_s(76);puts(n);以上为程序说明部分,主要通过程简单的输入输出函数序说明程序功能和操作信息。printf(请输入你想要在其中查找数据的数据表列的数据个数(1-50):n);/scanf(%d,&n);n=judge(n);在此调用 judge 函数,将输入 n 值代入 judge 函数检验是否合法。printf(请输入你要在其中查找数据的数据表列(%d 个数据 用空格间隔 大小排序不限):n,n);/for(i=0;iatop)|(numnum)printf(第%d 次折半n,count);printf(中

16、间数据为%dn,amid);printf(因为%d%d,num,amid);printf(所以在左半部分查找n折半后查找数表为:n);top=mid-1;mid=(top+bottom)/2;putout(a,bottom,top);*system(pause);else if(amid%d,num,amid);printf(所以在右半部分查找n折半后查找数表为:n);bottom=mid+1;mid=(top+bottom)/2;putout(a,bottom,top);*system(pause);if(loc=-1)printf(%d 这个数在表列中没有找到。n,num);printf(

17、请重新输入要查找的数据n);goto r_s;利用 goto 语句(文中绿色部分)和标记语句(文中黄色部分)和循环语句实现进程的控制*Email:*.cn13end:printf(程序结束n);system(pause);printf(谢谢使用,再见!n);for(k=0;k1.9e8;k+)延时程序,延时约二秒;exit(0);利用 exit 语句直接退出主函数c_e:fflush(stdin);fflush 语句清除按键缓存,避免程序进程混乱printf(请选择是否继续查找n);printf(是y,否nn);c=getchar();if(c!=y&c!=n)printf(选择错误!);go

18、to c_e;elseif(c=y)goto r_s;elsegoto end;judgejudge函数函数:参数:n2n3数据交换:导入 main 函数 n 的值,导出 n2 或 n3 的值函数代码及相关说明:int judge(int n2)函数作用:判断 n2 的值是否在 150 范围内int n3;while(n250)printf(你输入的数不正确,请重新输入。n);printf(请输入你想要在其中查找数据的数据表列的数据个数(1-50):n);不合法重新输入并传递给主函数scanf(%d,&n3);return n3;Email:.cn14return n2;合法直接传回主函数pu

19、toutputout 函数:函数:参数:B,m1,m2数据传递:B 导入 aN 的值,m1、m2 视情况而定函数代码及相关说明:void putout(int B,int m1,int m2)函数作用:将数组 B 的第 m1 到 m2 个元素在一行输出int x1;for(x1=m1;x1=m2-1;x1+)printf(%6d,Bx1);printf(%6dn,Bx1);QuickSortQuickSort 函数:函数:参数:A,s,m;数据传递:A导入 aN,然后导出,s 导入 s 的值,m 导入 m 的值函数代码及相关说明:void QuickSort(int A,int s,int m

20、)函数作用:将数组A 的元素按从下到大顺序快速排序int x,y,z;if(sm)x=s;y=m+1;while(1)while(x+1s+m&A+x-1&A-yAs);if(x=y)break;z=Ax,Ax=Ay,Ay=z;z=As,As=Ay,Ay=z;QuickSort(A,s,y-1);QuickSort(A,y+1,m);p_sp_s 函数:函数:参数:kEmail:.cn15代码及相关说明:#includevoid p_s(int k)int i;for(i=1;i=k;i+)printf(*);函数作用:连续输出 k 个*2.4 开发日志程序开发从构思到完成共历时二十天左右,基

21、本过程如下:6.46.7开始基本构思,考虑大体的程序算法,并分段编写、调试部分程序。6.76.9编写主要程序,并且不断调试,直至达到了最基本的折半法演示功能。6.96.13完善演示功能,加入更多的描述性语句和控制语句,使程序基本达到了如今程序演示折半法的效果。6.136.15加入了程序说明模块和程序退出模块,完善了程序的引导性说明信息,完善程序的可操作性。6.16接受同学的意见,加入了进程选择模块,使程序可以多次演示。加入system 语句,使演示过程中可以暂停,使演示效果优化。6.18总体调试检查程序。6.20完成开发报告。3 3 程序调试及运行程序调试及运行3.1 程序运行结果程序开始运行

22、:排序模块结束:Email:*.cn16多次执行折半查找及显示模块:执行进程选择模块和程序退出模块:Email:.cn173.2 程序使用说明本程序使用较为简单,只需要按照程序提示做符合要求的操作,就可以完成折半法演示的功能,若不小心做了错误的操作,在程序允许的范围内可以重新操作,因此要仔细阅读程序说明部分和运行中的相关提示,按要求操作。另外,在程序演示过程中有很多暂停语句,用户只要按任意键就可继续运行。3.3 程序开发总结通过这次程序开发,我对程序员有了更深刻的认识。我意识到程序员不仅要有过人的思维,还要有足够的耐心,以及合作的意识、独立解决困难的意识。通过这次程序开发,我明白了网络对与学习

23、,特别是程序设计方面的巨大推动作用,通过上网搜索,我基本了解了 system、exit、fllush 等语句的一些用法,还知晓了很多有用的网站,以后在学习中我会更多的利用它们。通过这次程序开发,我明白了创造性工作的魅力,虽然这段时间经常在数字化一待就是几个小时,但看着程序在自己手里不断完善,心里有说不出的喜悦。创造性的工作更能激发我们的热情。通过这次程序开发,我明白了自己有很多的不足,程序也有缺陷,但这本来就是一个不断尝试、不断完善的过程,有了这次的体验,以后我会在这条路上走的更远。4 4 附件(源程序)附件(源程序)#include#include#include#define N 51in

24、t judge(int n2);void QuickSort(int A,int s,int m);void putout(int B,int m1,int m2);void p_s(int k);int main()Email:*.cn/*声明 judge 函数*/*声明 QuickSort 函数*/*声明 putout 函数*/*声明 p_s 函数*/18int aN;/*存储要查找的数表,用户输入*/int i,n,num,count,s,m;/*count 为折半次数计数器,n 为数表数据个数,num 存储所查数据*/int top,bottom,mid;char c;/*存储选择函数

25、中的输入的字符y 或 n*/int flag=1;/*折半法循环标志变量*/int loc=-1;/*存储所查找数据位置*/double k=0;p_s(76);puts(n);/*引用 p_s 函数,打出一行*/printf(欢迎使用折半查找法演示器n);puts(n);/*程序欢迎语*/p_s(13);printf(制作者:吴辉);/*作者信息*/p_s(11);puts(n);p_s(76);puts(n);/*再次引用 p_s 函数,程序说明部分结束*/printf(请输入你想要在其中查找数据的数据表列的数据个数(1-50):n);scanf(%d,&n);n=judge(n);/*引

26、用 judge 函数,判断 n 值是否合法*/printf(请输入你要在其中查找数据的数据表列(%d 个数据 用空格间隔 大小排序不限):n,n);/*输入要查找的 n 个数据*/for(i=0;iatop)|(numnum)printf(第%d 次折半n,count)/*利用折半次数计数器和循环显示每次折半查找后的表列*/printf(中间数据为%dn,amid);/*输出此次折半后中间数据*/printf(因为%d%d,num,amid);/*说明下步折半查找原因*/printf(所以在左半部分查找n折半后查找数表为:n);top=mid-1;mid=(top+bottom)/2;puto

27、ut(a,bottom,top);/*引用 putout 函数,输出该次折半后数表*/system(pause);else if(amid%d,num,amid);/*说明下步折半查找原因*/printf(所以在右半部分查找n折半后查找数表为:n);bottom=mid+1;mid=(top+bottom)/2;putout(a,bottom,top);/*引用 putout 函数,输出该次折半后数表*/system(pause);if(loc=-1)printf(%d 这个数在表列中没有找到。n,num);/*若查找数据非法,提示查找错误*/printf(请重新输入要查找的数据n);goto

28、 r_s;/*利用 goto 语句转至 r_s 语句重新查找*/end:printf(程序结束n);system(pause);printf(谢谢使用,再见!n);for(k=0;k1.9e8;k+)/*延时程序*/;exit(0);/*利用 exit 语句退出主函数*/Email:*.cn20c_e:fflush(stdin);/*利用 fflush 语句清除按键缓存*/printf(请选择是否继续查找n);printf(是y,否nn);/*选择步骤操作说明*/c=getchar();if(c!=y&c!=n)printf(选择错误!);/*若选择错误,继续选择*/goto c_e;else

29、if(c=y)goto r_s;/*选择 y,转至 r_s 语句继续查找*/else goto end;/*选择 n,转至 end 语句结束程序*/void p_s(int k)int i;for(i=1;i=k;i+)printf(*);void putout(int B,int m1,int m2)/*函数作用:将数组 B 的第 m1 到 m2 个元素在一行输出*/int x1;for(x1=m1;x1=m2-1;x1+)printf(%6d,Bx1);printf(%6dn,Bx1);int judge(int n2)/*函数作用:判断 n2 的值是否在 150 范围内*/int n3;

30、while(n250)printf(你输入的数不正确,请重新输入。n);printf(请输入你想要在其中查找数据的数据表列的数据个数(1-50):n);/*不合法重新输入并传递给主函数*/scanf(%d,&n3);return n3;Email:*.cn21void QuickSort(int A,int s,int m)/*函数作用:将数组 A 的元素按从下到大顺序快速排序*/int x,y,z;if(sm)x=s;y=m+1;while(1)while(x+1s+m&A+x-1&A-yAs);if(x=y)break;z=Ax,Ax=Ay,Ay=z;z=As,As=Ay,Ay=z;QuickSort(A,s,y-1);QuickSort(A,y+1,m);Email:*.cn22

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

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

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