/*
写一函数,输入一个十六进制数,输出相应的十进制数
*/
#include<stdio.h>
#include<string.h>
int HexCharValue(char c)
{
if((c>='0')&&(c<='9'))
return (c - '0');
else if((c>='a')&&(c<='f'))
return (c-'a'+10);
else if((c>='A')&&(c<='F'))
return (c-'A'+10);
return 0;
}
int GetHexLen(char * c)
{
int len = 0;
while(*c++!='\0')
len++;
return len;
}
unsigned int Hex2Decimal(char *c, int len)
{
unsigned int decimal = 0;
int step = 1;
for(int i=0; i<len; i++)
{
step = step*16;
//printf(" %c \n", *(c+len-i-1));
decimal += HexCharValue(*(c+len-i-1))*step/16;
}
return decimal;
}
void main()
{
unsigned int dec;
char Hex[20];
int len;
printf("欢迎使用!!!\n");
printf("本程序功能说明:输入一个十六进制数,输出相应的十进制数。\n");
printf("请输入您想要转换的十六进制数:");
scanf("%s",&Hex);
len = GetHexLen(Hex);//获取十六进制数位数,与len = strlen(Hex);功能相同
dec = Hex2Decimal(Hex,len);
printf("\n将十六进制 %s 转换为十进制的值是: %d \n",Hex,dec);
}
//Ps:粘上来缩进都乱了,将就,将就。
程序狠烂,高手误看,看完会有内伤哈,呵呵~~
大家看不下去就拍砖吧,俺回家盖房喽
上面那个是第一版,下面这个是第二版,功能扩充了一点点
/*
Version 1:写一函数,输入一个十六进制数,输出相应的十进制数
Version 2:输入一个十进制的数,然后选择需要转成的进制(二,八,十六),程序输出转换后的数字(暂不支持负数,小数)
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//这里插播一下枚举的用法:1.enum 枚举名{枚举值表}; 2.如何在定义时给枚举赋值;
//binary(二进制),octonary(八进制),decimal(十进制),hexadecimal(十六进制)
enum NumSys{BIN=2, OCT=8, DEC=10, HEX=16};
int HexValueOutput(int *result,int len)
{
for(int i=len;i>=0;i--)
{
if(result[i]>=10)
{
result[i]=result[i]-10+'A'; //这里这样处理完全是我自己瞎糊弄的,暂时先这么处理,见谅见谅,真狗血哈~
printf("%c",result[i]);
}
else
{
printf("%d",result[i]);
}
}
return 0;
}
int GetNumLen(char * c)
{
int len = 0;
while(*c++!='\0')
len++;
return len;
}
//十进制转二进制
/*
算法:用2辗转相除至结果为1,将余数和最后的1从下向上倒序写就是结果
*/
void Dec2Bin(int Dec)
{
int result[40],len;
int decLocal;
decLocal = Dec;
printf("\nDec2Bin\n");
for(int i=0;i<40;i++)
{
result[i] = decLocal%2;
decLocal = decLocal/2;
if(1==decLocal)
{
i=i+1;
len = i;
result[i] = 1;
break;
}
}
if((40==i)&&(1!=decLocal))
{
printf("This number is too big to convert to Bin\n");
}
else
{
printf("十进%d转换为二进制的结果是",Dec);
for(int j=len;j>=0;j--)
printf("%d",result[j]);
printf("\n");
}
}
int Dec2Oct(int Dec)
{
int result[40],len;
int decLocal;
decLocal = Dec;
printf("\nDec2Oct\n");
for(int i=0;i<40;i++)
{
result[i]=decLocal%8;
decLocal = decLocal/8;
if(7>=decLocal)
{
i++;
len = i;
result[i] = decLocal;
break;
}
}
if((40==i)&&(7<decLocal))
{
printf("This number is too big to convert to Bin\n");
}
else
{
printf("十进%d转换为八进制的结果是",Dec);
for(int j=len;j>=0;j--)
printf("%d",result[j]);
printf("\n");
}
return 0;
}
int Dec2Hex(int Dec)
{
int result[40],len;
int decLocal;
decLocal = Dec;
printf("\nDec2Hex\n");
for(int i=0;i<40;i++)
{
result[i]=decLocal%16;
decLocal = decLocal/16;
if(16>=decLocal)
{
i++;
len = i;
result[i] = decLocal;
break;
}
}
if((40==i)&&(16<decLocal))
{
printf("This number is too big to convert to Bin\n");
}
else
{
printf("十进%d转换为十六进制的结果是",Dec);
HexValueOutput(result,len);
printf("\n");
}
return 0;
}
void Converse(int * dec,int *numsys)
{
int result = 0;
switch(*numsys)
{
case BIN:
Dec2Bin(*dec);
break;
case OCT:
result = Dec2Oct(*dec);
break;
case HEX:
result = Dec2Hex(*dec);
break;
}
//printf("十进%s转换为%d进制的结果是%d ",*dec,*numsys,result);
}
void getNum(int * dec,int *numsys)
{
int flag = true;
//int num;
printf("欢迎使用!!!\n");
printf("本程序功能说明:用户输入一个十进制数,并选择需要转成的进制,程序输出转换后的数值。\n");
printf("Step1:请输入您想要转换的十进制数:");
scanf("%d",dec);
while(flag)
{
printf("Step2:请选择转换的进制(2,8,16):");
//fflush(stdin);
//num = getchar(); //这里如果用getchar()获取用户的值,得到的是错误的值,这是为什么呢?
//添加了fflush(stdin)也不行哦~~~
scanf("%d",numsys);
printf("\n用户选择的进制是%d ",*numsys);
switch(*numsys)
{
case BIN:
case OCT:
case DEC:
case HEX:
flag = false;
break;
default:
printf("您的输入有误,请重新输入。");
fflush(stdin);
break;
}
}
}
int main(void)
{
int dec,numsys;
getNum(&dec,&numsys);
Converse(&dec,&numsys);
return 0;
}