1、 数据结构与算法课程设计数据结构与算法课程设计 说说 明明 书书 学学 院 、 系院 、 系 : 软件学院 专专 业业: 软件工程 学学 生生 姓姓 名:名: xxx 学学 号:号: xxxx 设设 计计 题题 目目: 数制转换问题 起起 迄迄 日日 期期: 2013 年 12 月 9 日- 2013 年 12 月 20 日 指指 导导 教教 师师: xxx 2013 年 12 月 20 日 1 1、 需求分析需求分析 任意给定一个 M 进制的数 x ,请实现如下要求 1) 求出此数 x 的 10 进制值(用 MD 表示) 2) 实现对 x 向任意的一个非 M 进制的数的转换。 3) 用两种方
2、法实现上述要求(用栈解决和用数组解决)。 2 2、概要设计概要设计 流程图 数组的流程图: 开始 执行 main 函数 输入需转换进制的 数字(2or8or10or16) switch()选择功能 选择操作编号 2.退出 exit(0) 1进入转换系统 m=16 m=2| m=8 m=10 2 栈的流程图: MtoD() HtoD() 输入十进制数 DtoM() 输 出 结 果 输 出 结 果 输 出 结 果 开始 执行 main 函数 switch()选择功能 选择操作编号 2.退出 exit(0) 1进入转换系统 InitStack()构造空栈 输入需转换进制的 数字(2or8or10or
3、16) m=2|m=8|m=16 m=10 MtoD() 输入一个十进制数 3 算法思想 、用数组实现该问题: DtoM()函数和 MtoD()函数是实现该问题的主要函数。 DtoM()函数是实现十进制 转换为其它进制的函数, 它是将输入的十进制数取首先对需要转换的进制 M 取余, 然 后再对其取整,接着通过递归调用 DtoM()函数依次将得到的整数部分依次先取余后取 整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后 的结果。而 MtoD()函数则是实现其他进制 M 转换为十进制,并将其转换为非 M 进制的 数。M 进制转十进制则是从该 M 进制数的最后一位开始算,
4、依次列为第、 位并分别乘以 M 的、次方,将得到的次方相加便得到对应的十进制数,再 调用 DtoM()函数将其转换为非 M 进制的数。 、用栈实现该问题: 同样是利用 DtoM()和 MtoD()两个函数实现。两个函数的思想同利用数组实现时相 同。只是栈具有后进先出的性质,故其用 Pop()取数较数组的逆向取数方便些。 模块划分 、用数组实现该问题: i,j,y,n,s,m,r,reminder,x 是定义的全局变量,初始值都为; DtoM(int g,int h)是实现十进制数转换为 M 进制数的函数; MtoD()是实现 M(仅指二进制数和八进制数)进制数转换为十进制数的函数, 并 在其中
5、调用 D2M(int g,int h)实现向非 M 进制数的转换; HtoD(int f)是实现十六进制数转换为十进制数的函数, 并在其中调用 D2M(int g,int h)实现向非十六进制数的转换; void main()是主函数,功能是给出测试的数据,并在特定条件下调用 D2M() DtoM() DtoM() 输出结果 销毁栈 4 函数和 M2D()函数。 、用栈实现该问题: SqStack 定义栈,说明 base 为栈底指针,top 为栈顶指针,stacksize 为栈容 量; int InitStack(SqStack int i=0;int j; int reminder; rem
6、inder=g%h; g=g/h; 5 if(reminder9) ci=reminder+55; i+; else ci=reminder; i+; if(g0) DtoM(g,h); for(j=i-1;j=0;j-) if(cj=65) printf(“%c“,cj); else printf(“%d“,cj); /以下 MtoD()是实现 M(仅指二进制数和八进制数)进制数转换为十进制数的函数, 并在 其中调用 D2M(int g,int h)实现向非 M 进制数的转换 MtoD(int e) /二进制和八进制数转换为十进制数,并这转换为其他进制数 int n,i,y=0,j,s; int aN; printf(“请输入%d 进制位数:“,e); scanf(“%d“, j=0; printf(“请输入%d 进制的每位并使每位用空格隔开:“,e); 6 for(i=n-1;i=0;i-) scanf