第二次博客园作业

╄→гoц情女王★ 提交于 2019-12-04 04:51:46

一、进制转换器

1、





3、函数介绍:

a.主函数:

int main()
{
    int c,k;
    int sign=0;
    printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n");                 
    scanf("%d%d",&M,&N);
    /*判断输入的进制是否能进行转换*/
    do{
        c=(M==2&&N==8)||(M==2&&N==10)||(M==8&&N==2)||(M==8&&N==10)||(M==10&&N==2)||(M==10&&N==8); 
        if(c!=1){
        printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n");                                
        scanf("%d%d",&M,&N);
        }
    }while(c!=1);
    printf("请输入你要转换的值:\n");                           
    scanf("%d",&X); 
    if(M==2){
        if(N==8){
            printf("转换值为0%d",change2to8(X));                                             /*输出八进制格式*/
        }else if(N==10){
            printf("转换值为%d",change2to10(X));                                            /*输出十进制格式*/
            }
    }else if(M==8){
        intermediate=change8to10(X);
        if(N==10){
            printf("转换值为%d",intermediate);
                               /*输出十进制格式*/
        }else printf("转换值为%d",change10to2(intermediate));
                               /*输出二进制格式*/
    }else if(M==10){
        intermediate=change10to2(X);
        if(N==8){
            printf("转换值为0%d",change2to8(intermediate));
                                /*输出八进制格式*/
        }else printf("转换值为%d",intermediate);
                                /*输出二进制格式*/
    }   
} 

函数功能:将输入的十进制、二进制或八进制转换为确定的任意其他两种进制格式。

b.二进制转八进制函数:

int change2to8(int a)
{
    int i=0,sum=0; 
    int b[3];                                                                       /*定义一个数组存放转换为一位八进制的二进制的三位数*/
    int n=0;                                                              /*定义n用于循环,i用于统计位数,sum用于算总和*/
    int d;
    /*以下do-while循环运用去掉位数的方法进行循环*/
    do{
        for(n=0;n<3;n++){
            b[n]=a%10;
            a=a/10;
        }
        d=b[0]*1+b[1]*2+b[2]*4;                                                     /*用三位二进制数转换为一位八进制*/
        sum=sum+d*pow(10,i);                                                        /*因为该算法是从右往左算,所以若要正确输出,则需加大循环后面的数的位数*/
        i++;
    }while(a!=0);                                                                   
    return sum;
}

函数功能:将输入值转换为八进制格式。

c.二进制转十进制函数:

int change2to10(int a)
{
    int b;
    int i=0,sum=0; 
    do{
        b=a%10;
        sum=sum+b*pow(2,i);/*按二进制定义来转换为十进制*/
        i++;
        a=a/10;
    }while(a!=0);
    return sum;
}

函数功能:将输入值转换为十进制格式。

d.八进制转十进制函数:

int change8to10(int a)
{
    int b;
    int i=0,sum=0; 
    do{
        b=a%10;
        sum=sum+b*pow(8,i);/*根据定义进行转换*/
        i++;
        a=a/10;
    }while(a!=0);
    return sum;
}

函数功能:将输入值转换为十进制格式。

e.十进制转换为二进制函数:

int change10to2(int a)
{
    int b;
    int i=0,sum=0; 
    do{
        b=a%2;/*根据除二相余法来转换*/
        sum=sum+b*pow(10,i);
        i++;
        a=a/2;
    }while(a!=0);
    return sum;
}

h.全局变量:

int M,N,X,intermediate;                                   /*定义M,N来确定要转换的两种进制,定义X来存放输入值,定义intermediate来存放中间值*/
char s[1000];                                             /*定义字符数组来存放每位数*/

4、该进制转换器的main函数:

int main()
{
    int c,k;
    int sign=0;
    printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n");                 
    scanf("%d%d",&M,&N);
    do{
        c=(M==2&&N==8)||(M==2&&N==10)||(M==8&&N==2)||(M==8&&N==10)||(M==10&&N==2)||(M==10&&N==8); 
        if(c!=1){
        printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n");                                
        scanf("%d%d",&M,&N);
        }
    }while(c!=1);                                          
    printf("请输入数值:\n");
    scanf("%d",&X); 
    if(M==2){
        if(N==8){
            printf("转换值为0%d",change2to8(X));             
        }else printf("转换值为%d",change2to10(X));                                           
    }else if(M==8){
        intermediate=change8to10(X);
        if(N==10){
            printf("转换值为%d",intermediate);
        }else printf("转换值为%d",change10to2(intermediate));
    }else if(M==10){
        intermediate=change10to2(X);
        if(N==8){
            printf("转换值为0%d",change2to8(intermediate));
        }else printf("转换值为%d",intermediate);
    }   
} 

5、

6、遇到的问题:

a.不知如何将三位二进制转换为一位八进制并输出:

解决方法:利用数组存放数据进行三位三位循环存为一位数;

联想输出逆序数的方法利用循环与数学函数与乘10的方法依次扩大已求数的位数。

b.不知如何从八进制转换为二进制:

原先代码:

int change8to2(int a)
{
    int b[3];
    int c;
    int n=2,sum=0,d=0,i=0;
    do{
        c=a%10;
        for(n=2;n>=0;n--){
            b[n]=c/pow(2,n);
            c=c-pow(2,n);
            d=d+b[n]*pow(10,n);
        }
        a=a/10;
        sum=sum+d*pow(10,3i);
        i++;
    }while(a!=0);
    return sum;
}

若按照此代码,若c为2或1等小的数,则输出的为负数,而若用递增数列,又不知道该如何扩大位数。

解决方法:将该函数功能改为由八进制转换为十进制,再根据其他函数进行转换。

c.输入输出符号转换:

原本函数:

#include<stdio.h>
#include<math.h>
int change2to8(int a);                                  
int change2to10(int a);                                  
int change8to2(int a);                                  
int change10to2(int a);                               
int judge8(char a);                                       
int judge10(char a);                                     
int M,N,X,intermediate;                                  
char s[1000];                                           
int i=0,k;                           
int main()
{
    printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n");               
    scanf("%d%d",&M,&N);
while(M!=2||M!=8||M!=16||M!=10||N!=2||N!=8||N!=16||N!=10){
        printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n");                              
        scanf("%d%d",&M,&N);
    }
    printf("请输入你要转换的值:");                             
    while((s[i]=getchar())!='\n'){
        i++;                                                
    }
    s[i]='\0';                                             
    k=i;                                                  
    if(M==2){ 
        for(i=0;i<k;i++){
        while(s[i]<0||s[i]>1){                               
            printf("输入的数值进制错误,请重新输入:\n");        
            while((s[i]=getchar())!='\n'){
                i++;
            }
            s[i]='\0';
        }
    }
        printf("请再输入一遍数值:\n");
        scanf("%d",&X); 
        if(N==8){
            printf("0%o",change2to8(X));                                             /*输出八进制格式*/
        }else if(N==10){
            printf("%d",change2to10(X));                                            /*输出十进制格式*/
        }
    }else if(M==8){
        for(i=0;i<k;i++){       
        while(judge8(s[0])==0||s[i]<0||s[i]>7){
            printf("输入的数值进制错误,请重新输入:\n");
            while((s[i]=getchar())!='\n'){
                i++;
            }
            s[i]='\0';
        }
    }
        printf("请再输入一遍数值:\n");
        scanf("%o",&X);
        intermediate=change8to2(X);
        if(N==10){
            printf("%d",change2to10(intermediate));
        }else printf("%d",intermediate);
    }else if(M==10){
        for(i=0;i<k;i++){       
        while(judge10(s[0])==0||s[i]<0||s[i]>9){
            printf("输入的数值进制错误,请重新输入:\n");
            while((s[i]=getchar())!='\n'){
                i++;
            }
            s[i]='\0';
        }
    }
        printf("请再输入一遍数值:\n");
        scanf("%d",&X);
        intermediate=change10to2(X);
        if(N==8){
            printf("0%o",change2to8(intermediate));
        }else printf("%d",intermediate);
    }   
} 

因为若用符号,则编译器会自动准换为该对应进制,与所编程序输出不同。

解决方法:均用%d输入输出。

二、代码互评

int char_to_num(char a)
{
    if (a >= '0' && a <= '9')
        return a - '0';
    else
        return a - 'A' + 10;
}//该函数用于将字符转换成相应的数字 

char num_to_char(int num)
{
    if (num >= 0 && num <= 9)
        return (char)('0' + num - 0);
    else
        return (char)('A' + num - 10);
}//该函数用于将数字转成相应的字符

int decimal(char n[], int before)
{
    int Decimal = 0;
    int length;
    int i;
    for (i = 0; n[i] != '\0'; i++);
    length = i;
    for (i = 0; i <= length - 1; i++)
        Decimal = (Decimal * before) + char_to_num(n[i]);
    return Decimal;
}//该函数用于将其他进制数统一转换成十进制数

int Toafter(char n[], int Decimal, int after)
{
    int i = 0;
    while (Decimal)
    {
        n[i] = num_to_char(Decimal % after);
        Decimal /= after;
        i++;
    }
    n[i] = '\0';
    return i;
}//该函数用于将转化后的十进制数转化换成所需要的进制数

代码来源:李欣欣

评论:

这位同学写的自定义函数,可直接一次性实现任意进制转换,更适用于任意所有进制的进制转换。

三、总结

1.收获:

a.关于写代码:

体验到了直接设计一个程序的困难,直观体会到了未来可能所从事工作的一些点内容,直观感受到了自己的不足,例如考虑问题不全面,在写程序前不思考,不仔细看清楚要求等问题。

b.关于代码:

·有时循环条件可以一起用,可以减炼代码。

·需要判断的条件的输出值与代入下方程序的值需要分辨清楚。

2.函数:

实现某个设定功能的工具,只要有设定,可以在程序任何可执行地方使用。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!