数据结构课程设计之任意进制转换.docx

上传人:b****6 文档编号:4780652 上传时间:2022-12-08 格式:DOCX 页数:24 大小:22.95KB
下载 相关 举报
数据结构课程设计之任意进制转换.docx_第1页
第1页 / 共24页
数据结构课程设计之任意进制转换.docx_第2页
第2页 / 共24页
数据结构课程设计之任意进制转换.docx_第3页
第3页 / 共24页
数据结构课程设计之任意进制转换.docx_第4页
第4页 / 共24页
数据结构课程设计之任意进制转换.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数据结构课程设计之任意进制转换.docx

《数据结构课程设计之任意进制转换.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之任意进制转换.docx(24页珍藏版)》请在冰豆网上搜索。

数据结构课程设计之任意进制转换.docx

数据结构课程设计之任意进制转换

 

##大学

数据结构课程设计报告

 

题目:

数值转换

 

院(系):

学生姓名:

班级:

起迄日期:

指导教师:

 

计算机工程学院

 

学号:

6月16号到6月30号

 

20XX—20XX年度第2学期

 

一、需求分析

1.问题描述:

 

任意给定一个M进制的数x,请实现如下要求

1)求出此数x的10进制值(用MD表示)

2)实现对x向任意的一个非M进制的数的转换。

3)至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解

决)。

 

2.基本功能

 

本程序用三种方法,实现把一个M进制数x转换成其他进制数,分别是数组,递归,

栈。

1.把其他进制数转换成十进制包含在一个函数中:

2.把十进制转换成其他进制数用了三种方法(

N)。

递归:

voidprind_d(intn,intc)。

 

intgetdex();

 

数组,递归,栈),数组:

 

voidarray(int

栈:

 

voidinitstack(stack&s)

 

,voidpush(stack&s,chare)

 

,voidpop(stacks)

 

3.实现把一个

 

M进制数

 

x转换成其他进制数:

 

先把

 

M进制数转换成十进制数,再把十进制

数转换成其他进制数。

封装在三个函数中:

voidArray(),voidStack(),voidPrind()。

 

3.输入输出

 

输入要求其他进制数为字符型数据包括在1到9,和A到F这些字符中,输出也是包含在这些字符中。

如果输入超过这些范围进行容错处理。

 

二、概要设计

1.设计思路:

把M进制数转换成其他进制数,可以先把M进制数转换成十进制数,调用intgetdex();

 

再把十进制数转换成其他进制数(三种方法:

数组,递归,栈);最后把这两个步骤结合在

一起。

封装在三个函数中:

voidArray(),voidStack(),voidPrind();通过switch语句进行选择采用哪种方法转换。

 

2.数据结构设计:

 

抽象数据类型栈:

ADTStack{

数据对象:

D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}

数据关系:

R1={|ai-1,ai∈D,i=2,...,n}

约定an端为栈顶,a1端为栈底。

}ADTStack

 

基本操作:

InitStack(&S)

操作结果:

构造一个空栈

 

S。

Push(&S,e)

初始条件:

栈S已存在。

操作结果:

插入元素e为新的栈顶元素。

Pop(&S,&e)

初始条件:

操作结果:

删除

 

S已存在且非空。

S的栈顶元素,并用

 

e返回其值。

3.软件结构设计:

 

三、详细设计

1.定义程序中所有用到的数据及其数据结构,及其基本操作的实现;

用到的数据char类型M进制数,typedefstruct{

int*base;

int*top;

intstacksize;

}stack;

基本操作:

voidarray(intN)

初始条件:

已知一个十进制数

操作结果:

转换成其他进制数y。

intgetdex()

初始条件:

已知一个M进制数

操作结果:

转换成十进制数。

voidprind_d(intn,intc)基本操作:

初始条件:

已知一个十进制数

操作结果:

转换成其他进制数y。

 

InitStack(&S)

操作结果:

构造一个空栈S。

Push(&S,e)

初始条件:

栈S已存在。

操作结果:

插入元素e为新的栈顶元素。

Pop(&S,&e)

初始条件:

栈S已存在且非空。

操作结果:

删除S的栈顶元素,并用e返回其值。

 

2.主函数和其他函数的伪码算法;

算法设计说明,存储结构的说明。

1.intgetdex();把其他进制数转化为十进制数,

算法步骤:

(1)定义一个字符型的数组

chara【50】,用gets()函数输入字符串。

把M

进制数保存在一个字符串

数组当中,例如16进制数2A,

(2

)用for循环的嵌套实现转换。

i=n-1

开始,执行语句:

判断

a【i】是否大于57(整

数大小的比较),(a[i]<=57,a【i】减去

48,a[i]>57那么a[i]-55

,因为1

到9和A,B,C

的Aske码有差别。

)从而实现字符向整数的转变。

(3

)通过for循环把M进制数的每一位取出来用

t保存,倒序取出的先取得

A,再取2。

(4

)P=1,然后嵌套的

for循环用来求每一位对应的权。

例如

A对应的p=0,2的权p=1。

用for(j=0;j

{p=p*x;}求p,循环的条件是j

(5

)把十进制数用sum存储,sum=sum+t*p;

**存储结构说明:

物理存储结构是顺序存储结构,逻辑结构是线性结构,主要是采用

数组来

存储处理M进制数。

 

2.voidarray(intN);把十进制数转成其他进制数。

(1).定义字符数组charHexNum[]="0123456789ABCDEF";chara[1000]={0};

(2)输入要转化成进制数q;用取余数的方法,把余数存储在数组a[1000],实现语句为while语

句,(a[i]=HexNum[N%q];i=i+1;N=N/q;)其中十进制数N除以q的余数正好对应数组

HexNum[]的某一元素,例如42除以16,余下2,对应HexNum[]中2,余下10对应数组

中的

 

A。

(3)倒序输出余数;定义变量m,存储数组a[]中余数的元素的个数,

用for循环从i=m+1;开始输出也就是从数组**本函数定义了两个数组一个存储1-9,A到

 

a【】中最后一个余数开始输出。

直到i=0;F这16个字符的另一个存储10进制数除以

 

q

进制数的余数的。

 

3.voidprind_d(intn,intc)递归的方法把十进制转换成其他进制数。

(1)定义一个递归函数用switch语句判断转换成的四种情况

(2)Case10,输入十进制数n,判断是否<0,如果是则putchar('-')

是否为0;再执行prind_d(n/10,10);递归,直到商为0时停止。

跳过

行putchar(n%10+'0');,输出余数,然后倒序的方式输出所有余数。

 

;然后if(n/10)判断商

prind_d(n/10,10),执

(3)Case16

 

,case8

 

,case2

 

都和

 

case10

 

一样。

**十六进制数不太一样要把余数保存在一个数组中,charch[]="0123456789ABCDEF";然

后倒序输出。

4.栈的方式实现十进制转化为其他进制数。

(1)voidinitstack(stack&s)

定义一个结构体typedefstruct{

 

int*base;

int*top;

 

intstacksize;

}stack;

s.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));

 

开辟一个

 

STACK_INIT_SIZE

 

大的空

间并把首地址赋给栈底指针

 

s.base

 

s.top=s.base,栈底和栈顶指针相等表明是空栈;栈的大小为

s.stacksize=STACK_INIT_SIZE。

(2)入栈voidpush(stack&s,chare)

判断是否栈满s.top-s.base>=s.stacksize

(),并把首地址赋给s.base。

 

;如果栈满另外开辟新的空间

 

s.base=(int*)realloc

栈的栈顶指针为

 

s.top=s.base+s.stacksize;

 

栈的容量变为:

s.stacksize+=STACKINCREMENT

 

;并把新的元素赋给栈顶指针,

 

*s.top=e;

 

栈顶指针加

1,s.top=s.top+1

 

(3)出栈。

While语句判断s.top!

=s.base时结束,栈顶指针的值赋给

e>9是否成立,如果是则以字符的形式输出输出否则以整数的形式输出。

 

e,然后减

 

1,判断

4.封装在三个函数中

 

Array()

 

,Stack(),

 

Prind()把

 

M进制数转换为其他进制数。

(1)Array(),Prind()。

输入M进制数x,然后转换成十进制数

N),voidprind_d(intn,intc)这两个函数转换成y进制数。

 

m,分别再用

 

voidarray(int

(2)Stack()。

temp=(int)N%n,求余数,并入栈,push(s,temp),但当temp>9时要强制转换成字符类型:

temp=(char)(temp+55);

然后倒序出栈pop(s)。

 

5,。

主函数main()

用一个switch语句来选择用哪种方法,n=1,用数组,n=2用递归,n=3用栈。

其他输入输入错误。

 

3.主要函数的程序流程图,实现设计中主程序和其他子模块的算法,以流程图的形式表示。

 

开始

 

输入N

 

charHexNum[]=

"0123456789ABCDEF";

chara[1000]={0};

输入q

 

N=0

a[i]=HexN

um[N%q];

i=i+1;

N=N/q;

 

m=i;

i=m+1

i>=0;

printf("%c",a[i]);否

 

i--

i--

cout<

 

结束

 

开始

 

chara[50]

 

int

n,j,i,sum=0,t=0,

p=1;intx;

输入一个

数x

cin.get();

gets(a);

n=strlen(a);

 

i=n-1

 

i>=0

p=1;

 

a[i]<=57

t=a[i]-55

 

i==n-1

j=0

j

p=p*x

j++

sum+=t*p;

结束

 

 

t=a[i]-48

 

是p=1

 

开始

 

intn,intc

 

prind_d(int

n,intc)

 

switch(c)

 

if(n/2)

if(n/16)

prind_d(n/2,2);

prind_d(n/16,16);

putchar(n%2+'0');

break;putchar(ch[n%16]);

 

if(n/8)

prind_d(n/8,8);

putchar(n%8+'0');

break;

 

4.画出函数之间的调用关系图。

Void

main()

 

Prind()

 

Array()Stack()

 

array(a)getdex()

 

void

prind_d(i

ntn,intc)

 

initstackpush(s,t

(s)emp)pop(s)

 

四、调试分析

调试分析:

 

1.实际完成的情况说明(完成的功能,支持的数据类型等);可以完成M进制数X到其他进制数的转换

2.程序的性能分析,包括时空分析;

程序的时间复杂度为o(n),空间复杂度为0

(1);

3.上机过程中出现的问题及其解决方案;

实验过程中要在数组方法中出现问题:

保存余数的数组chara[1000]要都赋予值0,否则在

倒序的是否会因为系统自动分配的未知数值出现问题chara[1000]。

 

本来结果应该是2A结果却是烫2A。

问题2.在把其他进制数转换成十进制数的时候,1到9的ASCII值(t=a[i]-48)与ABCF字符

的ASCII码(t=a[i]-55)的值有区别,

 

本应该转换成的十进制数是159,但却等于156,所以要分开对待。

4.程序中可以改进的地方说明;

试验中还是又可以改进的地方的,例如把小数转化的部分加进去。

增强程序的容错性主要在输入输出方面

5.程序中可以扩充的功能及设计实现假想。

可以直接实现把M进制数转换成N进制数,而不是通过十进制这个桥梁。

五、测试结果

 

栈方法:

 

递归方法:

 

六、

.用户手册:

用visualC打开源文件,按ctrl+F7,进行编译,再按ctrl+F5运行,会出现一个界面

 

再按菜单操作及可

七.体会与自我评价

实验设计中我学到了模块化处理问题,找到问题,并一个个解决,例如把三种方法封装在

三个函数中。

但在也存在着一些问题主要是16进制上,它包括一些AB等一些字母,所以要进行特别处理。

例如在十进制的转化中要分开处理

if(a[i]<=57)//比较大小都要换成整型的

t=a[i]-48;

else

t=a[i]-55;

if(i==n-1)

}

 

解决数制转换问题时,如果所给的数值不是用十进制表示的,一般用一个字符型数组来

存放。

数组的每个元素分别存储它的一位数字。

然后按位转换求和,得到十进制表示;再

十进制表示转换成所求的数制表示。

转换的结果也用一个字符型数组表示,每个元素表示

换结果的一位数字。

根据数制表示中相邻位的基数关系,可以把不同的数制分成两类。

类数制表示中,相

邻位的基数是等比关系,例如我们熟悉的十进制表示。

另一类数制表示中,相邻位的基数

不等比的。

例如在时间表示中,从秒到分采用

60

进进制;从月到年采用

12

进制。

把一个

数值从数制B

的表示bmbm-1bm-2...b1

转换成十进制表示dndn-1dn-2...d1

比较简

单。

假设数制

B中,第i位的基数为basei(1?

i?

m)

,直接把basei

与bi

相乘,然后对

全部乘积求和。

从十进制表示dndn-1dn-2...d1

到bmbm-1bm-2...b1

的转换需要分

两种情况考虑:

数制M中相邻数字的基数是等比关系,即:

basei(m)

可以表示成Ci-1,其中C是

一个常量。

dndn-1dn-2...d1

除以C,余数即为

b1;将dndn-1dn-2...d1

和C相

除的结果再除以

q,余数即为b;⋯;直至计算出为

bm止。

数制M中相邻数字的基数不等比。

需要先判断

dndn-1dn-2...d1

在数制M中需要的

位数m,然后从高位到低位依次计算

bm、bm-1

、bm-2、...、b1。

 

源代码:

 

#include

usingnamespacestd;

#include

#include

#defineSTACK_INIT_SIZE100

#defineSTACKINCREMENT10

typedefstruct{

int*base;

int*top;

intstacksize;

}stack;

////////////////////////////////

intgetdex()

 

{

chara[50];

intn,j,i,sum=0,t=0,p=1;intx;

printf("输入要转化M进制数:

");

scanf("%d",&x);

printf("输入一个进制数x:

");

cin.get();

gets(a);

n=strlen(a);

for(i=n-1;i>=0;i--)

{p=1;

if(a[i]<=57)//比较大小都要换成整型的

t=a[i]-48;

else

t=a[i]-55;

if(i==n-1)

{

p=1;

}

else

{

for(j=0;j

{p=p*x;

}

}

sum+=t*p;

}

printf("对应的十进制数:

%d\n",sum);

returnsum;

}

//////////////////////////////////////////////////////////

voidarray(intN)

{charHexNum[]="0123456789ABCDEF";

chara[1000]={0};

 

printf("输入一个要转化的进制数N:

");

intq;

scanf("%d",&q);

inti=0,m=0;

while(N)

{

a[i]=HexNum[N%q];

i=i+1;

N=N/q;

 

}

//printf("%d",i);

m=i;

for(i=m+1;i>=0;i--)

{

printf("%c",a[i]);

}

cout<

}

 

//////////////////////////////////////////////////////

voidinitstack(stack&s)

{//构造一个空栈s

s.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));//存储分配失败

s.top=s.base;s.stacksize=STACK_INIT_SIZE;

//returns;

}

/////////////////////////////////////////////////////////

voidpush(stack&s,chare)

{//插入元素e为新的栈顶元素,并返回OK,否则返回ERROR

if(s.top-s.base>=s.stacksize){//栈满追加存储空间

s.base=(int*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));

s.top=s.base+s.stacksize;

s.stacksize+=STACKINCREMENT;

}

*s.top=e;

s.top=s.top+1;

//returns;

}

////////////////////////////////////////////////////////

voidpop(stacks)

{//若栈不空则删除s的栈顶元素,用e返回其值,并返回

inte;

 

OK,否则返回

 

ERROR

//printf("输出相等的一个%d进制数",&n);while(s.top!

=s.base)

{e=*--s.top;

if(e>9)

printf("%c",e);

else

printf("%d",e);

}

}

 

/////////////////////////////////////////////////////

 

voidprind_d(intn,intc)

{

switch(c)

{

 

case10:

{

if(n<0)

{

putchar('-');

n=-n;

}

if(n/10)

prind_d(n/10,10);

putchar(n%10+'0');

break;

}

case8:

{

if(n/8)

prind_d(n/8,8);

putchar(n%8+'0');

break;

}

case16:

{

if(n<0)

{

putchar('-');

n=-n;

}

charch[]="0123456789ABCDEF";

if(n/16)

prind_d(n/16,16);

putchar(ch[n%16]);

break;

}

case2:

{

if(n/2)

prind_d(n/2,2);

putchar(n%2+'0');

 

break;

}

}

}

///////////////////////////////////////////////////

voidArray()

{printf("数组方法的运行结果:

\n");

inta;

 

a=getdex();

array(a);

 

}

//////////////////////////////////////////////////////

voidStack()

{

printf("栈方法的运行结果:

\n");

stacks;

intN,temp;

initstack(s);

N=getdex();

//printf("输入一个十进制数");

//scanf("%d",&N);

printf("请输入要转换成的进制数N:

");

intn;//把十进制转换成n进制

scanf("%d",&n);

while(N)

{

temp=(int)N%n;

if(temp>9)

{temp=(char)(temp+55);}

push(s,temp);

N=N/n;

}

printf("转换成的N=%d进制数:

\n",n);

pop(s);

printf("\n");

}

////////////////////////////////////////////

voidPrind()

{printf("递归方法的运行结果:

\n");

intc,m;

puts("输入要转化的进制数N");

cin>>c;

 

m=getdex();

cout<<"N:

";

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

当前位置:首页 > 高中教育 > 高考

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

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