算法与编程实践内容安排 进制转换

1.  课题功能描述

本程序的功能,就是实现自然数的十进制、二进制、八进制、十六进制转换。即根据用户选择的进制和输入的数据,转换得到该数所对应的十进制、二进制、八进制和十六进制数。

 

2.  问题详细描述

程序运行时,首先由用户选择输入数据所使用的进制,如:

欢迎使用进制转换程序!

       1. 十进制

       2. 二进制

       3. 八进制

       4. 十六进制

       0. 退出

请选择输入数据的进制:

用户选择后,再输入数据,如选择3(八进制),则显示:

请输入八进制数据:

输入数据后,程序进行转换,最后输出该数所对应的十进制、二进制、八进制和十六进制数。如输出:

转换结果:

       十进制  21809

       二进制  101010100110001

       八进制  52461

       十六进制  5531


#include<stdio.h>
#include<string.h>
#include<ctype.h>

int menu(){
	int n;
	printf("欢迎使用进制转换程序!\n");
	printf("	1. 十进制\n");
	printf("	2. 二进制\n");
	printf("	3. 八进制\n");
	printf("	4. 十六进制\n");
	printf("	0. 退出\n");
	printf("请选择输入数据的进制:\n");
	while(true){
		scanf("%d", &n);
		switch(n){
			case 1:printf("请选择输入十进制数据:\n");
				return 10;
			case 2:printf("请选择输入二进制数据:\n");
				return 2;
			case 3:printf("请选择输入八进制数据:\n");
				return 8;
			case 4:printf("请选择输入十六进制数据:\n");
				return 16;
			case 0:printf("退出!\n");
				return 0;	
			default:printf("选择有误!请重新选择!"); 
		}
	}
}

//把r进制的数转换成十进制
int RtoD(int r, char *n){
	int res = 0, tmp, base = 1, len;
	len = strlen(n) - 1;
	while(len >= 0){
		if(isdigit(n[len]))
			tmp = n[len] - '0';
		else if(islower(n[len]))
			tmp = n[len] - 'a' + 10;
		else
			tmp = n[len] - 'A' + 10;
		res += tmp * base;
		base *= r;
		len--;
	}
	return res;
}

//十进制转换成对应的r进制
void DtoR(int n,int r)
{
    if(n)
    {
        DtoR(n/r,r);
        printf("%X", n%r);
    }    
}

void print(int n){
	printf("十进制:%d\n", n);
	printf("二进制:");
	DtoR(n, 2);
	printf("\n");
	printf("八进制:");
	DtoR(n, 8);
	printf("\n");
	printf("十六进制:");
	DtoR(n, 16);
	printf("\n");
}

//判断数是否合法
int judge(char *s, int n){
	int i, r = n - 1, tmp;
	for(i = 0; s[i] != '\0'; i++){
		if(isdigit(s[i]))
			tmp = s[i] - '0';
		else if(islower(s[i]))
			tmp = s[i] - 'a' + 10;
		else if(isupper(s[i])) 
			tmp = s[i] - 'A' + 10;
		else
			return 0;
		if(tmp > r)
			return 0;
	}
	return 1;
}

int main(){
	int N, num;
	char str[1000];
	while(N = menu(), N) {
		scanf("%s", str);
		if(!judge(str, N)){
			printf("输入数据有误!请重新输入!\n");
			continue;
		}
		num = RtoD(N, str);
		print(num);
	}
	return 0;
} 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值