算法與編程實踐內容安排 進制轉換

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;
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章