数制转换数据结构课程设计Word文件下载.doc
《数制转换数据结构课程设计Word文件下载.doc》由会员分享,可在线阅读,更多相关《数制转换数据结构课程设计Word文件下载.doc(22页珍藏版)》请在冰豆网上搜索。
构造数组
数制转换函数
输出结果
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<
stdio.h>
math.h>
#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
%d"
return0;
}
M2D(inte)//二进制和八进制数转换为十进制数,并这转换为其他进制数
{
inta[N];
printf("
请输入%d进制位数:
"
m);
scanf("
&
n);
printf("
请输入%d进制的每位并使每位用空格隔开:
for(i=0;
i<
n;
i++)
scanf("
a[i]);
for(i=n-1;
i>
i--)
y+=(int)pow(e,j)*a[i];
//强制类型转换,以免造成数据丢失
j++;
}
请输出所得的10进制的结果:
"
);
y);
\n需要转换的进制M:
s);
请输出转换成%d进制的结果:
s);
D2M(y,s);
H2D(intf)//十六进制数转换为十进制数,并转换为其他进制数
intb[N];
scanf("
%x"
b[i]);
i--)
y+=(int)pow(f,j)*b[i];
//强制类型转换,以免造成数据丢失
j++;
voidmain()
请给定一个需转换的进制M(2or8or10or16):
m);
if(m==2||m==8)//二进制和八进制转换成十进制
M2D(m);
elseif(m==16)//十六进制转换成十进制
H2D(m);
elseif(m==10)//十进制转换成其它进制
{
printf("
请输入一个%d进制数:
scanf("
x);
请输入需要转换成的进制M(2or8or16):
r);
r);
D2M(x,r);
\n"
}
B.栈实现
#include"
stdio.h"
#include"
string.h"
math.h"
limits.h"
stdlib.h"
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;
stacksize=STACK_INIT_SIZE;
returnOK;
intDestroyStack(SqStack*S)
free(S->
base);
S->
base=NULL;
top=NULL;
stacksize=0;
intClearStack(SqStack*S)
top=S->
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)
base=(SElement*)realloc((*S).base,((*S).stacksize+STACKINCREMENT*
sizeof(SElement)));
if(!
S->
base)
exit(OVERFLOW);
base+S->
stacksize;
stacksize+=STACKINCREMENT;
*(S->
top)=e;
top++;
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>
visit(*S.base++);
printf("
voidconversion8(SqStacks)
{
unsignedn;
inte;
InitStack(&
//初始化栈
n(>
=0)="
scanf("
%u"
while(n)//