第二次博客园作业

一、进制转换器

1、





3、函数介绍:

a.主函数:

int main()
{
	int c,k;
	int sign=0;
	printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n");                 
	scanf("%d%d",&M,&N);
    /*判断输入的进制是否能进行转换*/
	do{
	    c=(M==2&&N==8)||(M==2&&N==10)||(M==8&&N==2)||(M==8&&N==10)||(M==10&&N==2)||(M==10&&N==8); 
		if(c!=1){
		printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n");                                
		scanf("%d%d",&M,&N);
	    }
	}while(c!=1);
	printf("请输入你要转换的值:\n");                           
	scanf("%d",&X); 
	if(M==2){
		if(N==8){
		    printf("转换值为0%d",change2to8(X));                                             /*输出八进制格式*/
        }else if(N==10){
        	printf("转换值为%d",change2to10(X));                                            /*输出十进制格式*/
		    }
	}else if(M==8){
		intermediate=change8to10(X);
		if(N==10){
			printf("转换值为%d",intermediate);
                               /*输出十进制格式*/
		}else printf("转换值为%d",change10to2(intermediate));
                               /*输出二进制格式*/
	}else if(M==10){
		intermediate=change10to2(X);
		if(N==8){
      	    printf("转换值为0%d",change2to8(intermediate));
                                /*输出八进制格式*/
		}else printf("转换值为%d",intermediate);
                                /*输出二进制格式*/
	}	
} 

函数功能:将输入的十进制、二进制或八进制转换为确定的任意其他两种进制格式。

b.二进制转八进制函数:

int change2to8(int a)
{
 	int i=0,sum=0; 
    int b[3];                                                                       /*定义一个数组存放转换为一位八进制的二进制的三位数*/
 	int n=0;                                                              /*定义n用于循环,i用于统计位数,sum用于算总和*/
 	int d;
	/*以下do-while循环运用去掉位数的方法进行循环*/
	do{
 		for(n=0;n<3;n++){
 			b[n]=a%10;
 			a=a/10;
		}
		d=b[0]*1+b[1]*2+b[2]*4;                                                     /*用三位二进制数转换为一位八进制*/
	    sum=sum+d*pow(10,i);                                                        /*因为该算法是从右往左算,所以若要正确输出,则需加大循环后面的数的位数*/
	    i++;
	}while(a!=0);                                                                   
	return sum;
}

函数功能:将输入值转换为八进制格式。

c.二进制转十进制函数:

int change2to10(int a)
{
	int b;
    int i=0,sum=0; 
	do{
		b=a%10;
		sum=sum+b*pow(2,i);/*按二进制定义来转换为十进制*/
		i++;
		a=a/10;
	}while(a!=0);
	return sum;
}

函数功能:将输入值转换为十进制格式。

d.八进制转十进制函数:

int change8to10(int a)
{
	int b;
    int i=0,sum=0; 
	do{
		b=a%10;
		sum=sum+b*pow(8,i);/*根据定义进行转换*/
		i++;
		a=a/10;
	}while(a!=0);
	return sum;
}

函数功能:将输入值转换为十进制格式。

e.十进制转换为二进制函数:

int change10to2(int a)
{
	int b;
    int i=0,sum=0; 
	do{
		b=a%2;/*根据除二相余法来转换*/
		sum=sum+b*pow(10,i);
		i++;
		a=a/2;
	}while(a!=0);
	return sum;
}

h.全局变量:

int M,N,X,intermediate;                                   /*定义M,N来确定要转换的两种进制,定义X来存放输入值,定义intermediate来存放中间值*/
char s[1000];                                             /*定义字符数组来存放每位数*/

4、该进制转换器的main函数:

int main()
{
	int c,k;
	int sign=0;
	printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n");                 
	scanf("%d%d",&M,&N);
	do{
	    c=(M==2&&N==8)||(M==2&&N==10)||(M==8&&N==2)||(M==8&&N==10)||(M==10&&N==2)||(M==10&&N==8); 
		if(c!=1){
		printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n");                                
		scanf("%d%d",&M,&N);
	    }
	}while(c!=1);                                          
	printf("请输入数值:\n");
	scanf("%d",&X); 
	if(M==2){
		if(N==8){
		    printf("转换值为0%d",change2to8(X));             
        }else printf("转换值为%d",change2to10(X));                                           
	}else if(M==8){
		intermediate=change8to10(X);
		if(N==10){
			printf("转换值为%d",intermediate);
		}else printf("转换值为%d",change10to2(intermediate));
	}else if(M==10){
		intermediate=change10to2(X);
		if(N==8){
      	    printf("转换值为0%d",change2to8(intermediate));
		}else printf("转换值为%d",intermediate);
	}	
} 

5、

6、遇到的问题:

a.不知如何将三位二进制转换为一位八进制并输出:

解决方法:利用数组存放数据进行三位三位循环存为一位数;

联想输出逆序数的方法利用循环与数学函数与乘10的方法依次扩大已求数的位数。

b.不知如何从八进制转换为二进制:

原先代码:

int change8to2(int a)
{
	int b[3];
	int c;
	int n=2,sum=0,d=0,i=0;
	do{
		c=a%10;
		for(n=2;n>=0;n--){
			b[n]=c/pow(2,n);
			c=c-pow(2,n);
			d=d+b[n]*pow(10,n);
		}
		a=a/10;
		sum=sum+d*pow(10,3i);
		i++;
	}while(a!=0);
	return sum;
}

若按照此代码,若c为2或1等小的数,则输出的为负数,而若用递增数列,又不知道该如何扩大位数。

解决方法:将该函数功能改为由八进制转换为十进制,再根据其他函数进行转换。

c.输入输出符号转换:

原本函数:

#include<stdio.h>
#include<math.h>
int change2to8(int a);                                  
int change2to10(int a);                                  
int change8to2(int a);                                  
int change10to2(int a);                               
int judge8(char a);                                       
int judge10(char a);                                     
int M,N,X,intermediate;                                  
char s[1000];                                           
int i=0,k;                           
int main()
{
	printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n");               
	scanf("%d%d",&M,&N);
while(M!=2||M!=8||M!=16||M!=10||N!=2||N!=8||N!=16||N!=10){
		printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n");                              
		scanf("%d%d",&M,&N);
	}
	printf("请输入你要转换的值:");                             
	while((s[i]=getchar())!='\n'){
    	i++;                                                
	}
	s[i]='\0';                                             
	k=i;                                                  
	if(M==2){ 
		for(i=0;i<k;i++){
		while(s[i]<0||s[i]>1){                               
			printf("输入的数值进制错误,请重新输入:\n");        
			while((s[i]=getchar())!='\n'){
    	        i++;
	        }
			s[i]='\0';
		}
	}
		printf("请再输入一遍数值:\n");
		scanf("%d",&X); 
		if(N==8){
		    printf("0%o",change2to8(X));                                             /*输出八进制格式*/
        }else if(N==10){
        	printf("%d",change2to10(X));                                            /*输出十进制格式*/
		}
	}else if(M==8){
		for(i=0;i<k;i++){		
		while(judge8(s[0])==0||s[i]<0||s[i]>7){
			printf("输入的数值进制错误,请重新输入:\n");
			while((s[i]=getchar())!='\n'){
    	        i++;
	        }
			s[i]='\0';
	    }
    }
		printf("请再输入一遍数值:\n");
		scanf("%o",&X);
		intermediate=change8to2(X);
      	if(N==10){
		    printf("%d",change2to10(intermediate));
	    }else printf("%d",intermediate);
	}else if(M==10){
		for(i=0;i<k;i++){		
		while(judge10(s[0])==0||s[i]<0||s[i]>9){
			printf("输入的数值进制错误,请重新输入:\n");
			while((s[i]=getchar())!='\n'){
    	        i++;
	        }
			s[i]='\0';
	    }
    }
		printf("请再输入一遍数值:\n");
		scanf("%d",&X);
		intermediate=change10to2(X);
		if(N==8){
      	    printf("0%o",change2to8(intermediate));
		}else printf("%d",intermediate);
	}	
} 

因为若用符号,则编译器会自动准换为该对应进制,与所编程序输出不同。

解决方法:均用%d输入输出。

二、代码互评

int char_to_num(char a)
{
	if (a >= '0' && a <= '9')
		return a - '0';
	else
		return a - 'A' + 10;
}//该函数用于将字符转换成相应的数字 

char num_to_char(int num)
{
	if (num >= 0 && num <= 9)
		return (char)('0' + num - 0);
	else
		return (char)('A' + num - 10);
}//该函数用于将数字转成相应的字符

int decimal(char n[], int before)
{
	int Decimal = 0;
	int length;
	int i;
	for (i = 0; n[i] != '\0'; i++);
	length = i;
	for (i = 0; i <= length - 1; i++)
		Decimal = (Decimal * before) + char_to_num(n[i]);
	return Decimal;
}//该函数用于将其他进制数统一转换成十进制数

int Toafter(char n[], int Decimal, int after)
{
	int i = 0;
	while (Decimal)
	{
		n[i] = num_to_char(Decimal % after);
		Decimal /= after;
		i++;
	}
	n[i] = '\0';
	return i;
}//该函数用于将转化后的十进制数转化换成所需要的进制数

代码来源:李欣欣

评论:

这位同学写的自定义函数,可直接一次性实现任意进制转换,更适用于任意所有进制的进制转换。

三、总结

1.收获:

a.关于写代码:

体验到了直接设计一个程序的困难,直观体会到了未来可能所从事工作的一些点内容,直观感受到了自己的不足,例如考虑问题不全面,在写程序前不思考,不仔细看清楚要求等问题。

b.关于代码:

·有时循环条件可以一起用,可以减炼代码。

·需要判断的条件的输出值与代入下方程序的值需要分辨清楚。

2.函数:

实现某个设定功能的工具,只要有设定,可以在程序任何可执行地方使用。

posted @ 2019-11-10 22:41  偎己  阅读(147)  评论(0编辑  收藏  举报