数值转换的实现

最近正在做大作业,学习数据结构中,做了一个小程序,实现了10进制与2-16进制的互转,以及2进制与16进制的互转,程序并不是很完善,不能实 现小数的转换,只能实现正整数的转换,还有一些小的bug。程序的实现主要利用顺序栈的特性,先进后出,利用除D取余数的方法来实现。程序是 VC++6.0编译通过的。 完整源文件请下载num-conver.c源代码如下

头文件

/**
*I/O函数
*标准库函数
*字符串函数
*字符操作函数
*非C标准库中的头文件
*内存分配
*数学函数
*/

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#include "conio.h"
#include "malloc.h"
#include "math.h"
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define Stack_Size 50

定义顺序栈

/*
*定义顺序栈
*/

typedef struct{
int elem[Stack_Size];
int top;
}SeqStack;
/*
*顺序栈的入栈操作
*/

int Push(SeqStack *S,int x){
if(S->top==Stack_Size-1)
printf("栈已满无法进栈");
S->top++;
S->elem[S->top]=x;
return (TRUE);
}
/*
*顺序栈的出栈操作
*/

int Pop(SeqStack *S,int *x){
int i;
if(S->top==-1){
printf("栈空无法出栈");
return (FALSE);
}else{
*x=S->elem[S->top];//弹出栈顶元素
S->top--;
i=*x;
printf("%d",i);
return (TRUE);
}
}

16进制的转换

oid Pop16(int x){//16进制的出栈操作
char b[17]={"0123456789ABCDEF"};
int c[100],d,i=0,x1;
x1=x;
do{c[i]=x%16;i++;x/=16;}
while(x!=0);
printf("将%d从10进制转换到16进制,结果为:",x1);
for(--i;i>=0;--i){
d=c[i];printf("%c",b[d]);
}
printf("\n");
}
void Pop10_16(int x){//16进制的出栈操作
char b[17]={"0123456789ABCDEF"};
int c[100],d,i=0;
do{c[i]=x%16;i++;x/=16;}
while(x!=0);
for(--i;i>=0;--i){
d=c[i];printf("%c",b[d]);
}
printf("\n");
}

输出提示性语言

void input(){//输出提示性语言
printf("\n\t请在下列功能中选择(1~4):");
printf("\n");
printf("\n\t\t1. 10进制转换");
printf("\n\t\t2. 转换到10进制");
printf("\n\t\t3. 2进制16进制互换");
printf("\n\t\t4. 退出");
printf("\n");
printf("\n\t请选择你要进行的操作:(1~4)\n默认输入的所有数据都是正整

数,均为int类型\n请按提示来输入:"
);
printf("\n");
}

10进制转换

void ten_to_other(){//10进制转其他进制
int z,x,c1,*c2;
SeqStack *ST;//申明一个顺序栈指针
ST=(SeqStack*)malloc(sizeof(SeqStack));
c2=(int*)malloc(sizeof(int));//分配内存空间
ST->top=-1;
input: printf("请输入要转换的正整数:\n");//input跳转语句标记
scanf("%d",&c1);
x=c1;
if(c1<0){
printf("                        您输入的不是正整数,请重新

输入!\n"
);goto input;
}
input1: printf("请输入要转换为几进制(请输入2-16之间的数):\n");
scanf("%d",&z);
if(z<=1){
printf("                         您输入的不是2-16之间的数,请重新输入!

\n"
);goto input1;
}
if(z>=2&&z<=15){
while(c1){
Push(ST,c1%z);c1/=z;
}//调用顺序栈的入栈操作函数
printf("将%d从10进制转换到%d进制,结果为:",x,z);
do{Pop(ST,c2);}//调用顺序栈的出栈操作函数
while(ST->top!=-1);
printf("\n");
}
else if(z==16){
Pop16(c1);//调用顺序栈的出栈操作函数
}
else{
printf("本程序暂不支持其他的进制转换\n                              请

重新输入\n\n"
);
}
}

16进制转换10进制

void sixteen_to_ten(char s[]){//数组s[]里面存放键盘输入的16进制数,16进制

10进制
int n=0,i;
char x[Stack_Size];
strcpy(x,s);
for(i=0;s[i]!='\0';i++){
if(s[i]>='0'&&s[i]<='9')
n=n*16+s[i]-'0';
if(s[i]>='a'&&s[i]<='f')
n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')
n=n*16+s[i]-'A'+10;
}
printf("将%s从16进制转换到10进制,结果为:%d\n",x,n);
}
sixteen_to_ten_1(char s[]){//16进制转10进制
int n=0,i;
char x[Stack_Size];
strcpy(x,s);
for(i=0;s[i]!='\0';i++){
if(s[i]>='0'&&s[i]<='9')
n=n*16+s[i]-'0';
if(s[i]>='a'&&s[i]<='f')
n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')
n=n*16+s[i]-'A'+10;
}
return n;
}

其他进制转换为10进制

void other_to_ten(){//其他进制转为10进制
int i=0,j,c1,x=0,z,xl[Stack_Size];
char c[100];
input2: printf("请输入要从几进制(请输入2-16之间的数)转换到10进制:\n");
scanf("%d",&c1);
if(c1<=1||c1>16){
printf("                        您输入的不是2-16之间的数,

请重新输入!\n"
);goto input2;
}
if(c1>=2&&c1<=15){
input3: printf("请输入要转换的正整数:\n");
scanf("%d",&z);
if(z<0){
printf("                         您输入的不是正整

数,请重新输入!\n"
);goto input3;
}
j=z;
while(z){
xl[i]=z%10;
z/=10;
i++;
}
for(i=i-1;i>=0;i--){
x+=xl[i]*(int)pow(c1,i);
}
printf("将%d从%d进制转换到10进制,结果为:%d",j,c1,x);
}else if(c1==16){
input8: printf("请输入要转换的16进制数:\n");
scanf("%s",c);
if(!((c[i]>='A'&&c[i]<='F')||(c[i]>='0'&&c[i]<='9')||(c[i]>='a'&&c[i]

<='f'))){
printf( "                         您输入的不是16进制数,请重新输入

!\n "
);goto input8; }
sixteen_to_ten(c);
}else{
printf("本程序暂不支持其他的进制转换\n");
}
}

2进制与10进制的互转

er_to_ten(int x){//2进制转10进制
int i=0,s=0,xl[Stack_Size];
while(x){
xl[i]=x%10;
x/=10;
i++;
}
for(i=i-1;i>=0;i--){
s+=xl[i]*(int)pow(2,i);
}
return s;
}
void ten_to_er(int x,char y[]){//10进制转2进制
int *c2;
SeqStack *ST;
ST=(SeqStack*)malloc(sizeof(SeqStack));
c2=(int*)malloc(sizeof(int));
ST->top=-1;
while(x){
Push(ST,x%2);x/=2;
}
printf("将%s从16进制转换到2进制,结果为:",y);
do{Pop(ST,c2);}
while(ST->top!=-1);
printf("\n");
}

2进制和16进制的互转

void check(){//2进制与16进制的互转
int x1,x2,s,x,i=0,x3,j;
char y[Stack_Size],xl[Stack_Size];
printf("请输入要从哪里开始转换(输入2或者16):\n");
scanf("%d",&x1);
printf("要转换为的进制(输入2或者16):\n");
scanf("%d",&x2);
if(x1==2&&x2==16){
input6: i=0;
printf("请输入要转换的2进制数:\n");
scanf("%d",&x);
x3=x;
while(x){
xl[i]=x%10;
x/=10;
i++;
}
for(j=i-1;j>=0;j--)
if(!(xl[j]==1&&xl[j]!=0||xl[j]==0&&xl[j]!=1))
{ printf( "                         您输入的不是2进制数,请重

新输入!\n "
);goto input6; }
s=er_to_ten(x3);
printf("将%d从%d进制数转换成%d进制的结果为:",x3,x1,x2);
Pop10_16(s);
}else if(x1==16&&x2==2)
{
input7: printf("请输入要转换的16进制数:\n");
scanf("%s",y);
for(i=0;i<strlen(y);i++)
if(!((y[i]>='A'&&y[i]<='F')||(y[i]>='0'&&y[i]<='9')||(y[i]

>='a'&&y[i]<='f')))
{ printf( "                         您输入不是16进制数,请

重新输入!\n "
);goto input7; }
s=sixteen_to_ten_1(y);
ten_to_er(s,y);
} else{
printf("输入的数据有错误,请检查或者其他不支持的转换\n

请重新输入\n\n"
);
}
}

main函数

void main(){
system("color 2");
int a,b;
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

★★★★★★★★★★★\n"
);
printf("\n                     ★★★★★欢迎进入数值转换系统★★

★★★\n"
);
printf("\n                          ------第1小组大作业\n");
printf("\n 计算机应用(2)班第1组全体组员:XX XXX XXX XX XX XX XX XX

\n"
);
printf("\n\n★★★★★★★★★★★★★★★★★★★★★★★★★★★

★★★★★★★★★★★★★\n"
);
printf("\n\t\t                  数值转换系统\n");
printf

("========================================================================

========\n"
);
printf("\t    *************************主菜单

**************************\n"
);
loop: input();
while(1){
scanf("%d",&a);
switch(a){
case 1: ten_to_other();input();break;       //10进

制转换到2 8 16 进制
case 2: other_to_ten();input();break;           //任意进制转10

进制
case 3: check();input();break;                  //2和16进制的

互转
case 4: printf("                     谢谢使用!本程序仅供交流学

习,版权所有!\n\n"
);exit(0);break;      //退出
default :printf("

输入错误!\n请按照说明重新输入,输入1~4的数字!\n"
);goto loop;break;
}
}
//不支持小数的转换,应用范围很小,输入很大的数 会出现问题。
}