数值转换的实现
目录
最近正在做大作业,学习数据结构中,做了一个小程序,实现了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;
}
}
//不支持小数的转换,应用范围很小,输入很大的数 会出现问题。
}