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

原文地址:https://www.cnblogs.com/yyzhu/p/11829149.html