函数深化理解与进制转换

一。程序运运行截图

  1. 二。函数介绍

1.main

  1. 输入该数字的原进制 ,使用局部变量primitivesystem2. 输入该数字,使用局部变量number 3. 输入想获得的进制,使用局部变量system 4.进制转换 ,调用函数binaryconversionchange,5. 获得目的数

  2. #include "stdio.h" 
    int decimalconversion(int number,int primitivesystem,int system);//转十进制函数 
    int binaryconversion(int number);//转二进制函数 
    void change(int number,int primitivesystem,int system);//进制相互转换函数 
    int judge(int number,int primitivesystem);//除十六进制外,判断非法函数 
    void input(int number,int primitivesystem);//输入函数 
    int main(void) {
     printf("请输入将输入数为什么进制数\n");
     int primitivesystem;
     scanf("%d",&primitivesystem);
     int number=0;
     int flag=1;
     printf("请输入该数字\n");
     char hexad[100];
     if(primitivesystem!=16){
     scanf("%d",&number);
        }
        else{
         scanf("%s",&hexad);
         for(int i=0;hexad[i]!='\0';i++){
             if(hexad[i]>='0'&&hexad[i]<='9'){
                 number=number*16+hexad[i]-'0';
             }
             else if(hexad[i]>='A'&&hexad[i]<='F'){
                 number=number*16+hexad[i]-'A'+10;
             }
             else if(hexad[i]>='a'&&hexad[i]<='f'){
                 number=number*16+hexad[i]-'a'+10;
             }// 将十六进制字符串转为十进制 
             else{
                 printf("该数字非法,请重新输入");
                 flag=0;
                 break; 
             }//判断十六进制输入是否非法 
         }
         if(flag==1){
             primitivesystem=10;
             input(number,primitivesystem);
        }
     }
     int remainder=0,copy=number;
     if(primitivesystem==2){
         judge(copy,primitivesystem);//调用判断非法函数 
         if(judge(copy,primitivesystem)){
             input(number,primitivesystem);//调用输入函数 
         }
     }
     else if(primitivesystem==8){
         judge(copy,primitivesystem);//调用判断非法函数
         if(judge(copy,primitivesystem)){
             input(number,primitivesystem);//调用输入函数
         }
        } 
     return 0;
    }

2.binaryconversion(转为二进制)

  1. 使用递归将传入的number转为二进制数,分为两种情况,通过number/2==0的返回值,可以运用递归求出结果

  2. int binaryconversion(int number){
     if(number/2==0){
         return number%2;
     }
     else{
         return number%2+binaryconversion(number/2)*10;
     }
    }

3.change(各进制转换)

  1. 进行进制转换,主要通过将十进制转换为别的进制,及别的进制转换为十进制的思想,传入number,primitivesystem,system的值

  2. void change(int number,int primitivesystem,int system)//进制相互转换函数{
        int sum=0;
        int product=1;
     if(primitivesystem==10)//数原进制为十进制{
         if(system==2){
             binaryconversion(number);
             printf("%d\n",binaryconversion(number));
     }
         else if(system==8){
             printf("%o\n",number);
         }
         else if(system==16){
             printf("%x\n",number);
         } 
         else{
             printf("%d\n",number);//因为若为十六进制数输入,已将转为十进制数 ,再进行函数转换 
         }
     }
     else if(primitivesystem==8)//数原进制为八进制{
         if(system==2){
            sum=decimalconversion(number,primitivesystem,system);
            binaryconversion(sum);
            printf("%d\n",binaryconversion(sum));
         }
         else if(system==10){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%d\n",sum);  
         }
         else if(system==16){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%x\n",sum);
         }
     }
     else if(primitivesystem==2)//数原进制为二进制{
         if(system==8){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%o\n",sum);
         }
         else if(system==10){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%d\n",sum);
         }
         else if(system==16){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%x\n",sum);
         }
     }
    }

4. judge(判断输入非法)

  1. 判断除十六进制外的输入非法,传入number与primitivesystem的值

  2. int judge(int copy,int primitivesystem)//判断非法函数{
     int remainder=0;
     int flag=1;
     do{
         remainder=copy%10;
         copy=copy/10;
         if(remainder>primitivesystem-1){
             printf("该数字非法,请重新输入\n");
             flag=0; 
             break;
         }
         }while(copy);
         return flag;
    }

5.input(输入函数)

  1. 进行system的输入及目的数的输出

  2. void input(int number,int primitivesystem)//输入函数{
     printf("请输入你想得到该数的什么进制数\n");
     int system; 
     scanf("%d",&system);
     printf("你将得到你想要的结果\n"); 
     change(number,primitivesystem,system);
     printf("感谢使用\n");
    }

6.decimalconversion(转为十进制数)

  1. 对非十六进制数转为十进制数,传入number,primitivesystem,system的值

  2. int decimalconversion(int number,int primitivesystem,int system)//转为十进制{
     int sum=0;
     int product=1;
     do{
         sum=sum+(number%10)*product;
         number=number/10;
         product=product*primitivesystem;
        }while(number);
        return sum;
    }

三。函数关系思维导图

  1. 完整代码

  2. #include "stdio.h" 
    int decimalconversion(int number,int primitivesystem,int system);//转十进制函数 
    int binaryconversion(int number);//转二进制函数 
    void change(int number,int primitivesystem,int system);//进制相互转换函数 
    int judge(int number,int primitivesystem);//除十六进制外,判断非法函数 
    void input(int number,int primitivesystem);//输入函数 
    int main(void) {
     printf("请输入将输入数为什么进制数\n");
     int primitivesystem;
     scanf("%d",&primitivesystem);
     int number=0;
     int flag=1;
     printf("请输入该数字\n");
     char hexad[100];
     if(primitivesystem!=16){
     scanf("%d",&number);
        }
        else{
         scanf("%s",&hexad);
         for(int i=0;hexad[i]!='\0';i++){
             if(hexad[i]>='0'&&hexad[i]<='9'){
                 number=number*16+hexad[i]-'0';
             }
             else if(hexad[i]>='A'&&hexad[i]<='F'){
                 number=number*16+hexad[i]-'A'+10;
             }
             else if(hexad[i]>='a'&&hexad[i]<='f'){
                 number=number*16+hexad[i]-'a'+10;
             }// 将十六进制字符串转为十进制 
             else{
                 printf("该数字非法,请重新输入");
                 flag=0;
                 break; 
             }//判断十六进制输入是否非法 
         }
         if(flag==1){
             primitivesystem=10;
             input(number,primitivesystem);
         }
     }
     int remainder=0,copy=number;
     if(primitivesystem==2){
         judge(copy,primitivesystem);//调用判断非法函数 
         if(judge(copy,primitivesystem)){
             input(number,primitivesystem);//调用输入函数 
         }
     }
     else if(primitivesystem==8){
         judge(copy,primitivesystem);//调用判断非法函数
         if(judge(copy,primitivesystem)){
             input(number,primitivesystem);//调用输入函数
         }
        } 
     return 0;
    }
    void change(int number,int primitivesystem,int system)//进制相互转换函数{
        int sum=0;
        int product=1;
     if(primitivesystem==10)//数原进制为十进制{
         if(system==2){
             binaryconversion(number);
             printf("%d\n",binaryconversion(number));
     }
         else if(system==8){
             printf("%o\n",number);
         }
         else if(system==16){
             printf("%x\n",number);
         } 
         else{
             printf("%d\n",number);//因为若为十六进制数输入,已将转为十进制数 ,再进行函数转换 
         }
     }
     else if(primitivesystem==8)//数原进制为八进制{
         if(system==2){
            sum=decimalconversion(number,primitivesystem,system);
            binaryconversion(sum);
            printf("%d\n",binaryconversion(sum));
         }
         else if(system==10){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%d\n",sum);  
         }
         else if(system==16){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%x\n",sum);
         }
     }
     else if(primitivesystem==2)//数原进制为二进制{
         if(system==8){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%o\n",sum);
         }
         else if(system==10){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%d\n",sum);
         }
         else if(system==16){
            sum=decimalconversion(number,primitivesystem,system);
            printf("%x\n",sum);
         }
     }
    }
    int binaryconversion(int number)//二进制转换函数{
     if(number/2==0){
         return number%2;
     }
     else{
         return number%2+binaryconversion(number/2)*10;
     }
    }
    int decimalconversion(int number,int primitivesystem,int system)//十进制转换函数{
     int sum=0;
     int product=1;
     do{
         sum=sum+(number%10)*product;
         number=number/10;
         product=product*primitivesystem;
        }while(number);
        return sum;
    }
    void input(int number,int primitivesystem)//输入函数{
     printf("请输入你想得到该数的什么进制数\n");
     int system; 
     scanf("%d",&system);
     printf("你将得到你想要的结果\n"); 
     change(number,primitivesystem,system);
     printf("感谢使用\n");
    }
    int judge(int copy,int primitivesystem)//判断非法函数{
    int remainder=0;
     int flag=1;
     do{
         remainder=copy%10;
         copy=copy/10;
         if(remainder>primitivesystem-1){
             printf("该数字非法,请重新输入\n");
             flag=0; 
             break;
         }
       }while(copy);
       return flag;
    }
    

四。遇到的问题

  1. 十六进制的输入:不能跟别的进制输入一样,通过对字符串的了解,使用%s输入

  2. 对于数字非法的判断中,出现该部分代码影响别的代码运行的情况,不断地调试及设置断点

  3. 忘记初始化number的值,导致十六进制数的进制转换混乱

五。代码互评(网络3班杨涛)

  1. 输入方面,他直接字符数串输入,避免了我的分情况输入

  2. int Tennum(char a[],int b)
    {
     int len, i, num;
     int sum = 0;
     len = strlen(a);
     for (i = 0; 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;
    }
  3. 他的 Numchange函数,利用pow来进行十进制转各进制,我的decimalconversion函数通过循环,实现各进制转十进制,再实现十进制转各进制

  4. void Numchange(int m, int b)
    {
    
     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);
     }
    }

六。总结

  1. 我对于进制转换有了更深刻的了解,各进制转为十进制都有普遍规律,而十进制转为其他进制相对容易
  2. 函数通过实参对形参的传递,可以使代码更加简洁,使内容更具可读性,同时函数能够相互调用,可以通过一个个函数的使用,最终实现比较复杂的运用。

猜你喜欢

转载自www.cnblogs.com/tylk/p/11815722.html