进制转换问题
前言:上学期的数据结构课设写的,拿了优秀(代价就是爆肝完拉了两天肚子),代码如下,功能十分齐全。其实只要明白进制转换的过程就能写出来,下面代码分别实现了
1.十进制数转换成任意进制数
2.任意进制数转换成十进制数。
3.任意进制数转换成任意进制数。
注意!!!这些数可以是整数也可以是小数,进制最高能转换到63进制(10对应A,11对应B,依次按照ascll码表往后对照知道结束
注释的也比较齐全,主要用顺序栈写的。看不懂的地方可以评论留言或者私信。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define Stack_Size 100
#define Max_Size 100
#define ok 1
#define no 0
int CTI(char a);
typedef int StackElementType;
/********************************************************
********************创建所需求栈函数********************
********************************************************/
typedef struct
{
StackElementType elem[Stack_Size];
int top;
int base;
}SeqStack;
void InitStack(SeqStack *S)//初始化栈
{
S->top=0;
S->base=0;
}
int Push(SeqStack *S,StackElementType x)//进栈,其中x代表的是进栈元素
{
if(S->top==Stack_Size-1)
return no;
S->top++;
S->base=1;
S->elem[S->top]=x;
return ok;
}
int Pop(SeqStack *S/*,StackElementType *x*/)//出栈,x传地址取出值
{
if(S->top==0)
return no;
else
{
S->top--;
return S->elem[S->top];
}
}
int GetTop(SeqStack *S,StackElementType *x)//得到栈顶元素,与出栈操作区别的只取不去
{
if(S->top==-1)
return no;
else {
*x=S->elem[S->top];
return ok;
}
}
/****************************************************************
*******************分两部分转换进制的功能函数*******************
*****************************************************************/
void FTX(double bi,int x)
{
printf(".");
int i,ch,n=0;
//printf("bi::%lf %d ",bi,x);
while(bi!=0&&n<8)
{
bi=x*bi;
i=(int)bi;
//printf(" i:%d ",i);
bi-=i;
if(i>9)
{
ch='A'+i-10;
printf("%c",ch);
}
else
printf("%d",i);
n++;
}
}
void ITX(int ai,int x)
{
int z=0,i=0;
//printf("--%d %d--",ai,x);
int zi[Max_Size];
while(ai)
{
z=ai%x;
ai/=x;
zi[i++]=z;
}
i--;
for(;i>=0;i--)
{
if(zi[i]>9)
printf("%c",zi[i]+'A'-10);
else printf("%d",zi[i]);
}
}
/****************************************************************
**************十进制数转换成任意进制数功能函数******************
*****************************************************************/
void TTA(int test)//十进制数转换成任意进制数功能函数
{
int ex;
int count=0,i,j,ai=0;
double bi=0;
char a[Max_Size];
SeqStack S;
InitStack(&S);
printf("请输入一个数:");
scanf("%s",a);
for(ex=0;ex<strlen(a);ex++)
{
if(a[ex]=='.')//防止用小数点进行比较
continue;
else if(a[ex]>=(9+'0'))
{
printf("输入有误,强制退出程序\n");
exit(0);
}
}
printf("请输入要转换的进制数:");
scanf("%d",&i);
printf("转换之后的数:");
for(j=0;j<strlen(a);j++)//101.1
{
if(a[j]=='.')
{
count=j;
continue;
}
Push(&S,a[j]);
}
if(count==0)//假如没有输入小数,防止卡死,令count等于j,直接跳过第一个取小数部分的while
count=j;
while(S.top!=count)//得到bi
{
bi=bi*0.1+(S.elem[S.top]-'0')*0.1;
Pop(&S);
}
while(S.base!=count+1)//得到ai
{
ai=ai*10+(S.elem[S.base]-'0');
S.base++;
}
//printf("ai::%d ",ai);
ITX(ai,i);
if(ai==0)
printf("%c",'0');
if(bi!=0)
FTX(bi,i);
printf("\n");
}
/****************************************************************
*******************任意进制数转换为十进制数*********************
*****************************************************************/
void NTT(test)
{
int ex;
int i,j;
char a[Max_Size];
double z=0;
int count = 0;
SeqStack S;
InitStack(&S);
printf("请输入要转换的数字:");
scanf("%s",a);
printf("请输入该数字的进制数:");
scanf("%d",&i);
for(ex=0;ex<strlen(a);ex++)
{
if(a[ex]=='.')//防止用小数点进行比较
continue;
else if(a[ex]>(i+'0'))
{
printf("输入有误,强制退出程序\n");
exit(0);
}
}
for(j=0;j<strlen(a);j++){//101.101
if(a[j]=='.')
{
count = -1*(strlen(a) - j - 1);
continue;
}
Push(&S,a[j]);
}
while(S.top!=0)
{
z+=pow(i,count++)*CTI(S.elem[S.top--]);
//printf("%d %lf %d\n",count,z,S.top);
}
printf("转换之后的数:%f\n",z);
printf("\n");
}
int CTI(char a)
{
if(a>='A'&&a<='Z')
{
a=a-'A'+1+9;
}
else
{
a=a-'0';
}
return a;
}
/********************************************************
******************任意进制转任意进制********************
*********************************************************/
//先将任意进制数转换为十进制
//再将十进制数转换为所需进制数
double XTT(int x)//x是初始进制值
{
int ex;
int j;
char a[Max_Size];
double z=0;
int count = 0;
SeqStack S;
InitStack(&S);
printf("请输入要转换的数字:");
scanf("%s",a);
for(ex=0;ex<strlen(a);ex++)
{
if(a[ex]=='.')//防止用小数点进行比较
continue;
else if(a[ex]>(x+'0'))
{
printf("输入有误,强制退出程序\n");
exit(0);
}
}
for(j=0;j<strlen(a);j++){//101.101
if(a[j]=='.')
{
count = -1*(strlen(a) - j - 1);
continue;
}
Push(&S,a[j]);
}
while(S.top!=0)
{
z+=pow(x,count++)*CTI(S.elem[S.top--]);
}
return z;
}
void TTX(double x,int n)//x==a,n==i
{
int ai=0;
double bi=0;
printf("最终转换之后的数:");
ai=(int)x;
bi=x-ai;
ITX(ai,n);
if(ai==0)
printf("%c",'0');
if(bi!=0)
FTX(bi,n);
printf("\n");
}
/********************************************************
***********************主函数部分************************
*********************************************************/
int main()
{
int menu,test=1;
//int n=1;
while(1)
{
printf("**********************《欢迎使用进制转换系统》********************\n");
printf("* *\n");
printf("* <请参照目录输入您想实现的功能函数的编号> *\n");
printf("* *-* *-* 1.十进制数转换为任意进制数 *-* *-* *\n");
printf("* *-* *-* 2.任意进制数转换为十进制数 *-* *-* *\n");
printf("* *-* *-* 3.任意进制数转换为任意进制数 *-* *-* *\n");
printf("* *-* *-* 4.清理界面 *-* *-* *\n");
printf("* *-* *-* 5.退出系统 *-* *-* *\n");
printf("******************************************************************\n");
printf("------->");
scanf("%d",&menu);
printf("\n");
switch(menu)
{
case 1:
{
printf("~~~~~~~~~~~~~~~~现在是十进制数转换为任意进制数模式~~~~~~~~~~~~~~\n");
TTA(test);
break;
}
case 2:
{
printf("~~~~~~~~~~~~~~~现在是任意进制数转换为十进制数模式~~~~~~~~~~~~~~\n\n");
NTT(test);
break;
}
case 3:
{
printf("~~~~~~~~~~~~~~~现在是任意进制数转换为任意进制数数模式~~~~~~~~~~~~~\n");
int m,n;//m代表初始进制,n代表最终进制,x代表中间值
double x;
printf("请输入初始进制值:");
scanf("%d",&m);
x=XTT(m);
printf("请输入最终进制值:");
scanf("%d",&n);
TTX(x,n);
break;//任意进制转任意进制
}
case 4:
{
system("cls");
break;
}
case 5:exit(0);break;
default:printf("!!!警告:输入编号有误,请检查后重新输入 !!!\n\n");
}
}
return 0;
}