数制转换数据结构课程设计报告.docx
- 文档编号:28003965
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:18
- 大小:302.25KB
数制转换数据结构课程设计报告.docx
《数制转换数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数制转换数据结构课程设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
数制转换数据结构课程设计报告
《数据结构》
课程设计报告书
题目:
数制转换
系别:
计算机科学与应用系
学号:
学生姓名:
指导教师:
完成日期:
2013—6—1
数制转换
1.需求分析
任意给定一个M进制的数x,实现如下要求
1)求出此数x的10进制值(用MD表示)
2)实现对x向任意的一个非M进制的数的转换。
3)至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解决)。
2.概要设计
程序流程可以用以下流程图来刻画:
A用数组实现B用栈实现
开始
构造数组
数制转换函数
输出结果
开始
创建栈
数制转换函数
输出结果
3.详细设计
A.用数组实现该问题
D2M()函数和M2D()函数是实现该问题的主要函数。
D2M()函数是实现十进制转换为其他进制的函数,它是将输入的十进制数x首先对需要转换的进制M取余,然后在对其取整,接着通过递归调用D2M()函数一次将得到的整数部分一次先取余后取整,并将所得的余数依次存入下一数组,然后逆向去除数组中的元素,即得到转换后的结果。
而M2D()函数是实现其他进制M转换为十进制,并将其转换为非M进制。
M进制转十进制则是从该M进制数的最后一位开始运算,依次列为第0、1、2、……..N位并分别乘以M的0、1、2、…..N次方,将得到的次方相加便得到对应的十进制数,再调用D2M()函数将其转换为非M进制的数。
B.用栈实现
栈具有后进先出的性质,具体实现方法和数组的方法有很大联系,不再过多解释。
4.调试分析
(1)构造栈的方法通过查阅书籍知道了。
(2)数组的递归调用查阅相关书籍了解了。
(3)为了让界面表达更清晰,多次调试完善了界面。
5.测试结果
下面是我的测试函数及运行结果:
A.数组测试结果
B栈实现测试结果
6.总结
通过《数据结构》课程设计,我了解到数据结构是计算机科学中一门综合性的专业基础课。
这次的课程设计使我对数组及栈有了初步的认识,虽然课程设计的不完善,但是在设计过程中我受益匪浅,通过查资料、网上搜索例子,让我学到了很多以前不知道的东西,提高我的分析和解决问题的能力,进一部掌握了应用系统设计的方法和不步骤,,也让我意识到自己所掌握的实在是太少了,只靠课本知识是不够的,应该多多上机调试,这样才能提高自己。
7.附源程序
A.数组实现
#include
#include
#defineN1000
inti,j,y,n,s;
intm,r,reminder;
intx;//全局变量默认初始化为0,不必再赋0了
D2M(intg,inth)//十进制数转换为其他进制数
{
intc[N];
i=0;
reminder=g%h;
g=g/h;
if(reminder>9)
{
c[i]=reminder+55;
i++;
}
else
{
c[i]=reminder;
i++;
}
if(g>0)
D2M(g,h);
for(j=i-1;j>=0;j--)
if(c[j]>=65)
printf("%c",c[j]);
else
printf("%d",c[j]);
return0;
}
M2D(inte)//二进制和八进制数转换为十进制数,并这转换为其他进制数
{
inta[N];
printf("请输入%d进制位数:
",m);
scanf("%d",&n);
printf("请输入%d进制的每位并使每位用空格隔开:
",m);
for(i=0;i scanf("%d",&a[i]); for(i=n-1;i>=0;i--) { y+=(int)pow(e,j)*a[i];//强制类型转换,以免造成数据丢失 j++; } printf("请输出所得的10进制的结果: "); printf("%d",y); printf("\n需要转换的进制M: "); scanf("%d",&s); printf("请输出转换成%d进制的结果: ",s); D2M(y,s); return0; } H2D(intf)//十六进制数转换为十进制数,并转换为其他进制数 { intb[N]; printf("请输入%d进制位数: ",m); scanf("%d",&n); printf("请输入%d进制的每位并使每位用空格隔开: ",m); for(i=0;i scanf("%x",&b[i]); for(i=n-1;i>=0;i--) { y+=(int)pow(f,j)*b[i];//强制类型转换,以免造成数据丢失 j++; } printf("请输出所得的10进制的结果: "); printf("%d",y); printf("\n需要转换的进制M: "); scanf("%d",&s); printf("请输出转换成%d进制的结果: ",s); D2M(y,s); return0; } voidmain() { printf("请给定一个需转换的进制M(2or8or10or16): "); scanf("%d",&m); if(m==2||m==8)//二进制和八进制转换成十进制 M2D(m); elseif(m==16)//十六进制转换成十进制 H2D(m); elseif(m==10)//十进制转换成其它进制 { printf("请输入一个%d进制数: ",m); scanf("%d",&x); printf("请输入需要转换成的进制M(2or8or16): "); scanf("%d",&r); printf("请输出转换成%d进制的结果: ",r); D2M(x,r); } printf("\n"); } B.栈实现 #include"stdio.h" #include"string.h" #include"math.h" #include"limits.h" #include"stdlib.h" #include"malloc.h" #defineTRUE1 #defineOK1 #defineFALSE0 #defineERROR0 #defineINFEASIBLE-1 typedefintStatus; typedefintSElement; #defineSTACK_INIT_SIZE10 #defineSTACKINCREMENT2 typedefstructSqStack { SElement*base;SElement*top; intstacksize; }SqStack; intInitStack(SqStack*S) { (*S).base=(SElement*)malloc(STACK_INIT_SIZE*sizeof(SElement)); if(! (*S).base) exit(OVERFLOW); S->top=S->base; S->stacksize=STACK_INIT_SIZE; returnOK; } intDestroyStack(SqStack*S) { free(S->base); S->base=NULL; S->top=NULL; S->stacksize=0; returnOK; } intClearStack(SqStack*S) { S->top=S->base; returnOK; } intStackEmpty(SqStackS)//判断sqstack是否为空 { if(S.top==S.base) returnTRUE; else returnFALSE; } intStackLength(SqStackS)//返回s的元素个数,即栈的长度 { returnS.top-S.base; } intGetTop(SqStackS,int*e)//若栈不为空,用e返回s的栈顶元素,返回ok { if(S.top>S.base) { *e=*(S.top-1); returnOK; } elsereturnERROR; } intPush(SqStack*S,inte)//插入元素e为新的栈顶元素 { if(S->top-S->base>=S->stacksize) { S->base=(SElement*)realloc((*S).base,((*S).stacksize+STACKINCREMENT* sizeof(SElement))); if(! S->base) exit(OVERFLOW); S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *(S->top)=e; S->top++; returnOK; } intPop(SqStack*S,int*e) {/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/ if((*S).top==(*S).base) returnERROR; *e=*--(*S).top; returnOK; } intStackTraverse(SqStackS,int(*visit)(int))// { while(S.top>S.base) visit(*S.base++); printf("\n"); returnOK; } voidconversion8(SqStacks) { unsignedn; inte; InitStack(&s);//初始化栈 printf("n(>=0)="); scanf("%u",&n); while(n)//当n不为0 { Push(&s,n%8); n=n/8; } while(! StackEmpty(s))//当栈不为空 { Pop(&s,&e); printf("%d",e); } printf("\n"); } voidconversion2(SqStacks) { unsignedn; inte; InitStack(&s);//初始化栈 printf("n(>=0)="); scanf("%u",&n); while(n)//当n不为0 { Push(&s,n%2); n=n/2; } while(! StackEmpty(s))//当栈不为空 { Pop(&s,&e); printf("%d",e); } printf("\n"); } voidconversion16(SqStacks) { unsignedn; chard; inte;InitStack(&s);//初始化栈 printf("n(>=0)="); scanf("%u",&n); while(n)//当n不为0 { Push(&s,n%2); n=n/2; } while(! StackEmpty(s))//当栈不为空 { Pop(&s,&e); switch(e) { case0: e=0;printf("%d",e);break; case1: e=1;printf("%d",e);break; case2: e=2;printf("%d",e);break; case3: e=3;printf("%d",e);break; case4: e=4;printf("%d",e);break; case5: e=5;printf("%d",e);break; case6: e=6;printf("%d",e);break; case7: e=7;printf("%d",e);break; case8: e=8;printf("%d",e);break; case9: e=9;printf("%d",e);break; case10: d='a';printf("%c",d);break; case11: d='b';printf("%c",d);break; case12: d='c';printf("%c",d);break; case13: d='d';printf("%c",d);break; case14: d='e';printf("%c",d);break; case15: d='f';printf("%c",d);break; } printf("%d",e); } printf("\n"); } //选择 intchoose() { intd; printf("请选择你要进行的进制的转换: \n"); printf("如果是十进制转换为八进制请选择1\n"); printf("如果是十进制转换为二进制请选择2\n"); printf("如果是十进制转换为十六进制请选择3\n"); printf("如果您想全部转换请选择9\n"); printf("如果想退出请选择0\n"); printf("\n"); scanf("%d",&d); returnd; } voidmain() { intf=0; SqStacks; while(! f) { switch(choose()) { case1: conversion8(s);break; case2: conversion2(s);break; case3: conversion16(s);break; case9: conversion8(s); conversion2(s); conversion16(s); break; case0: f=-1; default: f=1; } system("pause"); system("cls"); } } 指导教师评语: 程序成绩: 报告成绩: 综合成绩: 指导教师姓名: 批改日期: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数制 转换 数据结构 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)