数制转换问题完整.docx

上传人:b****8 文档编号:11439589 上传时间:2023-03-01 格式:DOCX 页数:15 大小:173.80KB
下载 相关 举报
数制转换问题完整.docx_第1页
第1页 / 共15页
数制转换问题完整.docx_第2页
第2页 / 共15页
数制转换问题完整.docx_第3页
第3页 / 共15页
数制转换问题完整.docx_第4页
第4页 / 共15页
数制转换问题完整.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数制转换问题完整.docx

《数制转换问题完整.docx》由会员分享,可在线阅读,更多相关《数制转换问题完整.docx(15页珍藏版)》请在冰豆网上搜索。

数制转换问题完整.docx

数制转换问题完整

数制转换问题(完整)

数据结构课程设计

 

题目名称:

数制转换问题

课程名称:

数据结构

学生姓名:

学号:

学院名称:

指导教师:

 

一.需求分析………………………………………………………

 

二.概要设计………………………………………………………

 

三.详细设计………………………………………………………

 

四.调试测试………………………………………………………

 

五.总结……………………………………………………………

 

首先对需要转换的进制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;i

scanf("%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;i

scanf("%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的数的处理难题,同时,在进行转换的时候,对于数字的长度处理上,也是遇到了难题的。

本次课程设计运用了网络知识,以及向别人请教,查阅资料等解决了算法的难题。

从这里我发现,任何一个难题,即使我们碰到一个很大的程序,不知道该如何下手时,只有找多方面的资料,加强思考,这样就能得到意想不到的惊喜。

本次做这个数制转换的题目。

总体来说不是很难,只需要在细节方面熟练的运用栈、数组。

这次课程设计锻炼了我的思维,以及强化了课堂所学的知识,感觉收获很多。

相信这对我人生烙下一个深深的印记。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1