数制转换问题-课程设计报告

玛丽莲梦兔
560次浏览
2021年01月03日 19:43
最佳经验
本文由作者推荐

心理健康日-我的老师魏巍阅读答案

2021年1月3日发(作者:费清涛)




中北大学


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;iscanf(
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

坚持真理的名言-不知所措造句


睡莲图片-规则的拼音


无奈花落去-三八贺卡


富贵竹发黄怎么办-离子反应ppt


玫瑰图片大全-咖啡物语


郊游歌-植树节的资料


抠-我的好妈妈


吃核桃有什么好处-猎场插曲