数值转换的实现

目录

最近正在做大作业,学习数据结构中,做了一个小程序,实现了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&#8211;;

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(&#8211;i;i>=0;&#8211;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(&#8211;i;i>=0;&#8211;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]!=&#8217;\0&#8242;;i++){

if(s[i]>=&#8217;0&#8217;&&s[i]<=&#8217;9&#8242;)

n=n*16+s[i]-&#8216;0&#8242;;

if(s[i]>=&#8217;a&#8217;&&s[i]<=&#8217;f&#8217;)

n=n*16+s[i]-&#8216;a&#8217;+10;

if(s[i]>=&#8217;A&#8217;&&s[i]<=&#8217;F&#8217;)

n=n*16+s[i]-&#8216;A&#8217;+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]!=&#8217;\0&#8242;;i++){

if(s[i]>=&#8217;0&#8217;&&s[i]<=&#8217;9&#8217;)

n=n*16+s[i]-&#8216;0&#8242;;

if(s[i]>=&#8217;a&#8217;&&s[i]<=&#8217;f&#8217;)

n=n*16+s[i]-&#8216;a&#8217;+10;

if(s[i]>=&#8217;A&#8217;&&s[i]<=&#8217;F&#8217;)

n=n*16+s[i]-&#8216;A&#8217;+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&#8211;){

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]>=&#8217;A&#8217;&&c[i]<=&#8217;F&#8217;)||(c[i]>=&#8217;0&#8217;&&c[i]<=&#8217;9&#8242;)||(c[i]>=&#8217;a&#8217;&&c[i]

<=&#8217;f&#8217;))){

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&#8211;){

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&#8211;)

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]>=&#8217;A&#8217;&&y[i]<=&#8217;F&#8217;)||(y[i]>=&#8217;0&#8217;&&y[i]<=&#8217;9&#8242;)||(y[i]

>=&#8217;a&#8217;&&y[i]<=&#8217;f&#8217;)))

{ 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                          &#8212;&#8212;第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;

}

}

//不支持小数的转换,应用范围很小,输入很大的数 会出现问题。

}