进制转换器

一.运行截图

 

 

 二.拓展功能

 检测进制数是否错,若输错后无需返回菜单重新进行选择进制转换选项,可直接重新输入所需要转换的进制数

三.函数&功能

1.menu函数

void menu()          //菜单
{
    printf("                  \\ 我是菜单 /   \n");
    printf("                   (。ì _ í。)  \n");
    printf("        ——————十进制转换二进制  [1]——————  \n");
    printf("        \\     十进制转换八进制  [2]    /   \n");
    printf("          \\   十进制转换十六进制[3]  /   \n");
    printf("            \\ 二进制转换十进制  [4]/    \n");
    printf("             /八进制转换十进制  [5]\\  \n");
    printf("              十六进制转换十进制[6]     \n");
    printf("                  退     出     [0]   \n");
    printf("                     |  |    \n");
    printf("                     |  |    \n");
    printf("                    _|  |_   \n");
    printf("\n");
    printf("\n");    
}

2.zio函数(十进制转二进制)

void zio()           //10->2
{
    int n,m, c = 1, i = 0;
    int a[100];
    printf("您的选择是十进制转二进制\n");
    printf("输入一个整数:");
    scanf("%d", &n);
    while(n > 0){
      m = n;
      a[i] = (m % 2);// 求模放进数组
      n = n / 2;     //用2辗转相除直至结果为1
      i++;
      c = 1;
    }
    while(n < 0){
      m = -n;
      a[i] = (m % 2);// 求模放进数组
      n = n / 2;     //用2辗转相除直至结果为1
      i++;
      c = 0;
    }
    printf("它的二进制数为 ");
    if(c == 1){
      for (i = i-1; i >= 0; i--)           //将数组倒序输出
      printf("%d", a[i]);
    }
    if(c == 0){
      printf("-");
      for (i = i-1; i >= 0; i--)           //将数组倒序输出
      printf("%d", a[i]);
    }
    if(m == 0)
    printf("0");
    printf("\n");  
}

 

 

 3.zeroone函数(十进制转八进制)

void zeroone()      //10->8
{
    int n,m, c = 1, i = 0;
    int a[100];
    printf("您的选择是十进制转八进制\n");
    printf("输入一个整数:");
    scanf("%d", &n);
    while(n > 0){
      m = n;
      a[i] = (m % 8);// 求模放进数组
      n = n / 8;     //用8辗转相除直至结果为1
      i++;
      c = 1;
    }
    while(n < 0){
      m = -n;
      a[i] = (m % 8);// 求模放进数组
      n = n / 8;     //用8辗转相除直至结果为1
      i++;
      c = 0;
    }
    printf("它的八进制数为 ");
    if(c == 1){
      for (i = i-1; i >= 0; i--)           //将数组倒序输出
      printf("%d", a[i]);
    }
    if(c == 0){
      printf("-");
      for (i = i-1; i >= 0; i--)           //将数组倒序输出
      printf("%d", a[i]);
    }
    if(m == 0)
    printf("0");
    printf("\n");
}

4.build函数(十进制转十六进制)

void build()        //10->16
{
        char arr[] = "0123456789ABCDEF";
        char hex[16];
        int i = 0;
        int j = 0;
        int n = 0,a = 0,b;
        printf("您的选择是十进制转十六进制\n");
        printf("请输入一个整数:");
        scanf("%d", &n);
        b = n;
        if(n < 0)
        n = -n;
        a = n;
        while (n)
        {
            hex[i++] = arr[n % 16];  //将模放进hex数组中
            n = n / 16;
        }
        printf("它的十六进制数为:");
        if(b == 0)
        printf("0");
        if(b<0)
        printf("-");
        for (j = i - 1; j >= 0; --j)
            printf("%c", hex[j]);
        printf("\n");
}      

5.geiz函数(二进制转十进制)

void geiz()         //2->10
{   
        int n,a;
        int sum = 0, i = 0, m;
        printf("您的选择是二进制转十进制\n");
        printf("请输入一个二进制数: ");
        scanf("%d", &n);
        if(n%10 >= 2){         //判断输入的是否为二进制数
            printf("请检查输入的二进制数=(\n");
            return geiz();         //返回该函数进行重新输入
        }
        a = n;
        while (n != 0)
        {
            m = n % 10;
            n /= 10;
            sum += m*pow(2, i);
            ++i;
        }
        printf("该二进制的十进制为 %d\n",sum);
}

 6.woz函数(八进制转十进制)

void woz()          //8->10
{
    int n, a;
    int sum = 0, i = 0, m;
    printf("您的选择是八进制转十进制\n");
    printf("请输入一个八进制数: ");
    scanf("%d", &n);
    if(n%10 >= 8){
    printf("请检查输入的八进制数=(\n");
    return woz();
    }
    a = n;
    while (n != 0)
    {
        m = n % 10;
        n /= 10;
        sum += m*pow(8, i);
        ++i;
    }
    printf("该八进制数转换为十进制为 %d\n",sum);
}

7.decade函数(十六进制转十进制)

void decade()       //16—>10
{
    char s[50];
    char a[50];
    printf("您的选择是十六进制转十进制\n");
    printf("请输入一个十六进制数:");
    scanf("%s", s);
    int t, i, count = 0, j = 0;
    long sum = 0;
    if (s[0] == '-') {
        for (i = 0;s[i];i++) {
            a[i] = s[i + 1];
        }
        for (i = 0;s[i];i++) {
            s[i] = a[i];
        }
        j = 1;
    }
    for (i = 0;s[i];i++) {
        if (s[i] > 'F')
            count++;
    }
    if (count == 0) {
        for (i = 0;s[i];i++) {
            if (s[i] <= '9')
                t = s[i] - '0';
            else
                t = s[i] - 'A' + 10;
            sum = sum * 16 + t;
        }
        printf("该十六进制数转换为十进制为:");    
        if (j == 1) {
            printf("-");
        }
        printf("%ld\n",sum);
    }
    else {
        printf("请检查输入的十六进制数=(");
        return decade();
    }
    printf("\n");
}

四.main函数

int main()
{
    int x = 0;
    while(1)
    {
        menu();
        printf("      ————————————————————————————————————\n");
        printf("       请选择 [1] [2] [3] [4] [5] [6] [0]\n");
        printf("      ————————————————————————————————————\n");
        scanf("%d", &x);
        switch(x)
        {
            case 1:zio(); //10—>2
                break;
            case 2:zeroone();//10->8
                break;
            case 3:build();//10->16
                break;
            case 4:geiz();//2->10
                break;
            case 5:woz();//8—>10
                break;
            case 6:decade();//16->10
                break;
            case 0:
                printf("正在退出...\n");
                return 0;
                break;
            default:
                printf("请检查你的选项:(\n");
                break;
        }
    }
    return 0;
}

五.函数关系

 

 

 六.问题解决

1.10->2数组倒序输出问题,需从i-1输出才能得到正确答案

2.10->2正负数判断问题,引入一个标记数更容易在后面的输出判断正负数

3.main程序中做到输出结果后不会立即退出程序,用while(1)循环控制程序进行可保证不会立即退出

4.字符串应为%s而不是%d输入

七.代码互评

 

//1913杨涛
void Numchange(int m, int b)//将10进制数转化为任意进制数
{
    
    int n = m;
    int count = 0;
    if (m == 0) printf("0");
    while (n != 0)
    {
        n = n / b;
        count++;
    }
    int number;
    for (int i = count; i >= 1; i--)
    {
        number = m / (int)pow(b, i - 1);
        if (number < 10) {
            printf("%d", number);
        }
        else {
            printf("%c", number + 55);
        }
        m = m % (int)pow(b, i - 1);
    }
}

 

利用pow函数配合循环完美输出特定进制的数,不必再继续写多个转换函数。简洁明了,值得学习!

 

八.总结

加深对函数的理解与循环语句的应用。

善用数组来满足需求。

分离的函数部分使主程序不会过于繁杂,更容易确定问题所在。

posted @ 2019-11-06 21:09  阿尔法个贝塔  阅读(531)  评论(0编辑  收藏  举报