函数+进制转换器

1.运行程序截图

这是我的运行程序截图,首先我先让使用者选择是哪两种进制进行转换,选择相应路径后,输入想转换的的,最后给你相应进制的答案。

2.建立和使用函数

这是所有进制转换的函数,可以进行四种进制,任意两种相互转换。

3.函数关系思维导图

这是进制转换函数与main函数和其他辅助函数的关系图。

4.各个函数内容和介绍

main函数

#include <stdio.h>
#include <math.h>

int abc (int n);
void erba (char m[10000]);
void ershiliu (char m[10000]);
void ershi (char m[10000]);
void baer (char m[10000]);
void bashiliu (char m[10000]);
void bashi (char m[10000]);
void shiliuer (char m[10000]);
void shiliuba (char m[10000]);
void shiliushi (char m[10000]);
void shier (int n);
void shiba (int n);
void shishiliu (int n);
int a(int n);
int b(int n);
int c(int n);
int main()
{
    printf("二进制转换为八进制,请输入1\n二进制转换为十六进制,请输入2\n二进制转换为十进制,请输入3\n"); 
    printf("八进制转换为二进制,请输入4\n八进制转换为十六进制,请输入5\n八进制转换为十进制,请输入6\n"); 
    printf("十六进制转换为二进制,请输入7\n十六进制转换为八进制,请输入8\n十六进制转换为十进制,请输入9\n");
    printf("十进制转换为二进制,请输入10\n十进制转换为八进制,请输入11\n十进制转换为十六进制,请输入12\n");
    
    int n,p;
    scanf("%d",&n);
    char m[10000];
    
    int i,j=0;
    if(n==1||n==2||n==3){
        scanf("%s",&m);
        for(i=0;m[i]!='\0';i++){
            if(m[i]<'0'||m[i]>'1'){
                j++;
            }
        }
        if(j==0&&n==1){
            erba(m);
        }else {
            if(j==0&&n==2){
                ershiliu(m);
            }else {
                if(j==0&&n==3){
                    ershi(m);
                }else {
                    printf("ERROR,不是二进制数");
                    return 0;
                }
            }   
        }
    } 
    if(n==4||n==5||n==6){
        scanf("%s",&m);
        for(i=0;m[i]!='\0';i++){
            if(m[i]<'0'||m[i]>'7'){
                j++;
            }
        }
        if(j==0&&n==4){
            baer(m);
        }else {
            if(j==0&&n==5){
                bashiliu(m);
            }else {
                if(j==0&&n==6){
                    bashi(m);
                }else {
                    printf("ERROR,不是八进制数");
                    return 0;
                }
            }   
        }
    } 
    if(n==7||n==8||n==9){
        scanf("%s",&m);
                for(i=0;m[i]!='\0';i++){
            if(m[i]<'0'||m[i]>'9'||m[i]<'A'||m[i]>'F'){
                j++;
            }
        }
        if(j==0&&n==7){
            shiliuer(m);
        }else {
            if(j==0&&n==8){
                shiliuba(m);
            }else {
                if(j==0&&n==9){
                    shiliushi(m);
                }else {
                    printf("ERROR,不是十六进制数");
                    return 0;
                }
            }   
        }
    } 
    if(n==10||n==11||n==12){
        scanf("%d",&p);
        if(p<0){
            j++;
        }
        if(j==0&&n==10){
            shier(p);
        }else {
            if(j==0&&n==11){
                shiba(p);
            }else {
                if(j==0&&n==12){
                    shishiliu(p);
                }else {
                    printf("ERROR");
                    return 0;
                }
            }   
        }
    } 
    return 0;
}

这是我的main函数里面的内容,讲4种进制两两转换写到一个函数里面,进行计算,通过使用者选择哪种转换,进入相应的函数做进制转换,并且在进入前先进行判断,你输入的进制格式是否符合相应的进制要求,不符合退出,并给你提示。

二进制转换八进制函数

void erba(char m[10000])
{
    
    int i,j,l=0,a=0,k=0;
    int sum=0;
    
    printf("二进制转换为八进制\n");
    printf("答案是:");
    
    for(j=0;m[j]!='\0';j++){
        a++;
    } 
    if(a<=6){
        l=6%a;
    }else {
        l=3-a%6; 
    }
    m[a+l]='\0';
    for(i=a-1;i>=0;i--){
        m[i+l]=m[i];
    }
    for(i=0;i<l;i++){
        m[i]='0';
    }
//到这进行二进制数三位三位对应八进制数。
    for(i=0;m[i]!='\0';i++){
        sum+=(m[i]-'0')*pow(2,(2-k));
        k++;
        if(k%3==0){
            printf("%d",sum);
            k=0;
            sum=0;
        }
    }
}

这个如函数定义一样,是二进制转换成八进制。应为二进制转换成八进制是,二进制三位为八进制以为,我想进行判断,输入的二进制是否是3的倍数,不是,高位填0;然后再三位三位进行转换。

二进制转换十六进制函数

void ershiliu (char m[10000])
{
    
    int i,j,l=0,a=0,k=0;
    int sum=0;

    printf("二进制转换为十六进制\n");
    printf("答案是:");
    
    for(j=0;m[j]!='\0';j++){
        a++;
    } 
    if(a<=8){
        l=8%a;
    }else {
        l=4-a%8; 
    }
    m[a+l]='\0';
    for(i=a-1;i>=0;i--){
        m[i+l]=m[i];
    }
    for(i=0;i<l;i++){
        m[i]='0';
    }
    //到这将二进制数转换成四位四位二进制数,对应十六进制转换。
    for(i=0;m[i]!='\0';i++){
        sum+=(m[i]-'0')*pow(2,(3-k));
        k++;
        if(k%4==0){
            if(sum>9){
                printf("%c",'A'+sum-10);
            }else {
                printf("%d",sum);
            }   
            k=0;
            sum=0;
        }
    }
}

二进制转换位八进制,与上一个函数有着相似的内容,一个意思。

二进制转换十进制函数

void ershi (char m[10000])
{
    
    int i,j,k=0;
    int sum=0;

    printf("二进制转换为十进制\n");
    printf("答案是:");
    
    for(k=0;m[k]!='\0';k++){
    } 
    k-=1;
    for(i=0;m[i]!='\0';i++){
        j=abc(k);
        sum+=(m[i]-'0')*j;
        k--;    
    }
    printf("%d\n",sum); 
}

二进制转换为十进制,从高位算起,对应二进制数乘以相应的乘数,相加得出。在这里运用到另一个函数,一个算2的几次方的函数。

2的次方函数

int abc (int n)
{
    int sum=1;
    for(int i=1;i<=n;i++){
        sum*=2;
    }
    return sum;
}

这是个算2的几次方的函数,头文件自带函数运行太慢,自己写一个,便于二进制转换为十进制。

八进制转换二进制函数

void baer (char m[10000])
{
    
    int i,j,k,l;
    
    printf("八进制转换为二进制\n");
    printf("答案是:");
    
    for(i=0;m[i]!='\0';i++){
        k=m[i]-'0';
        if(k==1){
            printf("00");
        } else {           //中间这个if语句是使输出二进制数为三的倍数,更加好看。
            if(k>1&&k<4){
                printf("0");
            }
        }
        l=a(k);
    }
}

这个是八进制转换为二进制,同样也用到另一个函数,a(k)是将每一位八进制数,转换为相应的三位二进制数。

八进制转换十六进制函数

void bashiliu (char m[10000])
{
    
    int i,j,l=0,a=0,k=0;
    int p=1,q;
    int n[10000];
    
    printf("八进制转换为十六进制\n");
    printf("答案是:");
    
    for(i=0;m[i]!='\0';i++){
        k=m[i]-'0';
        q=p*3-1;
        for(j=i*3;j<i*3+3;j++){
            n[q]=k%2;
            k/=2;
            q--;
        }
        p++;
    }
   //到这八进制转换为二进制数。
    if(j<=8){
        l=8%j;
    }else {
        l=4-j%6; 
    }
    
    for(i=j-1;i>=0;i--){
        n[i+l]=n[i];
    }
    for(i=0;i<l;i++){
        n[i]=0;
    }
//到这进行二进制数转换成四的倍数,四位二进制对应一个十六进制。
    int sum=0;
    
    for(i=0;i<j+l;i++){
        sum+=n[i]*pow(2,(3-k));
        k++;
        if(k%4==0){
            if(sum>9){
                printf("%c",'A'+sum-10);
            }else {
                printf("%d",sum);
            }
            k=0;
            sum=0;
        }
    }
//得出十六进制数。
}

这是八进制转换为十六进制的函数,先将八进制转换为二进制,在将二进制转换为十六进制。

八进制转换十进制函数

void bashi (char m[10000])
{
    
    int i,j,l,k,p=1,a;
    int n[10000];
    
    printf("八进制转换为十进制\n");
    printf("答案是:");
    
    for(i=0;m[i]!='\0';i++){
        k=m[i]-'0';
        l=p*3-1;
        for(j=i*3;j<i*3+3;j++){
            n[l]=k%2;
            k/=2;
            l--;
        }
        p++;
    }

    int sum=0;
    int b=j-1;
    for(i=0;i<j;i++){
        a=abc(b);
        sum+=n[i]*a;
        b--;    
    }
    printf("%d",sum);
    
}

八进制转换为十进制,先转二进制再转十进制。

递归算二进制函数

int a(int n)
{
    if(n==1||n==0){
        printf("%d",n);
    }else {
        a(n/2);
        printf("%d",n%2);
    }
    return 0;
}

这个就是讲以为一位八进制数转换成三位二进制数的函数,输出二进制。

十六进制转换二进制函数

void shiliuer (char m[10000])
{
    
    int i,j,l,k;
    
    printf("十六进制转换为二进制\n");
    printf("答案是:");
    
    for(i=0;m[i]!='\0';i++){
        
        if(m[i]>='0'&&m[i]<='9'){
            k=m[i]-'0';
        }
        if(m[i]>='A'&&m[i]<='F'){
            k=m[i]-'7';
        }
        if(k==1){
            printf("000");
        }else {
            if(k<4){
                printf("00");
            }else {
                if(k<8){
                    printf("0");
                }
            }
        }
        l=a(k);
    }
    
}

十六进制转换为二进制,一位十六进制对应四位二进制,我先判断一位十六进制的大小,先输出高位的0,再去填入二进制数,构成四位二进制数,这里调用了一个a(k)的函数,来算二进制数。

十六进制转换八进制函数

void shiliuba (char m[10000])
{
    
    int i,j,l=0,k=0;
    int n[10000];
    int a,b=1,c;
    printf("十六进制转换为八进制\n");
    printf("答案是:");
    
    for(i=0;m[i]!='\0';i++){
        
        if(m[i]>='0'&&m[i]<='9'){
            k=m[i]-'0';
        }
        if(m[i]>='A'&&m[i]<='F'){
            k=m[i]-'7';
        }
        a=b*4-1;
        for(j=i*4;j<i*4+4;j++){
            n[a]=k%2;
            k/=2;
            a--;
        }
        b++;
    }
    
    if(j<=6){
        l=6%j;
    }else {
        l=3-j%6; 
    }
    for(i=j-1;i>=0;i--){
        n[i+l]=n[i];
    }
    for(i=0;i<l;i++){
        n[i]=0;
    }
    
    int sum=0;
    
    for(i=0;i<j+l;i++){
        sum+=n[i]*pow(2,(2-k));
        k++;
        if(k%3==0){
            printf("%d",sum);
            k=0;
            sum=0;
        }
    }
}

十六进制转换为八进制,函数内容意思与前面相似。

十六进制转换十进制函数

void shiliushi (char m[10000])
{
        
    int i,j,k;
    int n[10000];
    int a,b=1;
    
    printf("十六进制转换为十进制\n");
    printf("答案是:");
    
    for(i=0;m[i]!='\0';i++){
        
        if(m[i]>='0'&&m[i]<='9'){
            k=m[i]-'0';
        }
        if(m[i]>='A'&&m[i]<='F'){
            k=m[i]-'7';
        }
        a=b*4-1;
        for(j=i*4;j<i*4+4;j++){
            n[a]=k%2;
            k/=2;
            a--;
        }
        b++;
    }
    
    int sum=0;
    int c=j-1,l;
    for(i=0;i<j;i++){
        l=abc(c);
        sum+=n[i]*l;
        c--;    
    }
    printf("%d",sum);
    
}

十六进制转换为十进制函数。

十进制转换二进制函数

void shier (int n)
{
    printf("十进制转换为二进制\n");
    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;
}

在十进制转换二进制的函数中,用到另一个函数来计算答案,运用递归函数写法,得出二进制数。

十进制转换八进制函数

void shiba (int n)
{
    printf("十进制转换为八进制\n");
    printf("答案是:");
    b(n); 
}
int b(int n)
{
    if(n<8){
        printf("%d",n);
    }else {
        b(n/8);
        printf("%d",n%8);
    }
    return 0;
}

十进制转换为八进制的函数,相似的算法规律,也是运用一个递归函数来得出答案。

十进制转换十六进制函数

void shishiliu (int n)
{
    printf("十进制转换为十六进制\n");
    printf("答案是:");
    c(n); 
}
int c(int n)
{
    int k;
    if(n<16){
        if(n<10){
            printf("%d",n);
        }else {
            printf("%c",'A'+n-10);
        }
    }else {
        c(n/16);
        k=n%16;
        if(k<10){
            printf("%d",k);
        }else {
            printf("%c",'A'+k-10);
        }
    }
    return 0;
}

十进制转换为十六进制函数,较为麻烦,应为十六进制有用到字母,需要进行相应的转换,需要改动一些。

5.回想代码

在写这个进制转换时,我遇到一下几个问题:

1. 如何判断输入数是否符合,四种进制的要求。我通过查询书本了解四种进制的规则。

2. 如何把读到的数组传到我想去的函数当中。我百度学习知识,了解如何传入。

3. 如何写递归函数。结合学到的知识和不断常试,明白如何写。

4. 进制之间的转换如何用代码写出来。运用函数的知识,在结合进制之间的转换规则,去写代码。

5. 如何使使用者使用起来会舒服点。查询显示代码,美化代码。

6.代码互评(评价他人代码,学习好的地方)网络1913李永福

在与我的八进制转换成十进制的函数中,他比我好的地方是,他有运用到string头文件内的计算字符串长度的函数,使得可以更加简便,但和我的思路不一样,但是这样确实好。在八进制转换成十六进制,与我的想法不同,我是转换成二进制然后再转换成十六进制,而他是转换成十进制,再转换成十六进制,我感觉到好像是他的方法比较好,确实转换成十进制会比转换成十六进制来的简单,这是我要学习的地方。还有运用到初始化数组,这也是我没想到的地方,我还是要多向同学学习学习。

7.总结

从这次博客作业,我从中学习到:

1. 加深了我对进制之间的转换规则,也明白如何用代码表示进制转换。

2. 加深我对其他辅助函数的书写和理解。

3. 让我可以充分使用我学习的知识去有目的的写出一个程序,收获很多。

8.对于函数的理解:

1. 运用函数可以是代码看起来更加的简洁明了,是的代码条理清晰。

2. 函数可以更好的有目的的完成你目的的一部分,几个函数就可以很好的组成你最终的目的。

3. 运用函数的代码,可以让别人看你的代码时,更好的明白,什么是干什么的,让别人更好的看懂你的代码。

猜你喜欢

转载自www.cnblogs.com/jiuweihong/p/11785223.html