第二次作业

一、程序运行截图###

1、

2、

3、

4、

5、

二、函数介绍###

1、main:在此函数中,选择输入的进制数并输入该数,若输入的进制数不是二进制、八进制、十进制中的一个,直接输出error,若是,先判断该数是否合法,不合法,直接输出error,合法则选择要转化的进制数,调用相应函数

2、two(int x):将十进制转化为二进制

int two(int x)
{
	int i,count;
	for(i=0;x!=0;i++){
	a[i]=x%2;
	x=x/2;
	count=i;
	}
	for(i=count;i>=0;i--)
	printf("%d",a[i]);
} 

3、eight(int x):将十进制转化为八进制

int eight(int x)
{
	int i,count,digit;
	for(i=0;x!=0;i++){
		a[i]=x%8;
		x=x/8;
		count=i;
	}
	for(i=count;i>=0;i--)
	printf("%d",a[i]);
}

4、to_ten(int x):将二进制或八进制转为十进制

int to_ten(int x)
{
	int i,z,sum;
	sum=0;
	if(choice==2){
		for(i=0;x!=0;i++){
			z=x%2;
			sum=sum+z*pow(2,i);
			x=x/10;
		}
		return sum;
	}//二进制转十进制 
	if(choice==8){
		for(i=0;x!=0;i++){
			z=x%8;
			sum=sum+z*pow(8,i);
			x=x/8;
		}
		return sum;
	}//八进制转十进制 
}

5、pow函数:在转十进制中发挥作用,与for循环配合,将每位的数字转为十进制的表达形式,逐步相加,得到它的十进制数;将数字字符型转化为整型

三、全局变量###

1、int choice:使输入的进制在所有函数中都起作用,在调用to_ten(int x)函数转十进制时可直接判断执行哪个操作
2、int a[1000]:使数组在two(int x)函数和eight(int x)函数中都可以用,无需定义两次,让代码更简洁,且利于逆序输出

四、main函数###

int main()
{
	int j,x,y,t,flag;
	flag=1;
	printf("输入的进制数:");
	scanf("%d",&choice);
	switch(choice){
		case 2:{
			scanf("%d",&x);
			y=x;
			do{
				j=y%10;
				if(j==0||j==1) y=y/10;
				else {
					flag=0;
					break;
				}
			}while(y!=0);//判断输入是否合法 
			if(flag==0){
				printf("ERROR\n");
				break;
			}else{
			printf("要转化成的进制数:");
			scanf("%d",&t);
			x=to_ten(x);
			if(t==10) printf("%d",x);
			if(t==8) eight(x);
			break;
			}
		}
		case 8:{
			scanf("%d",&x);
			y=x;
			do{
				j=y%10;
				if(j>=0&&j<=7) y=y/10;
				else {
					flag=0;
					break;
				}
			}while(y!=0);
			if(flag==0){
				printf("ERROR\n");
				break;
			}else{
			printf("要转化成的进制数:");
			scanf("%d",&t);
			x=to_ten(x);
			if(t==10) printf("%d",x);
			if(t==2) two(x);
			break;
			}
		}
		case 10:{
			int i,c,sum,a[1000];
			c=sum=0;
			i=0;
			char s[1000];
			scanf("%s",s);
			for(i=0;s[i]!='\0';i++){
				if(s[i]>='0'&&s[i]<='9'){
					c++;
				}
				else {
					flag=0;
					break;
				}
			}//判断输入是否合法 
			if(flag==0){
				printf("ERROR\n");
				break;
			}else{
				for(i=0;i<c;i++){
					a[i]=s[i]-'0';
					sum=sum+a[i]*pow(10,c-1-i); 
				}//将数字字符型转化为整型 
			printf("要转化成的进制数:");
			scanf("%d",&t);
			if(t==8) eight(sum);
			if(t==2) two(sum);
			break;
			}
		}
		default:printf("ERROR");break;//输入的进制数不属于二进制、八进制、十进制中的任意一个 
	}
	return 0;
}

五、思维导图###

六、问题和解决方法###

1、输入八进制时用了%o,使判断输入的八进制是否合法时出错
解决方法:将%o改为%d
2、判断输入的十进制是否合法时出错,无法正确判断有字母出现的情况
解决方法:将数以字符串数组的形式输入,判断它们是否范围都在‘0’~‘9’之间,合法再将数字字符转为整型

七、代码互评(网络1913杨涛)###

int Tennum(char a[],int b)//将输入的数字转换为10进制数
{
    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;
}

1、杨同学直接调用库函数中的strlen求字符长度,代码更简洁;而我用for语句算出最后一个字符的下标
2、杨同学用字符串输入,用了一个函数就可以完成任意进制转为十进制;而我在这里没用字符串,而是对输入的数进行取余、相加、除法计算,且无法进行十六进制的转化

八、总结###

1、收获:熟悉了进制的转化;在需要逆序输出数字时,选择数组会方便一些;了解了字符型和整型之间的转化
2、函数理解:函数可提高代码的可读性;可在一个函数中调用其他的函数;若是两个函数之间有共同的变量,可以将该变量定义为全局变量,更方便简洁

posted @ 2019-11-09 23:43  白祁  阅读(166)  评论(0编辑  收藏  举报