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


    一、运行截图。

    1.

    2.

     

    3.

     

    4.

     

    5.

     

    6.

     

    7.

    二、函数功能介绍。

    /*将输入的所有进制数都转换成十进制数*/ 
    int ten(char a[],int b)
    {
        int len=strlen(a);
        int i,num,t=1,number=0;
        int sum=0; 
        if(b!=16){
        for(i=len-1;i>=number;i--){
            sum=sum*b+a[i]-'0';
        }
    }
        else if(b==16){
            for(i=number;i<len;i++){
                if (a[i] >= '0' && a[i] <= '9')
            {
                num = a[i] - '0';
            }
            else if (a[i] >= 'A' && a[i] <= 'F')
            {
                num = a[i] - 'A' + 10;
            }
            sum = sum * b + num;
            }
        }
        return sum;    
     }
    /*将转换的十进制数转换为所需进制数并输出*/ 
     void shuchu(int n,int c)
    {
        if(c!=16){
        if(n>c-1){
            shuchu(n/c,c);
        }
        printf("%d",n%c);
    }
    else if(c==16){
    int a[100]; 
    int i=0; 
    int yushu; 
    char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        while(n>0) 
    { 
    yushu=n%16; 
    a[i++]=yushu; 
    n=n/16; 
    
    } 
    printf("转化为十六进制的数为:0x"); 
    for(i=i-1;i>=0;i--)
    { 
    n=a[i];
    printf("%c",hex[n]); 
    
    } 
    printf("
    "); 
    }
    }
    /*判断输入进制数是否正确*/ 
    int panduan(char a[],int d)
    {
        int flag1;
        int i,len,number=0;
        len=strlen(a);
        int x=d-1+48;
        if(d!=16){ 
        for(i=number;i<len;i++){
            if(a[i]<48||a[i]>x){
            flag1=0;break;
        }
        else{
            flag1=1;
        }
    }
        } 
        else if(d==16){
            for(i=number;i<len;i++)
            {
                if(a[i]<'0'||a[i]>'9'&&a[i]<'A'||a[i]>'F'){
                flag1=0;
                break;
            }
            else
            {
                flag1=1;
            }
            }
        } 
        return flag1;
    }

    代码功能在代码上方以给出,十六进制与其他进制转换都不相同,故用if-else if来分别编写。将所有数转换为十进制是一个中介。

     三、main函数

    int main(){
        int xing,a=0,chu;
        int flag=1; 
        char ru[100];
        printf("输入数的进制类型:
    ");
        scanf("%d",&xing);
        printf("输入的数:
    ");
        getchar();
        scanf("%s",&ru);
        printf("转换进制类型:");
        scanf("%d",&chu);
        printf("Anser:"); 
        int m,n;
        flag=panduan(ru,xing);
        if(flag==1){
        m=ten(ru,xing);
        shuchu(m,chu);
        }
        else{
            printf("输入的数错误");
        } 
    }

    用字符来表达数,其中用getchar的形式来输入。用flag来判断输入数的正误。

    四、思维导图。

     五、问题分析。

    1.判断函数,刚开时调试时,例如输入一个二进制数,若输入221,则答案输出:输入错误。但输入121的时候,并没有显示输入错误,后来检查发现判断的循环语句中没有break,所以前面的数错误时flag1=0,但最后的数是正确的则flag1=0。才导致例子中的问题。

    2.用十六进制数输出时,因为没有定义大于9之后的数用字母表示,则输出数不存在1FA类型的数,后来询问同学和百度搜索。得出,要定义函数,然后将数用数组定义来输出,简洁又明了。

    六、代码互评。

    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);
        }
    }

            以上是杨涛同学的函数代码。其中该功能的代码要比我的简洁的多。我的代码输出十六进制数时,又要重新定义和编写,然后用if-else if放入函数中。他的代码只需说明当number大于10时用字母的形式输出,其中代码量简洁,也减少了运行时间。

    七、总结。

    1.增强了自身对函数的理解,函数里可以套用函数,省去编写很多重复代码。

    2.增强了对字符和字符串的运用。

    3.调试时要实行多样化,输入多种不同的数据进行调试,才能发现隐藏的问题。

    4.面对问题时,要勤于动脑,代码每个人有每个人的特点,每个人的想法都略有不同。我们在编写代码时,要以简洁和运行时间最短为目标。

  • 相关阅读:
    Web实现大文件分片上传的方法
    kinova环境配置
    c++ stl list
    echarts饼图
    js函数
    飞浆测试日志
    IfcRevolvedAreaSolidTapered
    matlab一元二次方程求根
    运行日志
    常用的sql
  • 原文地址:https://www.cnblogs.com/yyzhu/p/11829149.html
Copyright © 2020-2023  润新知