《数据结构课程设计--数制转换问题》由会员分享,可在线阅读,更多相关《数据结构课程设计--数制转换问题(16页珍藏版)》请在金锄头文库上搜索。
1、 数据结构与算法课程设计数据结构与算法课程设计 说说 明明 书书学学 院院、系系 :软件学院专专 业业:软件工程学学 生生 姓姓 名:名:xxx学学 号:号:xxxx设设 计计 题题 目目:数制转换问题起起 迄迄 日日 期期:2013 年 12 月 9 日- 2013 年 12 月 20日指指 导导 教教 师师:xxx2013 年 12 月 20 日11、 需求分析需求分析任意给定一个 M 进制的数 x ,请实现如下要求1) 求出此数 x 的 10 进制值(用 MD 表示)2) 实现对 x 向任意的一个非 M 进制的数的转换。 3) 用两种方法实现上述要求(用栈解决和用数组解决)。 2 2、概
2、要设计、概要设计 流程图 数组的流程图:开始执行 main 函数输入需转换进制的 数字 (2or8or10or16)switch()选择功能选择操作编号2.退出 exit(0)1进入转换系统m=16m=2|m=8m=102栈的流程图:MtoD()HtoD()输入十进制数DtoM()输出结 果输出结 果输出结 果开始执行 main 函数switch()选择功能选择操作编号2.退出 exit(0)1进入转换系统InitStack()构造空栈输入需转换进制的 数字 (2or8or10or16)m=2|m=8|m=16m=10MtoD()输入一个十进制数3DtoM()DtoM()输出结果销毁栈算法思想
3、 、用数组实现该问题:DtoM()函数和 MtoD()函数是实现该问题的主要函数。 DtoM()函数是实现十进制转换为其它进制的函数,它是将输入的十进制数取首先对需要转换的进制 M 取余,然后再对其取整,接着通过递归调用 DtoM()函数依次将得到的整数部分依次先取余后取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果。而 MtoD()函数则是实现其他进制 M 转换为十进制,并将其转换为非 M 进制的数。M 进制转十进制则是从该 M 进制数的最后一位开始算,依次列为第、位并分别乘以 M 的、次方,将得到的次方相加便得到对应的十进制数,再调用 DtoM()函数将
4、其转换为非 M 进制的数。、用栈实现该问题:同样是利用 DtoM()和 MtoD()两个函数实现。两个函数的思想同利用数组实现时相同。只是栈具有后进先出的性质,故其用 Pop()取数较数组的逆向取数方便些。模块划分、用数组实现该问题: i,j,y,n,s,m,r,reminder,x 是定义的全局变量,初始值都为; DtoM(int g,int h)是实现十进制数转换为 M 进制数的函数; MtoD()是实现 M(仅指二进制数和八进制数)进制数转换为十进制数的函数,并在其中调用 D2M(int g,int h)实现向非 M 进制数的转换; HtoD(int f)是实现十六进制数转换为十进制数的
5、函数,并在其中调用D2M(int g,int h)实现向非十六进制数的转换; void main()是主函数,功能是给出测试的数据,并在特定条件下调用 D2M()4函数和 M2D()函数。、用栈实现该问题: SqStack 定义栈,说明 base 为栈底指针,top 为栈顶指针,stacksize 为栈容量; int InitStack(SqStack int i=0;int j;int reminder;reminder=g%h;g=g/h;5if(reminder9)ci=reminder+55;i+;elseci=reminder;i+;if(g0)DtoM(g,h);for(j=i-1
6、;j=0;j-)if(cj=65)printf(“%c“,cj);elseprintf(“%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);6for(i=n-1;i=0;i-)scanf(“%d“,for(i
7、=0;i=0;i-)y+=(int)pow(f,j)*bi; /强制类型转换,以免造成数据丢失j+;7printf(“请输出所得的 10 进制的结果: “);printf(“%d“,y);printf(“n 需要转换的进制 M:“);scanf(“%d“,printf(“请输出转换成%d 进制的结果:“,s);DtoM(y,s);return 0;/ void main()是主函数,功能是给出测试的数据,并在特定条件下调用 DtoM()函数和 MtoD()函数void main()int m,r,x,t;for(;) printf(“ntt* * * * * * - welcome ! - *
8、 * * * * * n“); printf(“tt 数制转换系统 n“); printf(“tt* * * * * * * * * * * * * * * * * * * * * * *n“); printf(“tt n“); printf(“tt* * * * * * * * * * * * * * * * * * * * * * *n“); printf(“tt* 1. 进入数制转换系统 *n“); printf(“tt* 2. 退出该系统 *n“); printf(“tt* * * * * * * * * * * * * * * * * * * * * * *n“); printf(“
9、tt 请选择(12):“); loop:scanf(“%d“, switch(t) case 1:printf(“请给定一个需转换的进制 M(2 or 8 or 10 or 16):“);scanf(“%d“,if(m=2|m=8) /二进制和八进制转换成十进制8MtoD(m);else if(m=16) /十六进制转换成十进制HtoD(m);else if(m=10) /十进制转换成其它进制printf(“请输入一个%d 进制数:“,m);scanf(“%d“,printf(“请输入需要转换成的进制 M(2 or 8 or 16):“);scanf(“%d“,printf(“请输出转换成%d
10、 进制的结果:“,r);DtoM(x,r);printf(“n“); break;case 2: exit(0); default: printf(“输入有误,请重新选择:“); goto loop; printf(“n“);文件 stack.cpp#include#include#include#include#define STACK_INIT_SIZE 100 /存储空间初始分配量#define STACKINCREMENT 10 /存储空间分配增量int e,m,x,s,t; /x 为要转换的十进制数,e 为临时用的的 int 型变量9int r,y,i,n;typedef struc
11、t int *base; /栈底int *top; /栈顶int stacksize; /栈容量SqStack;/ SqStack 定义栈,说明 base 为栈底指针,top 为栈顶指针,stacksize 为栈容量/*一下为 int InitStack(SqStack if(!S.base) exit(0); /存储空间失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;return 0;int GetTop(SqStack S, int e=*(S.top-1);return 0;int Push(SqStack if(!S.base) return 1
12、; /存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;10*S.top+=e;return 0;int Pop(SqStack e=*-S.top;return 0;int StackEmpty(SqStack S) /若栈空,则返回 1,否则返回 0if(S.top=S.base)return 1;return 0 ;int DestroyStack(SqStack S.top=NULL; /防止程序后面不小心使用了它S.base=S.top;return 0 ;/以下 SqStack S 是指定义栈 SSqStack S
13、; /定义栈 S/ 下面的 D2M(int a,int b)的功能是将十进制数转换成 M 进制的函数DtoM(int a,int b) /十进制转换成其他进制的函数 DtoM()while(a)r=a%b;if(r9)11r=r+55;Push(S,r); /压入栈a/=b; /转换成 M 进制printf(“该数转换成%d 进制的结果:“,b);while(!StackEmpty(S)Pop(S,e); /弹出栈if(e=65)printf(“%c“,e);elseprintf(“%d“,e);return 0;/ 下面是 MtoD(),它的功能是 M 进制转换为十进制的函数MtoD() /
14、其他进制转换为十进制的函数 MtoD()char c1000;printf(“请输入需要转换的数的位数:“);scanf(“%d“,printf(“请输入需要转换的数的每位并用空格隔开:“);for(i=0;in;i+)scanf(“%x“,Push(S,ci);i=0;while(!StackEmpty(S)12Pop(S,e);y+=(int)pow(m,i)*e;i+;printf(“转换成 10 进制的结果是:“);printf(“%d“,y);return 0;/void main()是主函数。其功能是输入需要测试的数据以及需要转换的进制,并在特定情形下调用 DtoM()函数和 MtoD()函数,而且实现 M 进制数向任意非 M 进制数的转换void main()int t;for(;) printf(“tt* * * * * * - welcome ! - * * * * * * n“); printf(“tt 数制转换系统 n“); printf(“tt* * * * * * * * * * * * * * * * * * * * * * *n“); printf(“tt