数制转换问题-课程设计报告
心理健康日-我的老师魏巍阅读答案
中北大学
1 设计目的
《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关
系,讨
论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行
简单的分析和讨论。进行数据结构课程设计要达到以下目的:
了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
训练用系统的观点和软件开发一般规
范进行软件开发,培养软件工作者所应具备的科学的工
作方法和作风。
2. 设计内容和要求
内容
任意给定一个M进制的数x,转换为其它任意进制的数据。
基本要求
1、对给字一个M进制的数据x,求出此数x的10进制值(用MD表示);
2、实现对x向任意的一个非M进制的数的转换;
3、至少用两种方法实现上述要求(用栈解决,用数组解决,其它方法解决)。
核心问题:
将一个任意数的进制进行转换
数据模型(逻辑结构): 栈的应用、数组的应用
3.本设计所采用的数据结构
数据结构
1、用数组实现该问题:
使用简单一维数组int a[N],int b[N], int c[N]。
2、用栈实现该问题:
数据类型定义如下:
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack;
输入数据: 一个M进制的数x
输出数据: 其它任意进制的数据*
4.功能模块详细设计
4.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、用栈实现该问题:
同样是利用DtoM()和MtoD()两个函数实现。两个函数的思想同利用数组实现时相
同。只是栈
具有后进先出的性质,故其用Pop()取数较数组的逆向取数方便些。
模块划分
1、用数组实现该问题:
⑴
i,j,y,n,s,m,r,reminder,x是定义的全局变量,初始值都为0;
⑵
DtoM(int g,int h)是实现十进制数转换为M进制数的函数;
⑶ MtoD()是实
现M(仅指二进制数和八进制数)进制数转换为十进制数的函数,并
在其中调用D2M(int
g,int h)实现向非M进制数的转换;
1
⑷
HtoD(int f)是实现十六进制数转换为十进制数的函数,并在其中调用D2M(int
g,int h)实现向非十六进制数的转换;
⑸ void main()是主函数,功能
是给出测试的数据,并在特定条件下调用D2M()
函数和M2D()函数。
2、用栈实现该问题:
⑴
SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容
量;
⑵ int InitStack(SqStack &S)到int
DestroyStack(SqStack &S)六大模块分别
表示构造一个空栈、用e表示栈元素
、插入元素、删除元素、判断栈是否为空
以及摧毁栈;
⑶ SqStack
S是指定义栈S;
⑷ DtoM(int a,int
b)的功能是将十进制数转换成M进制的函数;
⑸
MtoD()的功能是M进制转换为十进制的函数;
⑹ void main()是主函数。其功
能是输入需要测试的数据以及需要转换的进制,
并在特定情形下调用DtoM()函数和MtoD()函
数,而且实现M进制数向任意非
M进制数的转换。
流程图
数组流程图
2
开始
执行main函数
switch()选择功能
选择操作编号 2.退出 exit(0)
1.进入转换系统
输入需转换进制的
数字(2or8or10or16)
m==2||
m==16 m==10
m==8
3
MtoD() HtoD()
输入十进制数
输出结输出结
DtoM()
果 果
输出结
果
栈的流程图
开始
执行main函数
switch()选择功能
选择操作编号 2.退出 exit(0)
1.进入转换系统
InitStack()构造空栈
输入需转换进制的
数字(2or8or10or16)
m==2||m==8||m==16
m==10
MtoD()
输入一个十进制数
4
DtoM()
DtoM()
输出结果
销毁栈
4.2
核心代码
源程序有两个,是用数组实现该问题的程序,而是用栈实现该问
题的程序:
[文件]
#include
#include
#include
#include
#define N 1000
以下为DtoM(int g,int h)是实现十进制数转换为M进制数的函数,
DtoM(int g,int h)
{
int c[N];
int i=0;int j;
int reminder;
reminder=g%h;
g=gh;
if(reminder>9)
{
c[i]=reminder+55;
i++;
5
}
}
else
{
}
if(g>0)
DtoM(g,h);
c[i]=reminder;
i++;
for(j=i-1;j>=0;j--)
if(c[j]>=65)
printf(
else
printf(
以下MtoD()是实现M(仅指二进制数和八进制数)
进制数转换为十进制数的函数,并在其中
调用D2M(int g,int
h)实现向非M进制数的转换
MtoD(int e)
二进制和八进制数转换为十进制数,并这转换为其他进制数
{
int
n,i,y=0,j,s;
int a[N];
printf(请输入%d进制位数:
scanf(
j=0;
printf(请输入%d进制的每位并使每位用空格隔开:
for(i=n-1;i>=0;i--)
scanf(
for(i=0;i
6
}
y+=(int)pow(e,j)*a[i]; 强制类型转换,以免造成数据丢失
j++;
printf(所得的10进制的结果:%d
printf(需要转换的进制M:
}
以下为HtoD(int f)是实现十六进制数转换为十进制数的函数,并在其中调用D2M(int
g,int h)实现向非十六进制数的转换
HtoD(int f)
十六进制数转换为十进制数,并转换为其他进制数
{
int n,j=0,y=0,i,s;
int b[N];
printf(请输入%d进制位数:
scanf(
printf(请输入%d进制的每位并
使每位用空格隔开:
for(i=0;i
printf(请输出转换成%d进制的结果:
DtoM(y,s);
return 0;
scanf(
for(i=n-1;i>=0;i--)
{
y+=(int)pow(f,j)*b[i]; 强制类型转换,以免造成数据丢失
j++;
}
printf(请输出所得的10进制的结果:
printf(
printf(需要转换的进制M:
scanf(
7
}
printf(请输出转换成%d进制的结果:
DtoM(y,s);
return
0;
void
main()是主函数,功能是给出测试的数据,并在特定条件下调用D2M()函数和M2D()
函数
void main()
{
int m,r,x,t;
for(;;)
{
printf(
printf(数制转换系统
n
printf(
printf(
printf(
printf(进入数制转换系统 *n
printf(退出该系统 *n
printf(
printf(请选择(1-2):
loop:scanf(
switch(t)
{
case 1:printf(请给定一个需转换的进制M(2 or 8 or 10 or
16):
scanf(
if(m==2||m==8)
二进制和八进制转换成十进制
MtoD(m);
else if(m==16)
十六进制转换成十进制
HtoD(m);
else if(m==10)
十进制转换成其它进制
8
{
}
printf(请输入
一个%d进制数:
scanf(
printf(请输入需要转换成的进制M(2 or 8
or 16):
scanf(
printf(请输出转换成%d进制的结果:
DtoM
(x,r);
printf(
break;
case 2:
exit(0);
default:{
printf(输入有误,请重新选择:
goto loop;}
}
printf(
}
}
9
[文件]
#include
#include
#include
#include
#define STACK_INIT_SIZE 100 存储空间初始分配量
#define STACKINCREMENT 10 存储空间分配增量
int
e,m,x,s,t; x为要转换的十进制数,e 为临时用的的int型变量
int
r,y,i,n;
typedef struct{
int
*base; 栈底
int *top; 栈顶
int
stacksize; 栈容量
}SqStack;
SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量
一下为int InitStack(SqStack &S)到int
DestroyStack(SqStack &S)六大模块分别表示构造一个
空栈、用e表示栈元素
、插入元素、删除元素、判断栈是否为空以及摧毁栈;
int InitStack(SqStack
&S){ 构造一个空栈
}
int GetTop(SqStack S, int &e){
若栈不为空,则用e返回S的栈顶元素,并返回0,否则
返回1
}
10
=(int
*)malloc(STACK_INIT_SIZE *sizeof(int));
if(!)
exit(0); 存储空间失败
=;
ize=STACK_INIT_SIZE;
return 0;
if(==) return 1;
e=*(-1);
return 0;
int Push(SqStack &S
, int e){ 插入元素e为新的栈顶元素
}
int Pop(SqStack
&S, int &e){
若栈不空,则删除S的栈顶元素,用e返回其值,并返回
0,否则返回1
}
int StackEmpty(SqStack S){
若栈空,则返回1,否则返回0
}
int
DestroyStack(SqStack &S){ 销毁栈S,栈S不再存在
}
以下 SqStack S是指定义栈S
SqStack
S; 定义栈S
11
if(>=ize){
栈满,追加存储空间
}
*++=e;
return 0;
=(int *)realloc(,
(ize+STACKINCREMENT)*sizeof(int));
if(!)
return 1 存储分配失败
=+ize;
ize+=STACKINCREMENT;
if(==) return 1;
e=*--;
return 0;
if(==)
return 1;
return 0
free();
=NULL; 防止程序后面不小心使用了它
=;
return 0
下面的D2M(int a,int
b)的功能是将十进制数转换成M进制的函数
DtoM(int a,int b)
十进制转换成其他进制的函数DtoM()
{
while(a)
{
r=a%b;
if(r>9)
r=r+55;
Push(S,r); 压入栈
a=b; 转换成M进制
}
printf(该数转换成%d进制的结果:
while(!StackEmpty(S))
{
Pop(S,e);
弹出栈
if(e>=65)
printf(
else
printf(
}
return 0;
}
下面是M2D(),它的功能是M进制转换为十进制的函数
MtoD()
其他进制转换为十进制的函数MtoD()
{
char c[1000];
printf(请输入需要转换的数的位数:
scanf(
printf(请输入需要转换的数的每位并用空格隔开:
for(i=0;i
12
{
}
scanf(
Push(S,c[i]);
i=0;
}
void main()是主函数。其功能是输入需要测试的数据以及需要转换的进制,并
在特定情形
下调用D2M()函数和M2D()函数,而且实现M进制数向任意非M进制数的转换
void main()
{
int t;
for(;;)
{
printf( ^-^ welcome
!!! ^-^ * * * * * * n
while(!StackEmpty(S))
{
}
printf(转换成10进制的结果是:
printf(
return 0;
Pop(S,e);
y+=(int)pow(m,i)*e;
i++;
printf( 数制转换系统
n
printf(
printf(
n
printf(
printf( 1.
进入数制转换系统 *n
13
printf( 2. 退出该系统
*n
printf(
printf(
请选择(1-2):
loop:scanf(
switch(t)
{ case 1:InitStack(S);
构造一个空栈
printf(请输入需要转换的进制M(2or8or10or16
):
scanf(
if(m==10)
十进制转换成其他进制
{
}
if(m==2||m==8||m==16) 其他进制转换成十进制
,且其他任意进制的相
printf(请给定一个需要转换的10进制数:
scanf(
printf(请输入需要转换成的进制数:
scanf(
DtoM(x,t);
互转换
{
}
printf(
DestroyStack(S); 销毁栈S,栈S不再存在
break;
MtoD();
printf(给定要转换成的进制M:
scanf(
DtoM(y,s);
case 2: exit(0);
default:{ printf(输入有误,请重新选择:
14
goto loop;}
}
printf(
}
}
5.课程设计心得及存在问题
心得:多多上机实践,才能学到真正的东西。在切身
体会当中,发现了数值转换的精华
所在,例如说怎么样取十六进制数,并且进栈出栈。将栈和数组结合,
也可以达到要求。
问题:切身体会,方能学以致用!对于数值转换的基本原理,必须清楚,才能将程序
中
的设计思想完整的贯穿下来。
15