• 函数+进制转换器v1.0beta


    1.运行截图

    输入正确时结果如下,其他转换运行结果类似,就不多贴图了。

    输入不符合规范时:

    2.额外扩展

    如果输入错误格式,则重新输入,而不是结束程序从头再来。
    运行结果如上图。

    3.函数

    (1)二进制转其他

    
    void tr2(int option2)
    {
        int input = 0, i;
        char in[80];
    A:
        scanf("%s", in);
        for (i=0; i<strlen(in); i++)    /*判断是否为二进制数*/
        {
            if (in[i] != '0' && in[i] != '1')
            {
                printf("请重新输入二进制数:");
                goto A;
            }
        }
        for (i=0; i<strlen(in); i++)
        {
            input = input*10 + (in[i] - '0');
        }
        switch (option2)    /*根据选择结果分配给不同的转换函数*/
        {
            case 1:
                transform_2_8(input);
                break;
            case 2:
                printf("转换结果:%d
    ", transform_2_10(input));
                break;
            case 3:
                transform_2_16(input);
                break;
        }
    }
    
    void transform_2_8(int n)
    {
        int sum = transform_2_10(n);
        printf("转换结果:%o
    ", sum);
    }
    
    int transform_2_10(int n)
    {
        int result = 0, i = 0;
        while (n > 0)
        {
            result += (n%10) * pow(2, i);
            n /= 10;
            i++;
        }
        return result;
    }
    
    void transform_2_16(int n)
    {
        int sum = transform_2_10(n);
        printf("转换结果:%x
    ", sum);
    }
    
    

    (2)八进制转其他

    
    void tr8(int option2)
    {
        int input = 0, i;
        char in[80];
    A:
        scanf("%s", in);
        for (i=0; i<strlen(in); i++)    /*判断是否为八进制数*/
        {
            if (in[i] < '0' || in[i] > '7')
            {
                printf("请重新输入八进制数:");
                goto A;
            }
        }
        for (i=0; i<strlen(in); i++)
        {
            input = input*10 + (in[i] - '0');
        }
        switch (option2)    /*根据选择结果分配给不同的转换函数*/
        {
            case 1:
                transform_8_2(input);
                break;
            case 2:
                printf("转换结果:%d
    ", transform_8_10(input));
                break;
            case 3:
                transform_8_16(input);
                break;
        }
    }
    void transform_8_2(int n)
    {
        transform_10_2( transform_8_10(n) );
    }
    int transform_8_10(int n)
    {
        int result = 0, i = 0;
        while (n > 0)
        {
            result += (n%10) * pow(8, i);
            n /= 10;
            i++;
        }
        return result;
    }
    void transform_8_16(int n)
    {
        printf("转换结果:%x
    ", transform_8_10(n));
    }
    
    

    (3)十进制转其他

    void tr10(int option2)
    {
        int input = 0, i;
        char in[80];
    A:
        scanf("%s", in);
        for (i=0; i<strlen(in); i++)    /*判断是否为十进制数*/
        {
            if (in[i] < '0' || in[i] > '9')
            {
                printf("请重新输入十进制数:");
                goto A;
            }
        }
        for (i=0; i<strlen(in); i++)
        {
            input = input*10 + (in[i] - '0');
        }
        switch (option2)    /*根据选择结果分配给不同的转换函数*/
        {
            case 1:
                transform_10_2(input);
                break;
            case 2:
                transform_10_8(input);
                break;
            case 3:
                transform_10_16(input);
                break;
        }
    }
    void transform_10_2(int n)
    {
        int num[80], count = 0;
        int i;
        for (i=0; n>0; i++)
        {
            num[i] = n % 2;
            n /= 2;
            count++;
        }
        for (i=count-1; i>=0; i--)
        {
            printf("%d", num[i]);
        }
        printf("
    ");
    }
    void transform_10_8(int n)
    {
        printf("转换结果:%o
    ", n);
    }
    void transform_10_16(int n)
    {
        printf("转换结果:%x
    ", n);
    }
    
    

    (4)十六进制转其他

    
    void tr16(int option2)
    {
        int i;
        char in[80];
    A:
        scanf("%s", in);
        for (i=0; i<strlen(in); i++)    /*判断是否为十六进制数*/
        {
            if ( (in[i] < '0') || ( in[i] > '9' && in[i] < 'A')
                || (in[i] > 'F' && in[i] < 'a') || in[i] > 'f' )
            {
                printf("请重新输入十六进制数:");
                goto A;
            }
        }
        switch (option2)    /*根据选择结果分配给不同的转换函数*/
        {
            case 1:
                transform_16_2(in);
                break;
            case 2:
                transform_16_8(in);
                break;
            case 3:
                printf("转换结果:%d
    ", transform_16_10(in));
                break;
        }
    }
    void transform_16_2(char *s)
    {
        transform_10_2( transform_16_10(s) );
    }
    void transform_16_8(char *s)
    {
        printf("转换结果:%o
    ", transform_16_10(s));
    }
    int transform_16_10(char *s)
    {
        int i, sum = 0;
        for (i=strlen(s)-1; i>=0; i--)
        {
            if (s[i] >= '0' && s[i] <= '9')
            {
                sum += (s[i]-'0') * pow(16, strlen(s)-i-1);
            }
            else if (s[i] >= 'a' && s[i] <= 'f')
            {
                sum += (s[i]-'a'+10) * pow(16, strlen(s)-i-1);
            }
            else if (s[i] >= 'A' && s[i] <= 'F')
            {
                sum += (s[i]-'A'+10) * pow(16, strlen(s)-i-1);
            }
        }
        return sum;
    }
    
    

    4.main函数

    代码比较多就干脆写了多个.c文件和一个头文件,这样视觉上比较清楚。

    文件名

    头文件

    
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    
    void transform_2_8(int n);
    int transform_2_10(int n);
    void transform_2_16(int n);
    
    void transform_8_2(int n);
    int transform_8_10(int n);
    void transform_8_16(int n);
    
    void transform_10_2(int n);
    void transform_10_8(int n);
    void transform_10_16(int n);
    
    void transform_16_2(char *s);
    void transform_16_8(char *s);
    int transform_16_10(char *s);
    
    

    main函数

    #include "Header.h"
    #include "tr2.c"
    #include "tr8.c"
    #include "tr10.c"
    #include "tr16.c"
    
    int main()
    {
        int option1, option2;
        printf("输入的进制类型为:
    ");
    A:
        printf("[1]二进制  [2]八进制  [3]十进制  [4]十六进制
    ");
        scanf("%d", &option1);
        switch (option1)
        {
            case 1:
                printf("想要转换成?
    ");
            A1:
                printf("[1]八进制  [2]十进制  [3]十六进制
    ");
                scanf("%d", &option2);
                if (option2 != 1 && option2 != 2 && option2 != 3)
                {
                    printf("输入错误!重新输入想转换成什么类型:
    ");
                    goto A1;
                }
                printf("输入:");
                tr2(option2);
                break;
            case 2:
                printf("想要转换成?
    ");
            A2:
                printf("[1]二进制  [2]十进制  [3]十六进制
    ");
                scanf("%d", &option2);
                if (option2 != 1 && option2 != 2 && option2 != 3)
               {
                   printf("输入错误!重新输入想转换成什么类型:
    ");
                   goto A2;
               }
                printf("输入:");
                tr8(option2);
                break;
            case 3:
                printf("想要转换成?
    ");
            A3:
                printf("[1]二进制  [2]八进制  [3]十六进制
    ");
                scanf("%d", &option2);
                if (option2 != 1 && option2 != 2 && option2 != 3)
               {
                   printf("输入错误!重新输入想转换成什么类型:
    ");
                   goto A3;
               }
                printf("输入:");
                tr10(option2);
                break;
            case 4:
                printf("想要转换成?
    ");
            A4:
                printf("[1]二进制  [2]八进制  [3]十进制
    ");
                scanf("%d", &option2);
                if (option2 != 1 && option2 != 2 && option2 != 3)
               {
                   printf("输入错误!重新输入想转换成什么类型:
    ");
                   goto A4;
               }
                printf("输入:");
                tr16(option2);
                break;
            default:
                printf("输入错误!重新输入的进制类型为:
    ");
                goto A;
        }
        return 0;
    }
    
    

    5.函数关系图

    6.问题

    (1)判断输入的数是否符合规范,本来想取余一位一位判断,发现十六进制有字母不能这样子,想了一下决定全都改用输入字符串然后再进行后续操作。
    (2)想往函数中传入字符串,发现不知道怎么传,通过翻书和百度后找到解决方法。例如:void a( char *s)
    (3)代码敲了一半,突然想起来有格式控制输入输出,就把可以用这个的都改了,简化一下代码。(总共300行左右)(这个不知道算不算问题...)

    7.代码互评

    void shier (int n)
    {
        printf("十进制转换为二进制
    ");
        printf("答案是:");
        a(n);
    }
    int a(int n)
    {
        if(n==1||n==0){
            printf("%d",n);
        }else {
            a(n/2);
            printf("%d",n%2);
        }
        return 0;
    }
    

    这位同学十进制转二进制用了递归函数,代码更简洁清楚,值得学习。因为十进制转二进制是用十进制数除以2取余数,取出来的余数要倒序输出才是正确答案,所以我用了数组,把余数一个个存到数组里,然后从数组末尾输出,这样显得比较麻烦,还是用递归比较好,可以直接从末尾输出。

    8.收获

    (1)更加了解了不同进制间的转换是如何进行的。
    (2)第一次尝试把程序文件分为多个程序文件模块写一个程序,对大程序构成有个初步的了解。

    9.理解

    (1)函数可以使代码看起来更清晰易懂,增加可读性。
    (2)遇到错误时改写程序也相对方便,直接在函数中更改即可,不用担心误改到main函数的其他代码。

  • 相关阅读:
    SQL补充
    SQL练习题
    HDU 2907
    Codeforces 814D
    Codeforces 814C
    Codeforces 1004D
    Codeforces 1004E
    CodeForces 909F
    CodeForces 909E
    CodeForces 909D
  • 原文地址:https://www.cnblogs.com/wzt392217419/p/11824298.html
Copyright © 2020-2023  润新知