函数深化理解与进制转换

一。程序运运行截图

二。函数介绍

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. 函数通过实参对形参的传递,可以使代码更加简洁,使内容更具可读性,同时函数能够相互调用,可以通过一个个函数的使用,最终实现比较复杂的运用。
posted @ 2019-11-07 21:19  rghli(林洁颖)  阅读(240)  评论(0编辑  收藏  举报