小习题:n进制转换为十进制

一.题目概要:

编程实现任意输入一个数,并输入几进制,则程序根据你所输入的信息,将其转化为十进制并输出,如果数据与进制不符合,则输出错误并退出程序。

二.算法分析: 

(1)为了方便16进制时的判断,所以我们得事先将字母统一为大写字母。

void strupr(char *p)
{
	while(*p)
	{
		if(*p>='a' && *p<='z')
		{
			*p-='a'-'A';
		}
		p++;
	}
}

(2)判断你所输入的数据与进制是否符合,若不满足,则直接退出程序(通过exit(0)实现)。

for(int i=0;i=m && a[i]<'A') || a[i]-'A'+10>=m)
	{
		//(a[i]-'0'>=m && a[i]<'A')用于判断数字是否符合2进制或8进制
		//a[i]-'A'+10>=m用以判断是否符合16进制
		printf("数字与进制不符合!\n");
		exit(0);
		//break;
	}
}

(3)开始对你所输入的数据进行相关的判断以及转换。

if(m==2)
{
	m1=1;
	for(int j=strlen(a)-1;j>=0;j--)
	{
		num=a[j]-'0';
		sum+=num*m1;    //通过sum来存每位转化的数字
		m1*=2;
	}
	printf("%d\n",sum);
}
else if(m==8)
{	
	m1=1;
	for(int j=strlen(a)-1;j>=0;j--)
	{
		num=a[j]-'0';
		sum+=num*m1;  //通过sum来存每位转化的数字
		m1*=8;
	}
	printf("%d\n",sum);
}
else if(m==16)
{
	m1=1;
	for(int j=strlen(a)-1;j>=0;j--)
	{
		if(a[j]>='A')    //判断字符的形式进行转化
			num=a[j]-'A'+10;    
		else
			num=a[j]-'0';
			
		sum+=num*m1;    //通过sum来存每位转化的数字
		m1*=16;
	}
	printf("%d\n",sum);
}

三.整体代码:

#include
#include
#include

void strupr(char *p)
{
	while(*p)
	{
		if(*p>='a' && *p<='z')
		{
			*p-='a'-'A';
		}
		p++;
	}
}

int main()
{
	char a[1000]={0,};
	int m,sum=0;	
	int m1=0;
	int num;
	printf("请输入一个数字:");
	scanf("%s",a);
	printf("该数字的进制为:");
	scanf("%d",&m);
	strupr(a);//把小写字母统一转化为大写字母,方便后续统一判断
	printf("%s\n",a);
	for(int i=0;i=m && a[i]<'A') || a[i]-'A'+10>=m)
		{
			//(a[i]-'0'>=m && a[i]<'A')用于判断数字是否符合2进制或8进制
			//a[i]-'A'+10>=m用以判断是否符合16进制
			printf("数字与进制不符合!\n");
			exit(0);
			//break;
		}
	}

	if(m==2)
	{
		m1=1;
		for(int j=strlen(a)-1;j>=0;j--)
		{
			num=a[j]-'0';
			sum+=num*m1;
			m1*=2;
		}
		printf("%d\n",sum);
	}
	else if(m==8)
	{	
		m1=1;
		for(int j=strlen(a)-1;j>=0;j--)
		{
			num=a[j]-'0';
			sum+=num*m1;
			m1*=8;
		}
		printf("%d\n",sum);
	}
	else if(m==16)
	{
		m1=1;
		for(int j=strlen(a)-1;j>=0;j--)
		{
			if(a[j]>='A')
				num=a[j]-'A'+10;
			else
				num=a[j]-'0';
			
			sum+=num*m1;
			m1*=16;
		}
		printf("%d\n",sum);
	}
	return 0;
}

四.结果:

(1)满足条件:

(2)不满足条件:

你可能感兴趣的:(典型例题,知识扩展,c语言,习题)