第二次博客作业

一、运行截图

二进制和八进制

二进制和十进制

八进制和十进制

函数介绍

int main()
{
    int first, sum;
    printf("请选择当前要被转换的进制\n");
    printf("二进制【1】\n");
    printf("八进制【2】\n");
    printf("十进制【3】\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;

    }
}
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;
}
int number_8()//输入一个八进制函数 
{
    int result;
    printf("请输入八进制数:");
    scanf_s("%d", &result);
    return result;
}
int number_10()//输入一个十进制函数 
{
    int result;
    printf("请输入十进制数:");
    scanf_s("%d", &result);
    return result;
}
int choose()//选择要二进制被转换的进制 
{
    int result;
    printf("请选择当前要转换的进制\n");
    printf("二进制【1】\n");
    printf("八进制【2】\n");
    printf("十进制【3】\n");
    printf("你的选择: ");
    scanf_s("%d", &result);
    return result;
}
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;
    }

}
int  eight_to_others(int number_8, int choose)//八进制!!!
{
    int sum = 0;
    if (choose == 1)
    {
        int a[10], i = 0;
        for (int j = number_8; j > 0; j = j / 10)
        {
            int b = j % 10, t = 0;
            while (b > 0)
            {
                sum += (b % 2) * pow(10, t);
                b = b / 2;
                t++;
            }
            a[i] = sum;
            sum = 0, i++;
        }

        for (int j = i - 1; j >= 0; j--)
        {
            if (j == i - 1)
                printf("%d", a[j]);
            else
                printf("%03d", a[j]);
        }
        return 0;
    }
    if (choose == 2)
    {
        if (number_8 == 0)
        {
            printf("%d", number_8);
            return number_8;
        }
        else
        {
            return number_8;
        }
    }
    if (choose == 3)
    {
        int t = 0;
        if (number_8 == 0)
            printf("%d", number_8);
        while (number_8 > 0)
        {
            sum += (number_8 % 10) * pow(8, t);
            number_8 /= 10;
            t++;
        }
        return sum;
    }
}
int  ten_to_others(int number_10, int choose)//十进制!!!!
{
    if (choose == 1)
    {
        int b = number_10, sum = 0, t = 0;
        do {
            sum += (b % 2) * pow(10, t);
            b = b / 2;
            t++;
        } while (b > 0);
        return sum;
    }
    if (choose == 2)
    {
        int b = number_10, sum = 0, t = 0;
        do {
            sum += (b % 8) * pow(10, t);
            b = b / 8;
            t++;
        } while (b > 0);
        return sum;
    }
    if (choose == 3)
    {
        int b = number_10, sum = 0, t = 0;
        do {
            sum += (b % 10) * pow(10, t);
            b = b / 10;
            t++;
        } while (b > 0);
        return sum;
    }

}

三、main函数

int main()
{
 int first, sum;
 printf("请选择当前要被转换的进制\n");
 printf("二进制【1】\n");
 printf("八进制【2】\n");
 printf("十进制【3】\n");
 printf("你的选择:");
 scanf_s("%d", &first);
 switch (first)

四、思维导图

代码互评

#include<stdio.h>
#include<math.h>
#include<string.h>
int step_1(char m[],int n);
void step_2(int m,int n);
int change10(char m[],int n);
void unchange10(int m,int n);
int main(){
    int n=100;
    char a[n];
    int b,c,d;
    printf("请输入所转换数的进制数:\n");
    printf("二进制  八进制  十进制  十六进制\n");
    scanf("%d",&b);
    printf("请输入所要转换的数:\n");
    scanf("%s",&a);
    if(step_1(a,b)==1){
        printf("输入了错误的数\n");
    }else{
        printf("数经过转换后为:\n");
        c=change10(a,b);
        step_2(c,b);
    }
    return 0;
}
int step_1(char m[],int n){
    int a,b=0,c,i;
    c=n+48;
    a=strlen(m);
    for(i=0;i<a;i++){
        if(n<=10){
            if(m[i]<0||m[i]>=c){
                b=1;
                break;
            }
        }else{
            if(m[i]<'0'||m[i]>'9'&&m[i]<'A'||m[i]>'F'){
                b=1;
                break;
            }
        }
    }
    return b;
}
void step_2(int m,int n){
    int a,b;
    if(n==2){
        printf("八进制:");
        unchange10(m,8);
        printf("十进制:");
        printf("%d\n",m);
        printf("十六进制:");
        unchange10(m,16);
    }else if(n==8){
        printf("二进制:");
        unchange10(m,2);
        printf("十进制:");
        printf("%d\n",m);
        printf("十六进制:");
        unchange10(m,16);
    }else if(n==10){
        printf("二进制:");
        unchange10(m,2);
        printf("八进制:");
        unchange10(m,8);
        printf("十六进制:");
        unchange10(m,16);
    }else if(n==16){
        printf("二进制:");
        unchange10(m,2);
        printf("八进制:");
        unchange10(m,8);
        printf("十进制:");
        printf("%d\n",m);
    }
}
int change10(char m[],int n){
    int a,i,b=0;
    a=strlen(m);
    if(n!=16){
        for(i=a-1;i>=0;i--){
            b += (m[i]-'0')*pow(n,i);
        }
    }else if(n==16){
        for(i=a-1;i>=0;i--){
            if(m[i]<10){
                b += m[i]*pow(n,i);
            }else{
                m[i]=m[i]-'A'+10;
                b += m[i]*pow(n,i);
            }
        }
    }
    return b;
}
void unchange10(int m,int n){
    int b=100;
    int a[b],sum=0,i;
    for(i=0;m>0;m/=n){
        a[i]=m%n;
        i++;
    }
    i--;
    for(;i>=0;i--){
        if(a[i]<10){
            printf("%d",a[i]);
        }else{
            printf("%c",a[i]+55);
        }
    }
    printf("\n");
}

他的代码进行了16进制的转换,这个我做不到,值得学习。

格式方面也比我更好一些。

五、遇到的问题

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

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

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

3、

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

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

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

3通过请教同学和网络查询,解决了很多问题,补充了自己的不足。

 

posted @ 2019-11-10 23:00  楠木。  阅读(113)  评论(0编辑  收藏  举报