数据结构课程设计.docx

上传人:b****6 文档编号:9128123 上传时间:2023-02-03 格式:DOCX 页数:15 大小:151.38KB
下载 相关 举报
数据结构课程设计.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

数据结构课程设计

附件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;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);

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)总之,我们收获匪浅首先由衷感谢老师提供这样一个锻炼自己的机会,感受到学来的知识不只是用来完成试卷的。

一向惯于独立思考的自己学会了积极的同同学、朋友交流,取长补短,共同进步。

课程设计使自己发现考试并不是最重要,最重要的是能运用所学的知识。

在整个课程设计的学习过程中,不再是用学到的知识解题,而是在实际运用时遇到什么学什么,重在把知识应用于实际。

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

当前位置:首页 > 解决方案 > 学习计划

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

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