zoukankan      html  css  js  c++  java
  • 函数深化理解与进制转换

    一。程序运运行截图

    二。函数介绍

    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("请输入将输入数为什么进制数
      ");
      	int primitivesystem;
      	scanf("%d",&primitivesystem);
      	int number=0;
      	int flag=1;
      	printf("请输入该数字
      ");
      	char hexad[100];
      	if(primitivesystem!=16){
      	scanf("%d",&number);
          }
          else{
          	scanf("%s",&hexad);
          	for(int i=0;hexad[i]!='';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
      ",binaryconversion(number));
      	}
      		else if(system==8){
      			printf("%o
      ",number);
      		}
      		else if(system==16){
      			printf("%x
      ",number);
      		} 
      		else{
      			printf("%d
      ",number);//因为若为十六进制数输入,已将转为十进制数 ,再进行函数转换 
      		}
      	}
      	else if(primitivesystem==8)//数原进制为八进制{
      		if(system==2){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   binaryconversion(sum);
      		   printf("%d
      ",binaryconversion(sum));
      		}
      		else if(system==10){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%d
      ",sum);	
      		}
      		else if(system==16){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%x
      ",sum);
      		}
      	}
      	else if(primitivesystem==2)//数原进制为二进制{
      		if(system==8){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%o
      ",sum);
      		}
      		else if(system==10){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%d
      ",sum);
      		}
      		else if(system==16){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%x
      ",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("该数字非法,请重新输入
      ");
      			flag=0; 
      			break;
      		}
      	    }while(copy);
      	    return flag;
      }
      

    5.input(输入函数)

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

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

    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("请输入将输入数为什么进制数
      ");
      	int primitivesystem;
      	scanf("%d",&primitivesystem);
      	int number=0;
      	int flag=1;
      	printf("请输入该数字
      ");
      	char hexad[100];
      	if(primitivesystem!=16){
      	scanf("%d",&number);
          }
          else{
          	scanf("%s",&hexad);
          	for(int i=0;hexad[i]!='';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
      ",binaryconversion(number));
      	}
      		else if(system==8){
      			printf("%o
      ",number);
      		}
      		else if(system==16){
      			printf("%x
      ",number);
      		} 
      		else{
      			printf("%d
      ",number);//因为若为十六进制数输入,已将转为十进制数 ,再进行函数转换 
      		}
      	}
      	else if(primitivesystem==8)//数原进制为八进制{
      		if(system==2){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   binaryconversion(sum);
      		   printf("%d
      ",binaryconversion(sum));
      		}
      		else if(system==10){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%d
      ",sum);	
      		}
      		else if(system==16){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%x
      ",sum);
      		}
      	}
      	else if(primitivesystem==2)//数原进制为二进制{
      		if(system==8){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%o
      ",sum);
      		}
      		else if(system==10){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%d
      ",sum);
      		}
      		else if(system==16){
      		   sum=decimalconversion(number,primitivesystem,system);
      		   printf("%x
      ",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("请输入你想得到该数的什么进制数
      ");
      	int system; 
      	scanf("%d",&system);
      	printf("你将得到你想要的结果
      "); 
      	change(number,primitivesystem,system);
      	printf("感谢使用
      ");
      }
      int judge(int copy,int primitivesystem)//判断非法函数{
      int remainder=0;
      	int flag=1;
      	do{
      		remainder=copy%10;
      		copy=copy/10;
      		if(remainder>primitivesystem-1){
      			printf("该数字非法,请重新输入
      ");
      			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. 函数通过实参对形参的传递,可以使代码更加简洁,使内容更具可读性,同时函数能够相互调用,可以通过一个个函数的使用,最终实现比较复杂的运用。
  • 相关阅读:
    pom 打包空目录
    pom添加多个源代码目录
    pom文件中的内置变量
    POM文件中的标签及说明
    maven 中的内置变量
    maven 的几个重要的配置文件:super pom & 生命周期默认绑定的配置文件
    maven 默认的阶段绑定周期(Plugin Bindings for default Lifecycle Reference)
    maven 生命周期参考(Lifecycles Reference)
    maven编译项目
    cygwin 中文乱码
  • 原文地址:https://www.cnblogs.com/tylk/p/11815722.html
Copyright © 2011-2022 走看看