小程序:进制转换

/*
写一函数,输入一个十六进制数,输出相应的十进制数
*/
#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;
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值