第二次博客作业

一、程序运行截图

2------>8

2----->10

2------->16

8-------->2

8------>10

8--->16

10---->2

10------>8

10------->16

输入无效,重新输入

二、拓展功能

1.可以实现十六进制的转换。(其他的转十六进制可以转,但十六进制转成其他的还没写好)

2.输入无效时可以重新输入。

三、函数介绍

1.

int number_2()//输入一个二进制函数 
{
    int result;
    part1:printf("请输入二进制数:");
    scanf_s("%d", &result);
    for (int i = result;i > 0;i=i / 10)
    {
        if (i % 10 > 1)
        {
            printf("这是无效的二进制,请重新输入\n");
            goto part1;
        }
    }
    return result;
}

输入一个二进制数,返回一个二进制数。

2.

int choose()//选择要二进制转换的进制 
{
    int result;
    printf("请选择当前要转换的进制\n");
    printf("二进制【1】\n");
    printf("八进制【2】\n");
    printf("十进制【3】\n");
    printf("十六进制【4】\n");
    printf("你的选择: ");
    scanf_s("%d", &result);
    return result;
}

3.

int  two_to_others(int number_2, int choose)//二进制!!!!!!
{
    int sum = 0, t = 0;
    if (choose == 1)                                       //二进制:输入1(二进制),则仍然是二进制输出;
    {
        if (number_2 == 0)
            printf("%04d", number_2);             
        return number_2;
    }
    if (choose == 2)//二进制:输入2(八进制),则取三合一,每三位按权相加,如:110=0*1+1*2+1*4=6,按权相加的方式可以将那三位转为十进制,
    {                                                                                      //可以理解为那三位二进制转为十进制
        if (number_2 == 0)           
            printf("%d", number_2);
        while (number_2 > 0)
        {
            sum = sum + two_to_others((number_2 % 1000), 3) * pow(10, t);
            number_2 = number_2 / 1000;
            t++;
        }
        return sum;
    }
    if (choose == 3)//二进制转十进制,按权相加。
    {
        if (number_2 == 0)
            printf("%d", number_2);
        while (number_2 > 0)
        {
            sum += (number_2 % 10) * pow(2, t);
            number_2 /= 10;
            t++;
        }
        return sum;
    }
    if (choose == 4)//二进制转十六进制,取四合一法:每四位转成十进制数,再转成十六进制数
    {
        char str[80];
        int i = 0;
        while (number_2 > 0)
        {
            char a = two_to_others((number_2 % 10000), 3);
            if (a >= 10 && a <= 15)
                a = a+55;
            if (a >= 0 && a <= 9)
                a = a + 48;
            str[i] = a;
            number_2 = number_2 / 10000;
             i++;
        }
        str[i] = '\0';
        for (int j = i - 1;j >= 0;j--)
            printf("%c", str[j]);
        return 0;
    }


}

第一个形参是输入的二进制数,第二个形参是选择转换的进制数。

每一种转换都有相应的方法。

4.

int main()
{
    int first,sum;
    printf("欢迎使用进制转换器\n");
    printf("请选择当前要被转换的进制\n");
    printf("二进制【1】\n");
    printf("八进制【2】\n");
    printf("十进制【3】\n");
    printf("十六进制【4】\n");
    printf("你的选择:");
    scanf_s("%d", &first);
    switch (first)
    {
    case 1:
    {
         sum = two_to_others(number_2(), choose());
        if (sum != 0)
            printf("%d", sum);
    }
    break;
    case 2:
    {
     sum=eight_to_others(number_8(), choose());
     if (sum != 0)
         printf("%d", sum);
    }
    break;
    case 3:
    {
        sum = ten_to_others(number_10(), choose());
        if(sum!=0)
        printf("%d", sum);
    }
        break;
    case 4:printf("对不起,还没有开通这项服务");break;
    }

该函数是让用户选择要被转的进制数(first),然后使用switch函数,按first的值选择case.

四、思维导图

 

 五、遇到的问题

1、例如:switch中,我遇到了一个代号C2360的error,说明变量尽量不要在switch内定义,尽量在switch外部定义变量

2.在八进制转二进制时,取三位,不足三位则补零。于是采用%03d来写,但是第一项不需要补0;

   解决:第一项单独输出,其余按%03d输出。

3.定义 char a=一个十进制数,此时a的值可以是asc2码的值,也可以是字符,如果要转换成十六进制数,则0~9,需a=a+48,使a=字符'a'(数字字符),10~15也类似。

六、

收获:1.觉得自己之前只顾着刷pta没有实战经验。现在实战,代码多,前后联系大,不免觉得有点吃力,因此以后觉得可以多实践多逛博客园看看其他人的经验

          2. 觉得自己会的太少了

对函数的理解:1.函数可以是有返回的(有数组,int,double 等类型),负责输入n个数进去,然后返回你想要的结果

                         2.无返回值可以用于打印输出等

 

posted @ 2019-11-10 21:34  天青色等烟雨(  阅读(149)  评论(0编辑  收藏  举报