1. 程序功能及流程介绍
本程序的主要功能是将十六进制数转换为八进制数。下面是程序的主要流程:
用户输入一个十六进制数;
程序将该数转换为二进制数;
程序将二进制数转换为八进制数;
程序输出转换后的八进制数。
2. 程序实现方法
2.1 计算二进制数
程序需要将输入的十六进制数转换为二进制数。为了做到这一点,需要将每个十六进制数位转换成等价的四位二进制数。下面是将单个十六进制数位转换为二进制数的方法:
假设十六进制数的一个数位为x(x为0~F的任意一个),则将其转换为二进制需要按照以下规律进行:
当x等于0时,其二进制数为0000;
当x等于1时,其二进制数为0001;
当x等于2时,其二进制数为0010;
当x等于3时,其二进制数为0011;
当x等于4时,其二进制数为0100;
当x等于5时,其二进制数为0101;
当x等于6时,其二进制数为0110;
当x等于7时,其二进制数为0111;
当x等于8时,其二进制数为1000;
当x等于9时,其二进制数为1001;
当x等于A时,其二进制数为1010;
当x等于B时,其二进制数为1011;
当x等于C时,其二进制数为1100;
当x等于D时,其二进制数为1101;
当x等于E时,其二进制数为1110;
当x等于F时,其二进制数为1111。
以十六进制数“0x3F7”为例,该数转换为二进制数的过程如下:
0x3F7 → 0011 1111 0111
其中,“0x”表示十六进制数的前缀,它不是要进行转换的部分。
2.2 计算八进制数
程序将二进制数转换为八进制数的方法比较简单,只需要将每三位二进制数转换为一个八进制数即可。注意如果二进制数的位数不是三的倍数,程序需要在左侧补零,使其位数变为三的倍数。
以转换后的二进制数“011 1111 0111”为例,该数转换为八进制数的过程如下:
011 1111 0111 → 7 7 7
3. 程序代码
程序代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char hex_num[10];
char bin_num[40];
char oct_num[15];
int i, j, k;
int len;
printf("请输入一个十六进制数:");
scanf("%s", hex_num);
len = strlen(hex_num);
j = 0;
for(i=0;i<len;i++)
{
switch(hex_num[i])
{
case '0':
bin_num[j++] = '0';
bin_num[j++] = '0';
bin_num[j++] = '0';
bin_num[j++] = '0';
break;
case '1':
bin_num[j++] = '0';
bin_num[j++] = '0';
bin_num[j++] = '0';
bin_num[j++] = '1';
break;
case '2':
bin_num[j++] = '0';
bin_num[j++] = '0';
bin_num[j++] = '1';
bin_num[j++] = '0';
break;
case '3':
bin_num[j++] = '0';
bin_num[j++] = '0';
bin_num[j++] = '1';
bin_num[j++] = '1';
break;
case '4':
bin_num[j++] = '0';
bin_num[j++] = '1';
bin_num[j++] = '0';
bin_num[j++] = '0';
break;
case '5':
bin_num[j++] = '0';
bin_num[j++] = '1';
bin_num[j++] = '0';
bin_num[j++] = '1';
break;
case '6':
bin_num[j++] = '0';
bin_num[j++] = '1';
bin_num[j++] = '1';
bin_num[j++] = '0';
break;
case '7':
bin_num[j++] = '0';
bin_num[j++] = '1';
bin_num[j++] = '1';
bin_num[j++] = '1';
break;
case '8':
bin_num[j++] = '1';
bin_num[j++] = '0';
bin_num[j++] = '0';
bin_num[j++] = '0';
break;
case '9':
bin_num[j++] = '1';
bin_num[j++] = '0';
bin_num[j++] = '0';
bin_num[j++] = '1';
break;
case 'A':
case 'a':
bin_num[j++] = '1';
bin_num[j++] = '0';
bin_num[j++] = '1';
bin_num[j++] = '0';
break;
case 'B':
case 'b':
bin_num[j++] = '1';
bin_num[j++] = '0';
bin_num[j++] = '1';
bin_num[j++] = '1';
break;
case 'C':
case 'c':
bin_num[j++] = '1';
bin_num[j++] = '1';
bin_num[j++] = '0';
bin_num[j++] = '0';
break;
case 'D':
case 'd':
bin_num[j++] = '1';
bin_num[j++] = '1';
bin_num[j++] = '0';
bin_num[j++] = '1';
break;
case 'E':
case 'e':
bin_num[j++] = '1';
bin_num[j++] = '1';
bin_num[j++] = '1';
bin_num[j++] = '0';
break;
case 'F':
case 'f':
bin_num[j++] = '1';
bin_num[j++] = '1';
bin_num[j++] = '1';
bin_num[j++] = '1';
break;
default:
printf("输入不合法!\n");
return 1;
}
}
// 补零
while(j % 3 != 0)
{
bin_num[j++] = '0';
}
bin_num[j] = '\0';
len = strlen(bin_num);
k = 0;
for(i=0;i<len;i+=3)
{
oct_num[k++] = ((bin_num[i] - '0') << 2) | ((bin_num[i+1] - '0') << 1) | (bin_num[i+2] - '0');
oct_num[k-1] += '0';
}
oct_num[k] = '\0';
printf("转换后的八进制数为:%s\n", oct_num);
return 0;
}