《2022年数制转换问题借鉴 .pdf》由会员分享,可在线阅读,更多相关《2022年数制转换问题借鉴 .pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据结构课程设计题 目 名 称: 数 制 转 换 问 题课 程 名 称:数 据 结 构学 生 姓 名:学号:学 院 名 称:指 导 教 师:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 19 页 - - - - - - - - - 目录一需求分析 二概要设计 三详细设计四调试测试五总结名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 19 页 - -
2、 - - - - - - - 一需求分析应用环境设定:生活中我们需要将M 进制的数转换为我们所需要的进制,从键盘任意输入一个M 进制的数,对其进行转换成其他三种进制的数,然后再从电脑中显示出来,最终得到我们的结果。用户界面:命令行界面,根据自己的要求, 对界面的提示进行操作,正确输入我们需要的数据。输入方式:首先输入将转换的进制数,回车确认;然后输入确定的数据,回车确认;接着选择要转换为的进制数,回车确认。输出方式: 界面直接输出, 启动程序后, 按照界面提示, 输入数据,直接回车确认,显示屏即输出我们的数据结果。数据储存方式:全部在内存存放,不使用硬盘上的文件或其他数据源,程序执行过程中和结
3、束后不保存数据。程序功能: 1.根据界面提示输入M 进制数据。2.对任意 M 进制数据实行非M 进制的转换。二概要设计在此说明数据结构设计和关键的算法设计思想1. 用数组实现该问题D2M()函数和 M2D()函数是实现该问题的主要函数。D2M()函数是实现十进制转换为其它进制的函数,它是将输入的十进制数取首先对需要转换的进制M取余,然后再对其取整, 接着通过递归调用D2M()函数依次将得到的整数部分依次先取余后取整,并将所得的余名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,
4、共 19 页 - - - - - - - - - 数依次存入一个数组中, 然后逆向取出数组中的元素, 即得到转换后的结果。而 M2D()函数则是实现其他进制M转换为十进制,并将其转换为非 M进制的数。 M进制转十进制则是从该M进制数的最后一位开始算,依次列为第、位并分别乘以M的、次方,将得到的次方相加便得到对应的十进制数,再调用D2M()函数将其转换为非 M进制的数。i,j,y,n,s,m,r,reminder,x是定义的全局变量,初始值都为;D2M(int g,int h)是实现十进制数转换为M进制数的函数;M2D(int e) 是实现 M(仅指二进制数和八进制数) 进制数转换为十进制数的函
5、数,并在其中调用D2M(int g,int h)实现向非 M进制数的转换;H2D(int f) 是实现十六进制数转换为十进制数的函数,并在其中调用D2M(int g,int h)实现向非十六进制数的转换;void main()是主函数,功能是给出测试的数据,并在特定条件下调用 D2M()函数和 M2D()函数。使用简单一维数组int aN,int bN, int cN。2. 用栈实现该问题同样是利用 D2M()和 M2D()两个函数实现。两个函数的思想同名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - -
6、 - - - 第 4 页,共 19 页 - - - - - - - - - 利用数组实现时相同。 只是栈具有后进先出的性质, 故其用 Pop()取数较数组的逆向取数方便些。SqStack 定义栈,说明 base 为栈底指针, top 为栈顶指针,stacksize为栈容量;int InitStack(SqStack &S)到 int DestroyStack(SqStack &S)六大模块分别表示构造一个空栈、用表示栈元素、插入元素、删除元素、判断栈是否为空以及摧毁栈;SqStack S 是指定义栈 S;D2M(int a,int b)的功能是将十进制数转换成M进制的函数;M2D()的功能是
7、M进制转换为十进制的函数;void main() 是主函数。其功能是输入需要测试的数据以及需要转换的进制,并在特定情形下调用D2M()函数和 M2D()函数,而且实现 M进制数向任意非 M进制数的转换。数据类型定义如下:typedef struct int *base; 栈底int *top; 栈顶int stacksize;栈容量SqStack; int InitStack(SqStack &S)构造一个个空栈int GetTop(SqStack S, int &e) 若栈不为空,则用 e 返回 S 的栈顶元素,并返回 0,否则返回 1 名师资料总结 - - -精品资料欢迎下载 - - -
8、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 19 页 - - - - - - - - - int Push(SqStack &S , int e) 插入元素 e 为新的栈顶元素int Pop(SqStack &S, int &e) 若栈不空,则删除S的栈顶元素,用e返回其值,并返回0,否则返回 1。1. 程序流程图若 N!=10 若 N=10 开始数组输入需转换的数的进制 N 栈输入需转换的位数输入需转换的数输入将转换的进制数输出结果名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
9、 - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 19 页 - - - - - - - - - 2. 程序源代码A用数组实现(文件名shuzu.cpp )#include #include #define N 1000 int i,j,y,n,s; int m,r,reminder; int x; /全局变量默认初始化为0,不必再赋 0 了D2M(int g,int h) /十进制数转换为其他进制数 int cN; i=0; reminder=g%h; g=g/h; if(reminder9) ci=reminder+55; i+; else 名师资料总结 -
10、 - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 19 页 - - - - - - - - - ci=reminder; i+; if(g0) D2M(g,h); for(j=i-1;j=0;j-) if(cj=65) printf(%c,cj); else printf(%d,cj); return 0; M2D(int e) /二进制和八进制数转换为十进制数,并这转换为其他进制数 int aN; printf( 请输入%d 进制位数 :,m); scanf(%d,&n); printf
11、( 请输入 %d 进制的每位并使每位用空格隔开:,m); for(i=0;i=0;i-) y+=(int)pow(e,j)*ai; /强制类型转换, 以免造成数据丢失j+; printf( 需要转换的进制 M:); scanf(%d,&s); printf( 请输出转换成 %d 进制的结果 :,s); D2M(y,s); return 0; H2D(int f) /十六进制数转换为十进制数,并转换为其他进制数 int bN; printf( 请输入 %d 进制位数 :,m); scanf(%d,&n); printf( 请输入 %d 进制的每位并使每位用空格隔开:,m); for(i=0;i=
12、0;i-) y+=(int)pow(f,j)*bi; /强制类型转换, 以免造成数据丢失j+; printf( 需要转换的进制 M:); scanf(%d,&s); printf( 请输出转换成 %d 进制的结果 :,s); D2M(y,s); return 0; void main() printf( 请给定一个需转换的进制M(2or8or10or16):); scanf(%d,&m); if(m=2|m=8) /二进制和八进制转换成十进制M2D(m); else if(m=16) /十六进制转换成十进制H2D(m); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
13、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 19 页 - - - - - - - - - else if(m=10) /十进制转换成其它进制 printf( 请输入一个 %d 进制数:,m); scanf(%d,&x); printf( 请输入需要转换成的进制M(2or8or16):); scanf(%d,&r); printf( 请输出转换成 %d 进制的结果 :,r); D2M(x,r); printf(n); B用栈实现(文件名zhan.cpp )#include #include #include #include #defin
14、e STACK_INIT_SIZE 100 /存储空间初始分配量#define STACKINCREMENT 10 /存储空间分配增量int e,m,x,s,t; /x 为要转换的十进制数,e 为临时用的的int型变量int r,y,i,n; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 19 页 - - - - - - - - - typedef struct int *base; /栈底int *top; /栈顶int stacksize; /栈容量SqStack
15、; int InitStack(SqStack &S) /构造一个空栈S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int); if(!S.base) exit(0); /存储空间失败S.top=S.base; S.stacksize=STACK_INIT_SIZE; return 0; int GetTop(SqStack S, int &e) /若栈不为空,则用 e 返回 S 的栈顶元素,并返回 0,否则返回 1 if(S.top=S.base) return 1; e=*(S.top-1); return 0; 名师资料总结 - - -精品资料
16、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 19 页 - - - - - - - - - int Push(SqStack &S , int e) /插入元素 e 为新的栈顶元素if(S.top-S.base=S.stacksize) /栈满,追加存储空间S.base=(int *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(int); if(!S.base) return 1 ; /存储分配失败S.top=S.base+S.stacks
17、ize; S.stacksize+=STACKINCREMENT; *S.top+=e; return 0; int Pop(SqStack &S, int &e) /若栈不空,则删除S 的栈顶元素,用 e 返回其值,并返回0,否则返回 1 if(S.top=S.base) return 1; e=*-S.top; return 0; int StackEmpty(SqStack S) /若栈空,则返回 1,否则返回 0 if(S.top=S.base) return 1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精
18、心整理 - - - - - - - 第 13 页,共 19 页 - - - - - - - - - return 0 ; int DestroyStack(SqStack &S) /销毁栈 S,栈 S 不再存在free(S.base); S.top=NULL; /防止程序后面不小心使用了它S.base=S.top; return 0 ; SqStack S; /定义栈 S D2M(int a,int b) /十进制转换成其他进制的函数D2M() while(a) r=a%b; if(r9) r=r+55; Push(S,r); /压入栈a/=b; /转换成 M 进制名师资料总结 - - -精品
19、资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 19 页 - - - - - - - - - printf( 该数转换成 %d 进制的结果 :,b); while(!StackEmpty(S) Pop(S,e); /弹出栈if(e=65) printf(%c,e); else printf(%d,e); return 0; M2D() /其他进制转换为十进制的函数M2D() char c1000; printf( 请输入需要转换的数的位数:); scanf(%d,&n); printf( 请输入需
20、要转换的数的每位并用空格隔开:); for(i=0;in;i+) scanf(%x,&ci); Push(S,ci); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 19 页 - - - - - - - - - i=0; while(!StackEmpty(S) Pop(S,e); y+=(int)pow(m,i)*e; i+; void main() InitStack(S); /构造一个空栈printf( 请输入需要转换的进制M(2or8or10or16):);
21、scanf(%d,&m); if(m=10) /十进制转换成其他进制 printf( 请给定一个需要转换的10 进制数 :); scanf(%d,&x); printf( 请输入需要转换成的进制数:); scanf(%d,&t); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 19 页 - - - - - - - - - D2M(x,t); if(m=2|m=8|m=16) /其他进制转换成十进制,且其他任意进制的相互转换 M2D(); printf( 给定要转换成的
22、进制M:); scanf(%d,&s); D2M(y,s); printf(n); DestroyStack(S); /销毁栈 S,栈 S不再存在 四调试测试1. 十进制数 365 转换二进制数测试结果如下:(图1)图 1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 19 页 - - - - - - - - - 2.十六进制数 1A2B3C转换十进制数测试结果如下:(图2)图 2 3.二进制数 11001100 转换八进制数测试结果如下:(图3)图 3 4.八进制数
23、 1234 转换为十六进制数测试结果如下: (图 4)图 4 五总结此次课程设计与以往不同:第一,时间是比较紧的,从题目分名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 19 页 - - - - - - - - - 配到完成设计不足十天的时间,而且又是即将期末考试的这段时间;第二,人数和以往也不同, 以前都是几个同学一起完成设计,而这次却是每个人单独完成自己的题目,所以人手也是比较紧的;第三,以前的课程设计是最后完成提交就行了,而这次我们必须时刻都提交自己课程设计的进程
24、, 中途随时交给指导老师批阅, 避免同学最后时间才去完成作业的思想。这次课程设计过程中遇见的问题就是2、8、10、16 进制之间的转换。任意进制之间的转换在栈和数组的处理时遇到大于10 的数的处理难题,同时,在进行转换的时候,对于数字的长度处理上,也是遇到了难题的。本次课程设计运用了网络知识,以及向别人请教,查阅资料等解决了算法的难题。从这里我发现,任何一个难题,即使我们碰到一个很大的程序,不知道该如何下手时,只有找多方面的资料,加强思考,这样就能得到意想不到的惊喜。本次做这个数制转换的题目。总体来说不是很难,只需要在细节方面熟练的运用栈、数组。这次课程设计锻炼了我的思维,以及强化了课堂所学的知识,感觉收获很多。相信这对我人生烙下一个深深的印记。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 19 页 - - - - - - - - -