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

倖福魔咒の 提交于 2019-12-04 02:19:11

一、博客内容

1.运行截图

正常运行的截图(其他情况与此类似,就不一一贴出了):

存在输入错误时的截图(其他格式不规范或者输入正常的情况与此类似,也不一一贴出了):

2.额外扩展的功能

十六进制与其他三种进制的互相转换:

当你要输入一个二进制或者其他进制的数时,你输入的却不是该进制的数,会得到一个错误提示并让你重新输入,运行情况如上面第二张图;

当你要选择需要转换的数字是几进制时,如1.二进制 2.八进制 3.十进制 4.十六进制,若输入除了1~4以外的数字就会有一个错误提示并让你重新选择,运行结果如上面第二张图;

当你要选择想把数字转换成几进制时,如二进制转其他进制 1.八进制 2.十进制 3.十六进制,若输入除了1~3以外的数字就会有一个错误提示并让你重新选择,效果如上面第二张图;

3.介绍函数

所有函数的声明:

二进制转其他进制的函数:

void erjinzhi(void);

void erjinzhi(void){
    char number[128];
    int t2,i,j,length,sum=0;
    input:
    printf("请输入想要转换的数:\n");
    scanf("%s",number);
        length=strlen(number);
    for(i=length-1;i>=0;i--){
        if(number[i]!='0' && number[i]!='1'){
                printf("您输入的数并不是二进制数,请重新输入\n");
                goto input;
            }
        }
        printf("您想转换成几进制的数?\n");
        choice :
        printf("1.八进制 2.十进制 3.十六进制\n");
        scanf("%d",&t2);    
        for(i=length-1,j=0,sum=0;i>=0;i--,j++){
            sum += (number[i]-'0') * pow(2,j);
        }
        if(t2==1){
            printf("%o",sum);
            }else if(t2==2){
                printf("%d",sum);
            }else if(t2==3){
                printf("%x",sum);
            }else{
                printf("输入错误,请重新选择想要转换的进制\n");
                goto choice;
            }
}

八进制转其他进制的函数:

void bajinzhi(void);

void bajinzhi(void){
    char number[128];
    int t2,i,j,length,sum;
    input:
    printf("请输入想要转换的数:\n");
    scanf("%s",number);
    length=strlen(number);
    for(i=length-1;i>=0;i--){
        if(number[i]<'0' || number[i]>'7'){
            printf("您输入的数并不是八进制数,请重新输入\n");
            goto input; 
        }
    }
    printf("您想转换成几进制的数?\n");
    choice:
    printf("1.二进制 2.十进制 3.十六进制\n"); 
    scanf("%d",&t2);
    for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){
        sum += (number[i]-'0') * pow(8,j);
    }
    if(t2==1){
        int n[100];
        i=0;
        while(sum>0){
            n[i]=sum%2;
            sum/=2;
            i++;
        }
        for(j=i-1;j>=0;j--){
            printf("%d",n[j]);
        }
    }else if(t2==2){
        printf("%d",sum);
    }else if(t2==3){
        printf("%x",sum);
    }else{
        printf("输入错误,请重新选择想要转换的进制\n");
        goto choice; 
    }
}

十进制转其他进制的函数:

void shijinzhi(void);

void shijinzhi(void){
    char number[128];
    int t2,i,j,length,sum;
    input:
    printf("请输入想要转换的数:\n");
    scanf("%s",number);
    length=strlen(number);
    for(i=length-1;i>=0;i--){
        if(number[i]<'0' || number[i]>'9'){
            printf("您输入的数并不是十进制数,请重新输入\n");
            goto input; 
        }
    }
    printf("您想转换成几进制的数?\n");
    choice:
    printf("1.二进制 2.八进制 3.十六进制\n"); 
    scanf("%d",&t2);
    for(i=0,sum=0;i<length;i++){
            sum= sum*10+(number[i]-'0');
        }
    if(t2==1){
        int n[100];
        i=0;
        while(sum>0){
            n[i]=sum%2;
            sum/=2;
            i++;
        }
        for(j=i-1;j>=0;j--){
            printf("%d",n[j]);
        }
    }else if(t2==2){
        printf("%o",sum);
    }else if(t2==3){
        printf("%x",sum);
    }else{
        printf("输入错误,请重新选择想要转换的进制\n");
        goto choice;
    }
}

十六进制转其他进制的函数:

void shiliujinzhi(void);

void shiliujinzhi(void){
    char number[128];
    int t2,i,j,length,sum;
    input:
    printf("请输入想要转换的数:\n");
    scanf("%s",number);
    length=strlen(number);
    for(i=length-1;i>=0;i--){
        if(number[i]<'0' || (number[i]>'9' && number[i]<'A') || (number[i]>'F' && number[i]<'a')|| (number[i]>'f')){
            printf("您输入的数并不是十六进制数,请重新输入\n");
            goto input; 
        }
    }
    printf("您想转换成几进制的数?\n");
    choice:
    printf("1.二进制 2.八进制 3.十进制\n"); 
    scanf("%d",&t2);
    for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){
        if(number[i]>='0' && number[i]<='9'){
            number[i] = number[i]-'0';
        }else if(number[i]>='A' && number[i]<='F'){
            number[i] = number[i]-'A'+10;
        }else if(number[i]>='a' && number[i]<='f'){
            number[i] = number[i]-'a'+10;
        }
        sum += (number[i]) * pow(16,j);
    }
    if(t2==1){
        int n[100];
        i=0;
        while(sum>0){
            n[i]=sum%2;
            sum/=2;
            i++;
        }
        for(j=i-1;j>=0;j--){
            printf("%d",n[j]);
        }
    }else if(t2==2){
        printf("%o",sum);
    }else if(t2==3){
        printf("%d",sum);
    }else{
        printf("输入错误,请重新选择想要转换的进制\n");
        goto choice; 
    }
}

4.main函数

#include<stdio.h>
#include<string.h>
#include<math.h>
void erjinzhi(void);
void bajinzhi(void);
void shijinzhi(void);
void shiliujinzhi(void);
int main(){
    int t1;//t1,t2是用来判断用户想要是输入和输出的是几进制的数,length是输入的字符串的长度;
    printf("请问您输入的是几进制的数?\n");
    select:
    printf("1.二进制 2.八进制 3.十进制 4.十六进制\n");
    scanf("%d",&t1);    
    if(t1==1){
        erjinzhi();
    }else if(t1==2){
        bajinzhi(); 
    }else if(t1==3){
        shijinzhi();
    }else if(t1==4){
        shiliujinzhi();
    }else{
        printf("输入错误,请重新选择进制\n");
        goto select; 
    }
    return 0;
}

5.用思维导图来表示程序中函数的关系

6.在完成本次作业过程中遇到的问题,如何解决的:

(1)关于如何读入数值,一开始想的是直接用scanf("%d",&number);读进来,但是写到十六进制的时候发现不行了,就都改成用scanf("%s",number)读入字符串。

(2)如何计算字符串的长度,本来想用循环计数,读到'\0'就结束,后来知道了还有strlen这个计算字符串长度,就又简化了代码。

(3)怎么把字符串传递到函数中?百度之后知道是 void erjinzhi(char*number) 这样写的,但是由于goto只能在同一个函数内用,所以还是改成在每个进制转换的函数里自己读入字符串。

(4)关于错误提示,写完错误提示之后应该让用户再输入一次,本来想用循环,但是想了想还是用goto比较方便。goto虽然会使程序的可读性和复杂性变得更差,但是现在看来还是蛮好用的。

二、代码互评

void Numchange(int m, int b)//将10进制数转化为任意进制数
{
    
    int n = m;
    int count = 0;
    if (m == 0) printf("0");
    while (n != 0)
    {
        n = n / b;
        count++;
    }
    int number;
    for (int i = count; i >= 1; i--)
    {
        number = m / (int)pow(b, i - 1);
        if (number < 10) {
            printf("%d", number);
        }
        else {
            printf("%c", number + 55);
        }
        m = m % (int)pow(b, i - 1);
    }
}

以上是杨涛同学的代码的其中一个函数,功能为将10进制数转换为任意进制数。这个函数可以把十进制数转换成其他任意进制数,这样只要把数都先转换成十进制数,就能完成任意进制数转换成任意进制数,少用了几个函数,代码简洁了很多。而我的代码是把二进制转其他三个进制、八进制转其他三个进制、十进制转其他三个进制、十六进制转其他三个进制 分别写成四个函数,这样就把转换的方向给限制死了,没有他的灵活。总之,他的代码可用性强得多,很灵活,我之前都没想到还能这么写,要多向他学习。

总结。

1.收获

对于进制转换的理解更深刻了。

能充分利用所学知识去写一个小程序,锻炼了写代码的能力

也了解了一些知识如 goto 、strlen函数、字符串的实际应用等等。

2.对于函数这一概念的理解

每一个函数都有他自己的功能和目的,函数之间互相不影响,但是也可以根据情况使用递归函数、嵌套函数使两个或多个函数联系起来。

函数可以让代码变的更加简洁、灵活,并增加了可读性,可以省去一大部分重复的步骤。

函数作为代码的一部分,就像一个工具去帮助main函数完成想做的事情,并且,如果一个函数需要修改,也不会影响到代码的整体框架。

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