数制转换问题完整.docx
《数制转换问题完整.docx》由会员分享,可在线阅读,更多相关《数制转换问题完整.docx(15页珍藏版)》请在冰豆网上搜索。
数制转换问题完整
数制转换问题(完整)
数据结构课程设计
题目名称:
数制转换问题
课程名称:
数据结构
学生姓名:
学号:
学院名称:
指导教师:
一.需求分析………………………………………………………
二.概要设计………………………………………………………
三.详细设计………………………………………………………
四.调试测试………………………………………………………
五.总结……………………………………………………………
首先对需要转换的进制M取余,然后再对其取整,接着通过递归调用D2M()函数依次将得到的整数部分依次先取余后取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果。
而M2D()函数则是实现其他进制M转换为十进制,并将其转换为非M进制的数。
M进制转十进制则是从该M进制数的最后一位开始算,依次列为第0、1、2…n位并分别乘以M的0、1、2…n次方,将得到的次方相加便得到对应的十进制数,再调用D2M()函数将其转换为非M进制的数。
⑴ i,j,y,n,s,m,r,reminder,x是定义的全局变量,初始值都为0;
⑵ D2M(intg,inth)是实现十进制数转换为M进制数的函数;
⑶ M2D(inte)是实现M(仅指二进制数和八进制数)进制数转换为十进制数的函数,并在其中调用D2M(intg,inth)实现向非M进制数的转换;
⑷ H2D(intf)是实现十六进制数转换为十进制数的函数,并在其中调用D2M(intg,inth)实现向非十六进制数的转换;
⑸ voidmain()是主函数,功能是给出测试的数据,并在特定条件下调用D2M()函数和M2D()函数。
使用简单一维数组inta[N],intb[N],intc[N]。
1.用栈实现该问题
同样是利用D2M()和M2D()两个函数实现。
两个函数的思想同利用数组实现时相同。
只是栈具有后进先出的性质,故其用Pop()取数较数组的逆向取数方便些。
⑴ SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量;
⑵ intInitStack(SqStack&S)到intDestroyStack(SqStack&S)六大模块分别表示构造一个空栈、用e表示栈元素、插入元素、删除元素、判断栈是否为空以及摧毁栈;
⑶ SqStackS是指定义栈S;
⑷ D2M(inta,intb)的功能是将十进制数转换成M进制的函数;
⑸ M2D()的功能是M进制转换为十进制的函数;
⑹ voidmain()是主函数。
其功能是输入需要测试的数据以及需要转换的进制,并在特定情形下调用D2M()函数和M2D()函数,而且实现M进制数向任意非M进制数的转换。
数据类型定义如下:
typedefstruct{
int*base;栈底
int*top;栈顶
intstacksize;栈容量
}SqStack;
intInitStack(SqStack&S)构造一个个空栈
intGetTop(SqStackS,int&e)若栈不为空,则用e返回S的栈顶元素,并返回0,否则返回1
intPush(SqStack&S,inte)插入元素e为新的栈顶元素
intPop(SqStack&S,int&e)若栈不空,则删除S的栈顶元素,用e返回其值,并返回0,否则返回1。
1.程序流程图
若N!
=10
若N=10
2.程序源代码
A.用数组实现(文件名shuzu.cpp)
#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;iscanf("%d",&a[i]);
for(i=n-1;i>=0;i--)
{
y+=(int)pow(e,j)*a[i];//强制类型转换,以免造成数据丢失
j++;
}
printf("需要转换的进制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;iscanf("%x",&b[i]);
for(i=n-1;i>=0;i--)
{
y+=(int)pow(f,j)*b[i];//强制类型转换,以免造成数据丢失
j++;
}
printf("需要转换的进制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.用栈实现(文件名zhan.cpp)
#include
#include
#include
#include
#defineSTACK_INIT_SIZE100//存储空间初始分配量
#defineSTACKINCREMENT10//存储空间分配增量
inte,m,x,s,t;//x为要转换的十进制数,e为临时用的的int型变量
intr,y,i,n;
typedefstruct{
int*base;//栈底
int*top;//栈顶
intstacksize;//栈容量
}SqStack;
intInitStack(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;
return0;
}
intGetTop(SqStackS,int&e){//若栈不为空,则用e返回S的栈顶元素,并返回0,否则返回1
if(S.top==S.base)return1;
e=*(S.top-1);
return0;
}
intPush(SqStack&S,inte){//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){//栈满,追加存储空间
S.base=(int*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!
S.base)return1;//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return0;
}
intPop(SqStack&S,int&e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回0,否则返回1
if(S.top==S.base)return1;
e=*--S.top;
return0;
}
intStackEmpty(SqStackS){//若栈空,则返回1,否则返回0
if(S.top==S.base)
return1;
return0;
}
intDestroyStack(SqStack&S){//销毁栈S,栈S不再存在
free(S.base);
S.top=NULL;//防止程序后面不小心使用了它
S.base=S.top;
return0;
}
SqStackS;//定义栈S
D2M(inta,intb)//十进制转换成其他进制的函数D2M()
{
while(a)
{
r=a%b;
if(r>9)
r=r+55;
Push(S,r);//压入栈
a/=b;//转换成M进制
}
printf("该数转换成%d进制的结果:
",b);
while(!
StackEmpty(S))
{
Pop(S,e);//弹出栈
if(e>=65)
printf("%c",e);
else
printf("%d",e);
}
return0;
}
M2D()//其他进制转换为十进制的函数M2D()
{
charc[1000];
printf("请输入需要转换的数的位数:
");
scanf("%d",&n);
printf("请输入需要转换的数的每位并用空格隔开:
");
for(i=0;i{
scanf("%x",&c[i]);
Push(S,c[i]);
}
i=0;
while(!
StackEmpty(S))
{
Pop(S,e);
y+=(int)pow(m,i)*e;
i++;
}
}
voidmain()
{
InitStack(S);//构造一个空栈
printf("请输入需要转换的进制M(2or8or10or16):
");
scanf("%d",&m);
if(m==10)//十进制转换成其他进制
{
printf("请给定一个需要转换的10进制数:
");
scanf("%d",&x);
printf("请输入需要转换成的进制数:
");
scanf("%d",&t);
D2M(x,t);
}
if(m==2||m==8||m==16)//其他进制转换成十进制,且其他任意进制的相互转换
{
M2D();
printf("给定要转换成的进制M:
");
scanf("%d",&s);
D2M(y,s);
}
printf("\n");
DestroyStack(S);//销毁栈S,栈S不再存在
}
四.调试测试
1.十进制数365转换二进制数测试结果如下:
(图1)
图1
2.十六进制数1A2B3C转换十进制数测试结果如下:
(图2)
图2
3.二进制数11001100转换八进制数测试结果如下:
(图3)
图3
4.八进制数1234转换为十六进制数测试结果如下:
(图4)
图4
五.总结
此次课程设计与以往不同:
第一,时间是比较紧的,从题目分配到完成设计不足十天的时间,而且又是即将期末考试的这段时间;第二,人数和以往也不同,以前都是几个同学一起完成设计,而这次却是每个人单独完成自己的题目,所以人手也是比较紧的;第三,以前的课程设计是最后完成提交就行了,而这次我们必须时刻都提交自己课程设计的进程,中途随时交给指导老师批阅,避免同学最后时间才去完成作业的思想。
这次课程设计过程中遇见的问题就是2、8、10、16进制之间的转换。
任意进制之间的转换在栈和数组的处理时遇到大于10的数的处理难题,同时,在进行转换的时候,对于数字的长度处理上,也是遇到了难题的。
本次课程设计运用了网络知识,以及向别人请教,查阅资料等解决了算法的难题。
从这里我发现,任何一个难题,即使我们碰到一个很大的程序,不知道该如何下手时,只有找多方面的资料,加强思考,这样就能得到意想不到的惊喜。
本次做这个数制转换的题目。
总体来说不是很难,只需要在细节方面熟练的运用栈、数组。
这次课程设计锻炼了我的思维,以及强化了课堂所学的知识,感觉收获很多。
相信这对我人生烙下一个深深的印记。