(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;开始输出也就是从数组a【】中最后一个余数开始输出。
直到i=0;
**本函数定义了两个数组一个存储1-9,A到F这16个字符的另一个存储10进制数除以q进制数的余数的。
3.voidprind_d(intn,intc)递归的方法把十进制转换成其他进制数。
(1)定义一个递归函数用switch语句判断转换成的四种情况
(2)Case10,输入十进制数n,判断是否<0,如果是则putchar('-');然后if(n/10)判断商是否为0;再执行prind_d(n/10,10);递归,直到商为0时停止。
跳过prind_d(n/10,10),执行putchar(n%10+'0');,输出余数,然后倒序的方式输出所有余数。
(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=(int*)realloc(),并把首地址赋给s.base。
栈的栈顶指针为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,然后减1,判断e>9是否成立,如果是则以字符的形式输出输出否则以整数的形式输出。
4.封装在三个函数中Array(),Stack(),Prind()把M进制数转换为其他进制数。
(1)Array(),Prind()。
输入M进制数x,然后转换成十进制数m,分别再用voidarray(intN),voidprind_d(intn,intc)这两个函数转换成y进制数。
(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.主要函数的程序流程图,实现设计中主程序和其他子模块的算法,以流程图的形式表示。
4.画出函数之间的调用关系图。
四、调试分析
调试分析:
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进制数,而不是通过十进制这个桥梁。
五、测试结果
栈方法:
递归方法:
6、
.用户手册:
用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返回其值,并返回OK,否则返回ERROR
inte;
//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:
";
prind_d(m,c);
cout<}
////////////////////////////////////////////////
voidmain()
{printf("\n\n----------------------------------------------------------------------------\n\n");
printf("****欢迎使用本程序!
本程序完成数制转换M进制数转换成N进制数。
****\n\n");
printf("----------------------------------------------------------------------------\n");
do{
printf("请按键选择\n");
printf("****************数组1***************\n");
printf("****************栈2***************\n");
printf("****************递归3***************\n");
intn;
cin>>n;
switch(n)
{
case1:
Array();continue;
case2:
Stack();continue;
case3:
Prind();continue;
default:
printf("输入有误");
}
}
while
(1);
}