函数+进制转换11.10

函数+简单进制转换

一、运行结果


二、所用函数的说明

1)菜单
void mune()
{
	printf("||----------------------------------||\n");
	printf("||----------------------------------||\n");
	printf("||                                  ||\n");
	printf("||            进制转换              ||\n");
	printf("||                                  ||\n");
	printf("||        ☆1、二进制数转换         ||\n");
	printf("||        ☆2、十进制数转换         ||\n");	
	printf("||   	  ☆3、八进制数转换         ||\n");
	printf("||                                  ||\n");
	printf("||----------------------------------||\n");
	printf("||----------------------------------||\n");


	printf("请选择:");
	scanf("%d",&n);
	if(n!=1&&n!=2&&n!=3)
	{
		printf("输入错误!重新输入:") 
		scanf("%d",&n); 
	} 
	printf("请输入一个数:");
	scanf("%d",&x); 	
}
2)将二、八进制数转换为十进制数
 int Octal(int cnum, int m)             //将二、八进制数转换为十进制数// 
{
	int i=0, num[1000];
	while (m)    
	{                                   //将用户数的每一位逆序存入数组,并用变量i计算位数
		num[i] = m % 10;
		m /= 10;
		i++;
	}
	int j,ret=0, unit = 1;
	for (j = 0; j < i; j++)             //将用户数按权展开相加
	{
		ret += num[j] * unit;
		unit *= cnum;
	}
	return ret; 
} 
3)将十进制数转换为二、八进制数
void OctalTo(int cnum, int m)                   //将十进制数转换为二、八进制数// 
{
	int i = 0;
	int num[1000];
	while (m)
	{                                          //整数部分除以基数取余数(取余的方向为从后向前)
		num[i] = m % cnum;                     
		m /= cnum;
		i++;
	}
	if (cnum == 2)printf("%d的二进制数为", x);
	if (cnum == 8)printf("%d的八进制数为", x);
	for (i--; i >= 0; i--)
		printf("%d", num[i]);                  //将数组逆序输出
	printf("\n");
}
4)检查输入的用户数是否合法
void check(int m)
{
	if(n==1)
	{
		static int ch[2]={0,1}; 
		while(m)
		{
			if(m%10!=ch[0]&&m%10!=ch[1])
			{
				printf("输入错误!请输入合法的二进制数:");
				scanf("%d",&x);
				check(x); 
			}
			m/=10;
		}	
	}
	if(n==2)
	{
		static int ch[10]={0,1,2,3,4,5,6,7,8,9};
		while(m)
		{
			if(m%10!=ch[0]&&m%10!=ch[1]&&m%10!=ch[2]&&m%10!=ch[3]&&m%10!=ch[4]&&m%10!=ch[5]&&m%10!=ch[6]&&m%10!=ch[6]&&m%10!=ch[7]&&m%10!=ch[8]&&m%10!=ch[9])
			{
				printf("输入错误!请输入合法的十进制数:");
				scanf("%d",&x);
				check(x); 
			}
			m/=10;
		}
	}
	if(n==3)
	{
		static int ch[8]={0,1,2,3,4,5,6,7};
		while(m)
		{
			if(m%10!=ch[0]&&m%10!=ch[1]&&m%10!=ch[2]&&m%10!=ch[3]&&m%10!=ch[4]&&m%10!=ch[5]&&m%10!=ch[6]&&m%10!=ch[6]&&m%10!=ch[7])
			{
				printf("输入错误!请输入合法的八进制数:");
				scanf("%d",&x);
				check(x); 
			}
			m/=10;
		}
	}
}

**完整的源代码中只用到两个全局变量,分别用来储存用户的选择和用户输入的数。*

三、主函数

int main()
{
	int ret;
	while(1)
	{
		mune();
		switch(n)
		{
			case 1:
				check(x);
				ret=Octal(2,x);
				printf("%d的十进制数为%d\n",x,ret);
				OctalTo(8,x);
				break;
			case 2:
				check(x);
				OctalTo(2,x);
				OctalTo(8,x);
				break;
			case 3:
				check(x);
				ret=Octal(8,x);
				printf("%d的十进制数为%d\n",x,ret);
				OctalTo(2,ret);
				break;
		}
	}
	return 0;
}

四、函数间的相互关系

五、实现过程中:

Q1:需要厘清各种进制数之间的转换关系并编写成代码来实现

S1:查询搜索资料,根据博客 https://blog.csdn.net/qq_35619188/article/details/85000632 学习了相关内容。借鉴博客 https://blog.csdn.net/qq_42820622/article/details/82024324 的相关内容,实现了以上代码。

Q2:检查输入数的合法性,并提示,同时实现正确数据的“重新输入”。

S1:本文中通过简单的if-else语句只实现“选项”这一环节一次检查(仍待改进),通过使用数组相关内容检查输入数据的“各位数字”是否正确,结合if语句进行合法性的判断。但if语句的条件不够简洁。

Q3:如何实现直接实现二、八进制数之间的转换

S3:最终还是通过十进制数作为过渡,将二、八进制数都转换成十进制数后再转换成相应的进制。

六、代码互评

以来代码来源于廖山荣同学:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>    //用到里面的itoa函数 将十进制的数转换为其他进制数
void Er();    //将二进制数转换为其他三种进制数 
void Ba();    //将八进制数转换为其他三种进制数  
void Shi();   //将十进制数转换为其他三种进制数 
void Shiliu();//将十六进制数转换为其他三种进制数 
int main(){
    int a;
    printf("                     进制转化器\n");
    printf("                请选择您要输入的进制\n");
    select:
    printf("         1.二进制 2.八进制 3.十进制 4.十六进制\n");
    scanf("%d",&a);    
    if(a==1)
{      
        Er();
    }else if(a==2){
        Ba(); 
    }else if(a==3){
        Shi();
    }else if(a==4){
        Shiliu();
    }else{
        printf("无效选项\n");
        goto select; 
    }
    return 0;
}
void Er(){//将二进制数转换为其他三种进制数 
    char str[128];
    int b,i,j,length,sum=0;
    input:
    printf("请输入您需要转换的二进制数:\n");
    scanf("%s",str);
        length=strlen(str);   //length为字符长度
    for(i=length-1;i>=0;i--){
        if(str[i]!='0' && str[i]!='1'){
                printf("Error\n");
                printf("请输入正确的二进制数\n");
                goto input;
            }
        }
        printf("请选择您要转换的进制\n");
        choice :
        printf("1.八进制 2.十进制 3.十六进制\n");
        scanf("%d",&b);    
        for(i=length-1,j=0,sum=0;i>=0;i--,j++){  //将输入的数转换为十进制数
            sum += (str[i]-'0') * pow(2,j);
        }
        if(b==1){
    	itoa(sum,str,8);   //用到itoa将该数转换为八进制数
    	printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,10);  //用到itoa将该数转换为十进制数
printf("转换结果为:%s\n",str);
}else if(b==3){
itoa(sum,str,16);  //用到itoa将该数转换为十六进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
void Ba(){//将八进制数转换为其他三种进制数 
    char str[128];
    int b,i,j,length,sum;
    input:
    printf("请输入您需要转换的八进制数:\n");
    scanf("%s",str);
    length=strlen(str);
    for(i=length-1;i>=0;i--){
        if(str[i]<'0' || str[i]>'7'){
            printf("请输入正确的八进制数\n");
            goto input; 
        }
    }
    printf("请选择您要转换的进制\n");
    choice:
    printf("1.二进制 2.十进制 3.十六进制\n"); 
    scanf("%d",&b);
    for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){  //将输入的数转换为十进制数
        sum += (str[i]-'0') * pow(8,j);
    }
        if(b==1){
    	itoa(sum,str,2);   //用到itoa将该数转换为二进制数
    	printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,10);   //用到itoa将该数转换为十进制数 
printf("转换结果为:%s\n",str);
}else if(b==3){
itoa(sum,str,16);   //用到itoa将该数转换为八进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
void Shi(){//将十进制数转换为其他三种进制数  
char str[100];
int b,i,length,sum;
input:
printf("请输入您需要转换的十进制数:\n");
scanf("%s",str);
length=strlen(str);
for(i=length-1;i>=0;i--){
if(str[i]<'0'||str[i]>'9'){
printf("请输入正确的十进制数\n");
goto input;
}
}
printf("请选择您要转换的进制\n");
    choice :
    printf("1.二进制 2.八进制 3.十六进制\n"); 
    scanf("%d",&b);
    for(i=0,sum=0;i<length;i++){   //将输入的数转换为十进制数
            sum= sum*10+(str[i]-'0');
        }
    if(b==1){
    	itoa(sum,str,2);  //用到itoa将该数转换为二进制数
    	printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,8);  //用到itoa将该数转换为八进制数
printf("转换结果为:%s\n",str);
}else if(b==3){
itoa(sum,str,16);  //用到itoa将该数转换为十六进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
void Shiliu(){//将十六进制数转换为其他三种进制数  
    char str[128];
    int b,i,j,length,sum;
    input:
    printf("请输入您要转换的十六进制的数:\n");
    scanf("%s",str);
    length=strlen(str);
    for(i=length-1;i>=0;i--){
        if(str[i]<'0' || (str[i]>'9' && str[i]<'A') || (str[i]>'F' && str[i]<'a')|| (str[i]>'f')){
            printf("请输入正确的十六进制数\n");
            goto input; 
        }
    }
    printf("请选择您要转换的进制\n");
    choice:
    printf("1.二进制 2.八进制 3.十进制\n"); 
    scanf("%d",&b);
    for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){  //将输入的数转换为十进制数 
    if(str[i]>='0' && str[i]<='9'){
        str[i] = str[i]-'0';
    }else if(str[i]>='A' && str[i]<='F'){
        str[i] = str[i]-'A'+10;
    }else if(str[i]>='a' && str[i]<='f'){
        str[i] = str[i]-'a'+10;
    }
    sum += (str[i]) * pow(16,j);
    }
    if(b==1){
    	itoa(sum,str,2);  //用到itoa将该数转换为二进制数
    	printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,8);  //用到itoa将该数转换为八进制数
printf("转换结果为:%s",str);
}else if(b==3){
itoa(sum,str,10);  //用到itoa将该数转换为十进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}

1)以上代码实现了本文未实现的16进制的转换。通过if-else语句,根据数组中的各个位数的相应数据,以及ascii码中的转换实现16进制向10进制的转换。

2)本文使用录各位数字进入数字,再根据各进制之间的关系,通过简单计算得到,以上代码则将各个进制数转换成十进制数后借助itoa()函数直接得出相应结果,更加简单明了。

3)于用户角度而言,本文只通过一个选项和一个数字的输入,直接输出其他进制数。以上代码则是通过二次选择,分别是:输入数的进制形式以及需输出数的进制形式。前者步骤简单,输出内容较为多样,但不够直接。后者则更加精准,简明。

4)以上代码还通过goto语句,简单明了地实现了如若输入错误后的“重新输入”的步骤,使代码更加精炼,可读性强。

七、总结

收获:

1)进制之间转换的计算方法和代码实现方式;

2)认识itoa()函数;以及goto()语句;

3)进一步认识到代码可读性的重要和程序的“对象性”,要更多从使用者的角度出发,在编写程序的过程中更多地考虑使用者地使用感受,例如各种错误输入的提示;

函数:

其最直观的作用就是使代码分块,精简主函数,使代码条理清晰,可读性强。

其次,在程序编写过程中,通过函数的反复调用,可以减少代码的重复步骤,简化程序的实现。

再次,在使用函数时,应该更多地注意到变量的使用范围,注意各函数之间的变量设置,避免不必要的数据混乱。

posted @ 2019-11-10 20:28  蛋炒饭特稀  阅读(158)  评论(0编辑  收藏  举报