二,八,十,十六进制之间的转换-C语言

二,八,十,十六进制之间的相互转换-C语言

今天有个同学叫我帮写这个,马马虎虎写了一下,不是很完善
我的思路是先把要转换的数据统一转换成十进制,再转换成其它进制的数输出,用递归就简单多了。

先写好关键代码,其实代码都差不多的:

/*十进制转二进制输出 */
void fun1(int n)
{
    if(n/2)// 非0为真
        fun1(n/2);
    putchar('0'+n%2);
}

/*十进制转八进制输出 */
void fun2(int n)
{
    if(n/8)
        fun2(n/8);
    putchar('0'+n%8);
}

/*十进制转十六进制输出 */
void fun3(int n)
{
    if(n/16)
        fun3(n/16);
    int i = n%16;
    if(i<10)
        putchar('0'+i);
    else
        putchar('a'+i-10);
}

/*二进制转十进制 */
int fun4(char *str)
{
    int num = 0;
    while(*str != '\0')
    {
        int i = *str-'0';
        if(i>=0 && i<=1)// 跳过其它字符 
            num = num*2+i;
        str++;
    }
    return num;
}

/*八进制转十进制 */
int fun5(char *str)
{
    int num = 0;
    while(*str != '\0')
    {
        int i = *str-'0';
        if(i>=0 && i<8)// 跳过其它字符
            num = num*8+i;
        str++;
    }
    return num;
}

/*十六进制转十进制 */ 
int fun6(char *str)
{
    int num = 0;
    while(*str != '\0')
    {
        char ch = *str;
        if(ch>='0' && ch<='9')
            num = num*16+ch-'0';
        if(ch>='a' && ch<='f')
            num = num*16+10+ch-'a';
        str++;
    }
    return num;
} 

写两个菜单:

/*菜单1*/
void showmenu1()
{
    printf("\n请选择需要被转换的进制:\n");
    printf("1、二进制\n");
    printf("2、八进制\n");
    printf("3、十进制\n");
    printf("4、十六进制\n");
    printf("0、退出\n");
    printf("请输入菜单:");
}

/*菜单2*/
void showmenu2()
{
    printf("请选择需要输出的进制:\n");
    printf("1、二进制\n");
    printf("2、八进制\n");
    printf("3、十进制\n");
    printf("4、十六进制\n");
    printf("请输入菜单:");
}

写个函数用来输入整数:

/**
 * 从键盘输入一个数字,并判断范围
 * min最小值,max最大值
 */
int inputNum(int min, int max)
{
    int num;
    while(1)
    {
        fflush(stdin); // 清空输入缓冲区 
        int s = scanf("%d", &num);
        if(1!=s)    // 判断字符是否匹配
        {
            printf("输入错误, 请重新输入:");
            continue;
        }
        if(num<min || num>max)
        {
            printf("输入范围有误,请重新输入:");
            continue;
        }
        break; // 输入无误后跳出死循环
    }
    return num;
}

最后只差main函数了:

int main(void)
{
    char str[1024];
    int menu, output;// 菜单选项,转换后的十进制数 
    while(1){
        showmenu1();
        menu = inputNum(0, 4);
        if(menu == 0)
            break;  // 退出死循环
        fflush(stdin);
        printf("请输入数据:");
        switch(menu)
        {
            case 1:
                gets(str);
                output = fun4(str);
                break;
            case 2:
                gets(str);
                output = fun5(str);
                break;
            case 3:
                output = inputNum(0, INT_MAX);
                break;
            case 4:
                gets(str);
                output = fun6(str);
                break;
        }

        showmenu2();
        menu = inputNum(0, 4);
        switch(menu)
        {
            case 1:
                fun1(output);
                putchar('B');
                break;
            case 2:
                fun2(output);
                putchar('Q');
                break;
            case 3:
                printf("%d", output);
                putchar('D');
                break;
            case 4:
                fun3(output);
                putchar('H');
                break;
        }
        putchar('\n');
        system("pause");// 暂停
    }
    return EXIT_SUCCESS;
}

使用的头文件:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

运行如下:
这里写图片描述

运行环境:Dev-C++ 5.11

  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值