还剩18页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
科信学院课程设计说明书(2012/2013学年第二学期)课程名称软件综合算法设计题目数制转换问题专业班级学生姓名学号指导教师设计周数2周设计成绩2013年7月2日目录TOC\o1-3\u
一、实验目的-2-
二、实验要求及目标-2-
三、算法思想-3-1、用数组实现该问题-3-2、用栈实现该问题-3-
四、模块划分-3-1、用数组实现该问题-3-2、用栈实现该问题-4-
五、数据结构-4-1、用数组实现该问题-4-2、用栈实现该问题-4-
六、程序源代码及结果-5-
(一)数组-5-
1、源代码-5-
2、运行结果-8-
(二)栈-10-
1、源代码-10-
2.运行结果-15-
七、心得体会-17-【____】-19-软件综合算法设计报告实验名称数值转换问题指导老师杨荣爱组员1黄静南学号110212203组员2赵兴凡学号110212216完成时间2013年7月2日
一、实验目的了解并掌握软件算法设计的方法与步骤,具备初步的__分析问题、解决问题的能力初步掌握软件__过程的问题分析、系统设计、程序编码和测试等基本方法和技能积累项目设计及程序调试、测试的经验,提高综合运用所学的理论知识和方法,锻炼__分析和解决问题的能力训练用系统的观点和软件__一般规范进行软件的__,培养软件工__所具备的科学工作方法和作风
二、实验要求及目标要求任意给定一个M进制的数x,请实现如下要求1求出此数x的10进制值(用MD表示);2实现对x向任意的一个非M进制的数的转换;3至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解决)目标完成实验要求,实现源代码的运行,进而实现要求中的基本功能
三、算法思想1、用数组实现该问题DTOM函数和MTOD函数是实现该问题的主要函数 DTOM函数是实现十进制转换为其它进制的函数,它是将输入的十进制数x取首先对需要转换的进制M取余,然后再对其取整,接着通过递归调用DTOM函数依次将得到的整数部分依次先取余后取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果而MTOD函数则是实现其他进制M转换为十进制,并将其转换为非M进制的数M进制转十进制则是从该M进制数的最后一位开始算,依次列为第0、1、2…n位并分别乘以M的0、1、2…n次方,将得到的次方相加便得到对应的十进制数,再调用DTOM函数将其转换为非M进制的数2、用栈实现该问题同样是利用DTOM和MTOD两个函数实现两个函数的思想同利用数组实现时相同只是栈具有后进先出的性质,故其用Pop取数较数组的逆向取数方便些
四、模块划分1、用数组实现该问题⑴ ijynsmrreminderx是定义的全局变量,初始值都为0;⑵ DTOMintginth是实现十进制数转换为M进制数的函数;⑶ MTOD是实现M仅指二进制数和八进制数进制数转换为十进制数的函数,并在其中调用DTOMintginth实现向非M进制数的转换;⑷ HTODintf是实现十六进制数转换为十进制数的函数,并在其中调用DTOMintginth实现向非十六进制数的转换;⑸ void__in是主函数,功能是给出测试的数据,并在特定条件下调用DTOM函数和MTOD函数2、用栈实现该问题⑴ SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量;⑵ intInitStackSqStackS到intDestroyStackSqStackS六大模块分别表示构造一个空栈、用e表示栈元素、插入元素、删除元素、判断栈是否为空以及摧毁栈;⑶ SqStackS是指定义栈S;⑷ DTOMintaintb的功能是将十进制数转换成M进制的函数;⑸ MTOD的功能是M进制转换为十进制的函数;⑹ void__in是主函数其功能是输入需要测试的数据以及需要转换的进制,并在特定情形下调用DTOM函数和MTOD函数,而且实现M进制数向任意非M进制数的转换
五、数据结构1、用数组实现该问题使用简单一维数组inta[N],intb[N],intc[N]2、用栈实现该问题 数据类型定义如下 typedefstruct{int*base;int*top;intstacksize;}SqStack;
六、程序源代码及结果
(一)数组
1、源代码#includestdio.h#include__th.h#defineN1000intijyns;intmrreminder;intx; //全局变量默认初始化为0,不必再赋0了DTOMintginth //十进制数转换为其他进制数{intc[N];i=0;reminder=g%h;g=g/h;ifreminder9{c[i]=reminder+55;i++;}else{c[i]=reminder;i++;}ifg0DTOMgh;forj=i-1;j=0;j--ifc[j]=65printf%cc[j];elseprintf%dc[j];return0;}MTODinte//二进制和八进制数转换为十进制数并这转换为其他进制数{inta[N];printf请输入%d进制位数:m;scanf%dn;printf请输入%d进制的每位并使每位用空格隔开:m;fori=0;in;i++scanf%da[i];fori=n-1;i=0;i--{y+=intpowej*a[i];//强制类型转换,以免造成数据丢失j++;}printf请输出所得的10进制的结果:;printf%dy;printf\n需要转换的进制M:;scanf%ds;printf请输出转换成%d进制的结果:s;DTOMys;return0;}HTODintf//十六进制数转换为十进制数,并转换为其他进制数{intb[N];printf请输入%d进制位数:m;scanf%dn;printf请输入%d进制的每位并使每位用空格隔开:m;fori=0;in;i++scanf%xb[i];fori=n-1;i=0;i--{y+=intpowfj*b[i];//强制类型转换,以免造成数据丢失j++;}printf请输出所得的10进制的结果:;printf%dy;printf\n需要转换的进制M:;scanf%ds;printf请输出转换成%d进制的结果:s;DTOMys;return0;}void__in{printf请给定一个需转换的进制M2or8or10or16:;scanf%dm;ifm==2||m==8//二进制和八进制转换成十进制MTODm;elseifm==16//十六进制转换成十进制HTODm;elseifm==10//十进制转换成其它进制{printf请输入一个%d进制数:m;scanf%dx;printf请输入需要转换成的进制M2or8or16:;scanf%dr;printf请输出转换成%d进制的结果:r;DTOMxr;}printf\n;}
2、运行结果图1-1图1-2图1-3图1-4
(二)栈
1、源代码#includestdio.h#include__lloc.h#includestdlib.h#include__th.h#defineSTACK_INIT_SIZE100//存储空间初始分配量#defineSTACKINCREMENT10//存储空间分配增量intemxst;//x为要转换的十进制数,e为临时用的的int型变量intryin;typedefstruct{int*base;//栈底int*top;//栈顶intstacksize;//栈容量}SqStack;intInitStackSqStackS{//构造一个空栈S.base=int*__llocSTACK_INIT_SIZE*sizeofint;if!S.baseexit0;//存储空间失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;return0;}intGetTopSqStackSinte{//若栈不为空,则用e返回S的栈顶元素,并返回0,否则返回1ifS.top==S.basereturn1;e=*S.top-1;return0;}intPushSqStackSinte{//插入元素e为新的栈顶元素ifS.top-S.base=S.stacksize{//栈满,追加存储空间S.base=int*reallocS.baseS.stacksize+STACKINCREMENT*sizeofint;if!S.basereturn1;//存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return0;}intPopSqStackSinte{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回0,否则返回1ifS.top==S.basereturn1;e=*--S.top;return0;}intStackEmptySqStackS{//若栈空,则返回1,否则返回0ifS.top==S.basereturn1;return0;}intDestroyStackSqStackS{//销毁栈S,栈S不再存在freeS.base;S.top=NULL;//防止程序后面不小心使用了它S.base=S.top;return0;}SqStackS;//定义栈SDTOMintaintb//十进制转换成其他进制的函数D2M{whilea{r=a%b;ifr9r=r+55;PushSr;//压入栈a/=b;//转换成M进制}printf该数转换成%d进制的结果:b;while!StackEmptyS{PopSe;//弹出栈ife=65printf%ce;elseprintf%de;}return0;}MTOD//其他进制转换为十进制的函数M2D{charc
[1000];printf请输入需要转换的数的位数:;scanf%dn;printf请输入需要转换的数的每位并用空格隔开:;fori=0;in;i++{scanf%xc[i];PushSc[i];}i=0;while!StackEmptyS{PopSe;y+=intpowmi*e;i++;}printf转换成10进制的结果是:;printf%dy;return0;}void__in{InitStackS;//构造一个空栈printf请输入需要转换的进制M2or8or10or16:;scanf%dm;ifm==10//十进制转换成其他进制{printf请给定一个需要转换的10进制数:;scanf%dx;printf请输入需要转换成的进制数:;scanf%dt;DTOMxt;}ifm==2||m==8||m==16//其他进制转换成十进制,且其他任意进制的相互转换{MTOD;printf\n给定要转换成的进制M:;scanf%ds;DTOMys;}printf\n;DestroyStackS;//销毁栈S,栈S不再存在}
2.运行结果图2-1图2-2图2-3图2-4
七、心得体会组员一(黄静南)通过这次软件算法设计,我对研究算法设计的重要性有了更加深刻的认知,算法的选择对解决实际问题的效率有很大的影响,实验使我对设计思想有了更加深刻的理解,对以后的实验解决方案有了更多的选择,开阔了我的设计思路软件算法设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程在实验设计过程中,我还发现了很多学习中的盲点,上理论课时认为已经理解的在程序中运行起来又是另一回事,所以实践与理论结合是学习中非常重要的,尤其是在软件设计方面随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在而计算机应用与编程相互依存,在学好基础的情况下增加实践是最好的选择经过这一次两周完整的成功的编程练习,对我产生的莫大的激励,也让我对编程有了更大的兴趣这次的软件算法设计对我们的锻炼很大,让我们学到了老师没法交给我们的,也让我们明白程序设计的大体步骤,让我们对我们的专业又有更进一步的了解我不仅体会到自己解决问题的乐趣,也体验到了同学合作的美好两周时间说长不长,说短也不短,我们不停地翻阅资料和讨论,有过迷茫有过喜悦,不过最后我们终于成功了!满足感油然而生,如果有人问我物质和精神哪个更让人满足,那答案一定是精神,那种感觉只有自己体会了才能懂总之,这次设计程序让我受益良多,我很珍惜像这种难得的机会组员二(赵兴凡)通过这次实验设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和__思考的能力在设计的过程中遇到问题,这毕竟__做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固__自主固然重要,但是分工合作也必不可少通过这次与同学的合作,了解到自身的不足,与同伴做到了互补我们选的题目看着简单,但是做起来很难,虽然刚学完数据结构,期间还是遇到了很多问题程序不是一气呵成的,需要一点一点的修改补充,直到可以成功运行出需要的功能这次课程设计给了我以后编程莫大的激励,因为我认为所谓算法通过老师的传授每个人都只会一点点,而课外的东西需要自己去学习仅靠自己学的那些基础知识是无法编程的,需要融会贯通并且熟练运用这段时间虽然很不好受,但是我体会到了编程的乐趣,这使我对自己有了信心这学期学的数据结构也起到了很大的作用,有了数据结构的只是,加上程序设计技术则对以后对计算机技术的深入学习应该会有很大的帮助最后,感谢各位老师的教导,感谢老师给我们这次实践的机会____
[1] 严蔚敏,吴伟民数据结构(C语言版)清华大学出版社,2007
[2]陈良银,游洪跃,李伟旭C语言程序设计(C99版)清华大学出版社,2006(2007重印)
[3]谭浩强C++程序设计(第二版)清华大学出版社,
2011.8课程设计评语课程设计成绩指导教师(签字)年月日。