• 第二次博客作业: 函数+进制转换器v1.0beta


    一.程序的运行截图

     十六进制对二进制八进制的转换可以通过6选项后进行1.2选项实现。

    二.函数以及其对应的功能

    #include<stdio.h>
    #include<math.h>
    
    void mune()
    {
        printf("----------------------------
    ");
        printf("进制转换
    ");
        printf("1、十进制转换二进制
    ");
        printf("2、十进制转换八进制
    ");
        printf("3、十进制转换十六进制
    ");
        printf("4、二进制转换十进制
    ");
        printf("5、八进制转换十进制
    ");
        printf("6、十六进制转换十进制
    ");
        printf("0、    退     出
    ");
        printf("----------------------------
    ");
    }
    
    void TenToTwo()
    {
        int num, c, i = 0, g;
        int n = 2;
        int a[32];
        printf("输入一个整数:");
        scanf_s("%d", &num);
        g = num;
        if (num < 0)
            num = -num;
        while (num > 0)
        {
            c = (num % n);
            a[i] = c;
            num = num / n;
            i++;
        }
        printf("十进制数转换成二进制数是:");
        if (g == 0)
              printf("0");
        if (g < 0)
            printf("-");
        for (i--; i >= 0; i--)           //将数组倒序输出
            printf("%d", a[i]);
        printf("
    ");
    }
    
    void TenToEight()
    {
        int num, c, i = 0,g;
        int n = 8;
        int a[32];
        printf("输入一个整数:");
        scanf_s("%d", &num);
        g = num;
        if (num < 0)
            num = -num;
        while (num > 0)
        {
            c = (num % n);
            a[i] = c;
            num = num / n;
            i++;
        }
        printf("十进制数转换成八进制数是:");
        if (g ==0)
            printf("0");
        if (g < 0)
            printf("-");
        for (i--; i >= 0; i--)           //将数组倒序输出
            printf("%d", a[i]);
        printf("
    ");
    }
    
    void TenToSixteen()
    {
        char ai[] = "0123456789ABCDEF";
        char h[16];
        int i = 0;
        int j = 0;
        int num = 0, g;
        printf("输入一个整数:");
        scanf_s("%d", &num);
        g = num;
        if (num < 0)
            num = -num;
        while (num)
        {
            h[i++] = ai[num % 16];   //对十进制数求余并最终与h数组中的字符匹配
            num = num / 16;
        }
        printf("十进制数转换成十六进制数是:");
        if (g < 0)
            printf("-");
        for (j = i - 1; j >= 0; --j)
            printf("%c", h[j]);
        printf("
    ");
    }
    
    void TwoToTen()
    {
        long long n;
        int sum = 0, i = 0, m,count=0;
        printf("输入一个二进制数: ");
        scanf_s("%lld", &n);
        while (n != 0)
        {     m = n % 10;
            if (m > 1||m<-1)
            count++;
            n /= 10;
            sum += m * pow(2, i);
            ++i;
        }
        if (count != 0)
        {
        
            printf("输入错误!
    ");
            return TwoToTen();
        }
        else
            printf("二进制数转换为十进制为 %d
    ",sum);
    }
    
    void EightToTen()
    {
        int n,;
        int sum = 0, i = 0, m,count=0;
        printf("输入一个八进制数: ");
        scanf_s("%d", &n);
        while (n != 0)
        {
            m = n % 10;
            if (m > 7||m<-7)
            count++;
            n /= 10;
            sum += m * pow(8, i);
            ++i;
        }
        if (count != 0)
        {
            printf("输入错误!
    ");
            return EightToTen();
        } 
        else
            printf("八进制数转换为十进制为 %d
    ", sum);
    }
    
    void SixteenToTen()
    {
        char s[50], a[50];
        printf("输入一个十六进制数:");
        scanf_s("%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("%d
    ",sum);
        }
        else 
        {
            printf("输入错误!");
            return SixteenToTen();
        }
        printf("
    ");
    }
    
    int main()
    {
        int n = 0;
        int l = 1;
        while (l)
        {
            mune();
            printf("请选择:");
            scanf_s("%d", &n);
            switch (n)
            {
            case 1:TenToTwo();
                break;
            case 2:TenToEight();
                break;
            case 3:TenToSixteen();
                break;
            case 4:TwoToTen();
                break;
            case 5:EightToTen();
                break;
            case 6:SixteenToTen();
                break;
            case 0:
                l = 0;
                break;
            default:
                printf("您的选择错误!!!
    ");
                break;
            }
        }
    }

    通过主函数先输出菜单,通过选择进入switch函数的选项,进而调动相对应的函数。因为比较菜,每个进制转换都写了一个函数。

    三.思维导图

     四.主要问题
    十六进制转换十进制

     四.主要问题
    十六进制转换十进制

    scanf("%x",&num);
    print("%d",&num);

    本来这样写没什么毛病,然后看见要求要检查输入的数是不是十六进制的数就给我整懵了。

    解决方法:

        char s[50], a[50];
        printf("输入一个十六进制数:");
        scanf_s("%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("%d
    ",sum);
        }
        else                  //不是十六进制数提醒错误并重新调动该函数
        {
            printf("输入错误!");
            return SixteenToTen();
        }
        printf("
    ");

    解决方法如上。

    五.互评

    李永福

    //裁判
    bool judge(int n, char num[1000])
    {
        //二进制判断
        if (n == 2)
        {
            for (int idx = 0; idx < strlen(num); idx++)
                if (num[idx] != '1' && num[idx] != '0')return false;
            return true;
        }
        //八进制判断
        if (n == 8)
        {
            for (int idx = 0; idx < strlen(num); idx++)
                if (num[idx] < 48 || num[idx] > 55)return false;
            return true;
        }
        //十进制判断
        if (n == 10)
        {
            for (int idx = 0; idx < strlen(num); idx++)
                if (num[idx] < 48 || num[idx] > 57)return false;
            return true;
        }
        //十六进制判断
        if (n == 16)
        {
            for (int idx = 0; idx < strlen(num); idx++)
                if (num[idx] < 48 || num[idx] > 70)return false;
            return true;
        }
    }

    先调用一个函数来判断输入是否正确,让后面的函数编写更为简洁明了。

    六.总结

    收获:加深了对数组应用的了解,善用if语句来解决检查判断问题。

    对函数的理解:将一个大程序分成一个个小程序,降低编写代码的难度,让代码更容易让人看懂。

  • 相关阅读:
    (3)合并列值与分拆列值
    (2)SQL语句实现表的横向聚合
    (1)显示每个类别最新更新的数据
    【实践】WCF传输安全2:基于SSL的WCF匿名客户端
    超经典解释什么叫网关
    List集合操作一:遍历与查找
    RGB值及中文名称
    绑定树控件
    treeview的checkbox展开节点
    winform AutoScaleMode属性
  • 原文地址:https://www.cnblogs.com/2b-or-not-2b-/p/11806679.html
Copyright © 2020-2023  润新知