• 第二次博客作业: 函数+进制转换器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.面对问题时,要勤于动脑,代码每个人有每个人的特点,每个人的想法都略有不同。我们在编写代码时,要以简洁和运行时间最短为目标。

  • 相关阅读:
    打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
    基于 Windows Server 2008 的计算机对 Microsoft Dynamics CRM 4.0 的支持
    Microsoft Dynamics CRM 4.0 如何添加自定义按钮
    Microsoft Dynamics CRM 4.0 Plugin 取值,赋值,查询
    C# 中的 enum(枚举) 类型使用例子
    vue事件的绑定
    表单验证2
    node中模块
    node模块的引入
    node中的读文件
  • 原文地址:https://www.cnblogs.com/yyzhu/p/11829149.html
Copyright © 2020-2023  润新知