数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
附件23
信息与电气工程学院
课程设计说明书
(2012/2013学年第二学期)
课程名称:
数据结构
题目:
数制转换
专业班级:
计算机1101班
学生姓名:
....
学号:
11021012x
指导教师:
...
设计周数:
17~19周
设计成绩:
年月日
1、设计目的
1.1、问题描述
任意给定一个M进制的数x,转换为其它任意进制的数据。
1.2、基本要求
1、对给字一个M进制的数据x,求出此数x的10进制值(用MD表示);
2、实现对x向任意的一个非M进制的数的转换;
3、至少用两种方法实现上述要求(用栈解决,用数组解决,其它方法解决)。
2、设计正文
2.1、系统分析
2.1.1、用数组实现该问题:
DtoM()函数和MtoD()函数是实现该问题的主要函数。
DtoM()函数是实现十进制转换为其它进制的函数,它是将输入的十进制数x取首先对需要转换的进制M取余,然后再对其取整,接着通过递归调用DtoM()函数依次将得到的整数部分依次先取余后取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果。
而MtoD()函数则是实现其他进制M转换为十进制,并将其转换为非M进制的数。
M进制转十进制则是从该M进制数的最后一位开始算,依次列为第0、1、2…n位并分别乘以M的0、1、2…n次方,将得到的次方相加便得到对应的十进制数,再调用DtoM()函数将其转换为非M进制的数。
2.1.2用栈实现该问题:
同样是利用DtoM()和MtoD()两个函数实现。
两个函数的思想同利用数组实现时相同。
只是栈具有后进先出的性质,故其用Pop()取数较数组的逆向取数方便些。
2.2、模块划分
2.2.1、用数组实现该问题:
⑴ i,j,y,n,s,m,r,reminder,x是定义的全局变量,初始值都为0;
⑵ DtoM(intg,inth)是实现十进制数转换为M进制数的函数;
⑶ MtoD()是实现M(仅指二进制数和八进制数)进制数转换为十进制数的函数,并在其中调用D2M(intg,inth)实现向非M进制数的转换;
⑷ HtoD(intf)是实现十六进制数转换为十进制数的函数,并在其中调用D2M(intg,inth)实现向非十六进制数的转换;
⑸ voidmain()是主函数,功能是给出测试的数据,并在特定条件下调用D2M()函数和M2D()函数。
2.2.2、用栈实现该问题:
⑴ SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量;
⑵ intInitStack(SqStack&S)到intDestroyStack(SqStack&S)六大模块分别表示构造一个空栈、用e表示栈元素、插入元素、删除元素、判断栈是否为空以及摧毁栈;
⑶ SqStackS是指定义栈S;
⑷ DtoM(inta,intb)的功能是将十进制数转换成M进制的函数;
⑸ MtoD()的功能是M进制转换为十进制的函数;
⑹ voidmain()是主函数。
其功能是输入需要测试的数据以及需要转换的进制,并在特定情形下调用DtoM()函数和MtoD()函数,而且实现M进制数向任意非M进制数的转换。
2.3流程图
2.3.1数组流程图
2.3.2、栈流程图
2.4、源程序
源程序有两个,shuzu.cpp是用数组实现该问题的程序,而stack.cpp是用栈实现该问题的程序。
[文件zhyshuzu.cpp]
#include
#include
#include
#include
#defineN1000
//以下为DtoM(intg,inth)是实现十进制数转换为M进制数的函数,
DtoM(intg,inth)
{
intc[N];
inti=0;intj;
intreminder;
reminder=g%h;
g=g/h;
if(reminder>9)
{
c[i]=reminder+55;
i++;
}
else
{
c[i]=reminder;
i++;
}
if(g>0)
DtoM(g,h);
for(j=i-1;j>=0;j--)
if(c[j]>=65)
printf("%c",c[j]);
else
printf("%d",c[j]);
}
//以下MtoD()是实现M(仅指二进制数和八进制数)进制数转换为十进制数的函数,并在其中调用D2M(intg,inth)实现向非M进制数的转换
MtoD(inte)//二进制和八进制数转换为十进制数,并这转换为其他进制数
{
intn,i,y=0,j,s;
inta[N];
printf("请输入%d进制位数:
",e);
scanf("%d",&n);
j=0;
printf("请输入%d进制的每位并使每位用空格隔开:
",e);
for(i=n-1;i>=0;i--)
scanf("%d",&a[i]);
for(i=0;i{
y+=(int)pow(e,j)*a[i];//强制类型转换,以免造成数据丢失
j++;
}
printf("所得的10进制的结果:
%d",y);
printf("\n需要转换的进制M:
");
scanf("%d",&s);
printf("请输出转换成%d进制的结果:
",s);
DtoM(y,s);
return0;
}
//以下为HtoD(intf)是实现十六进制数转换为十进制数的函数,并在其中调用D2M(intg,inth)实现向非十六进制数的转换
HtoD(intf)//十六进制数转换为十进制数,并转换为其他进制数
{
intn,j=0,y=0,i,s;
intb[N];
printf("请输入%d进制位数:
",f);
scanf("%d",&n);
printf("请输入%d进制的每位并使每位用空格隔开:
",f);
for(i=0;iscanf("%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);
DtoM(y,s);
return0;
}
//voidmain()是主函数,功能是给出测试的数据,并在特定条件下调用D2M()函数和M2D()函数
voidmain()
{
intm,r,x,t;
for(;;)
{
printf("\t\t********数组解决***********\n");
printf("\t\t*数制转换系统*\n");
printf("\t\t*1.进入数制转换系统*\n");
printf("\t\t*2.退出数制转换系统*\n");
printf("\t\t***********************\n");
printf("\t\t请按(1或2):
");
loop:
scanf("%d",&t);
switch(t)
{case1:
printf("请选择一个需转换的进制M(2or8or10or16):
");
scanf("%d",&m);
if(m==2||m==8)//二进制和八进制转换成十进制
MtoD(m);
elseif(m==16)//十六进制转换成十进制
HtoD(m);
elseif(m==10)//十进制转换成其它进制
{
printf("请正确输入一个%d进制数:
",m);
scanf("%d",&x);
printf("请输入需要转换成的进制M(2or8or16):
");
scanf("%d",&r);
printf("请输出转换成%d进制的结果:
",r);
DtoM(x,r);
printf("\n");
break;
}
case2:
exit(0);
default:
{printf("输入有误,请重新选择:
");
gotoloop;}
printf("\n");
}
}
}
[文件zhystack.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;
//SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量
//以下为intInitStack(SqStack&S)到intDestroyStack(SqStack&S)六大模块分别表示构造一个空栈、用e表示栈元素、插入元素、删除元素、判断栈是否为空以及摧毁栈;
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
SqStackS;//定义栈S
//下面的D2M(inta,intb)的功能是将十进制数转换成M进制的函数
DtoM(inta,intb)//十进制转换成其他进制的函数DtoM()
{
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(),它的功能是M进制转换为十进制的函数
MtoD()//其他进制转换为十进制的函数MtoD()
{
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++;
}
printf("转换成10进制的结果是:
");
printf("%d",y);
return0;
}
//voidmain()是主函数。
其功能是输入需要测试的数据以及需要转换的进制,并在特定情形下调用D2M()函数和M2D()函数,而且实现M进制数向任意非M进制数的转换
voidmain()
{
intt;
for(;;)
{
printf("\t\t*********栈解决***********\n");
printf("\t\t*数制转换系统*\n");
printf("\t\t*1.进入数制转换系统*\n");
printf("\t\t*2.退出数制转换系统*\n");
printf("\t\t***********************\n");
printf("\t\t请选择(1或2):
");
loop:
scanf("%d",&t);
switch(t)
{case1:
InitStack(S);//构造一个空栈
printf("请选择一个需转换的进制M(2or8or10or16):
");
scanf("%d",&m);
if(m==10)//十进制转换成其他进制
{
printf("请给定一个需要转换的10进制数:
");
scanf("%d",&x);
printf("请正确输入需要转换成的进制数:
");
scanf("%d",&t);
DtoM(x,t);
}
if(m==2||m==8||m==16)//其他进制转换成十进制,且其他任意进制的相互转换
{
MtoD();
printf("\n给定要转换成的进制M:
");
scanf("%d",&s);
DtoM(y,s);
}
printf("\n");
DestroyStack(S);//销毁栈S,栈S不再存在
break;
case2:
exit(0);
default:
{printf("输入有误,请重新选择:
");
gotoloop;}
printf("\n");
}
}
}
3、运行及测试情况
数组
栈
4、总结
(1)通过此次课程设计的考验,让我们回顾了算法与数据结构这门课的主要内容。
掌握了如何分别用数组和栈来实现数据存储与转换,加深了对栈的掌握和操作,以及栈先进后出的特点。
(2)在程序的调试初期,我们遇到了许多问题,暴露了对编译软件不熟悉的弊端,如设置断点和单步调试,让我们意识到要想学好编程,就得多上机调试。
一个星期时间自己用vc实现了进制转换问题,收获很大同时在编写代码过程中也出现了很多的问题,最大的问题就是对程序设计框架结构的不了解,在实现代码与功能的连接时经常会出现各种不同的错误,在实现一些功能时系统常常会报错,许多错误不知从哪修改。
课程设计中,回顾了很多以前的东西,收获很大。
(3)每一次的课程设计,都是让我们对原有的知识从了解表面到深入本质,从个体学习到整体把握的跳跃,对新知识的汲取,更是把课本的知识应用到实际中,让我们了解了我们的学习有什么用,能够解决什么样的问题,增加了自信和学习的动力。
(4)总之,我们收获匪浅首先由衷感谢老师提供这样一个锻炼自己的机会,感受到学来的知识不只是用来完成试卷的。
一向惯于独立思考的自己学会了积极的同同学、朋友交流,取长补短,共同进步。
课程设计使自己发现考试并不是最重要,最重要的是能运用所学的知识。
在整个课程设计的学习过程中,不再是用学到的知识解题,而是在实际运用时遇到什么学什么,重在把知识应用于实际。