第二次博客作业: 函数+进制转换器v1.0beta

一、博客内容

1.运行截图

正常运行的截图(其他情况与此类似,就不一一贴出了):

存在输入错误时的截图(其他格式不规范或者输入正常的情况与此类似,也不一一贴出了):


2.额外扩展的功能

十六进制与其他三种进制的互相转换:

当你要输入一个二进制(或者其他进制)的数时,你输入的却不是该进制的数或者输入错误字符,会得到一个错误提示并让你重新输入,运行情况如上面第二张图;

当你要选择需要转换的数字是几进制时,如1.二进制 2.八进制 3.十进制 4.十六进制,若输入除了1~4以外的数字就会有一个错误提示并让你重新选择,运行结果如上面第二张图;

当你要选择想把数字转换成几进制时,如二进制转其他进制 1.八进制 2.十进制 3.十六进制,若输入除了1~3以外的数字就会有一个错误提示并让你重新选择,效果如上面第二张图;

3.介绍函数

所有函数的声明:

二进制转其他进制的函数:

void erjinzhi(void);

void erjinzhi(void){
	char number[128];
	int t2,i,j,length,sum=0;
	input:
	printf("请输入想要转换的数:\n");
	scanf("%s",number);
		length=strlen(number);
	for(i=length-1;i>=0;i--){
		if(number[i]!='0' && number[i]!='1'){
				printf("您输入的数并不是二进制数,请重新输入\n");
				goto input;
			}
		}
		printf("您想转换成几进制的数?\n");
		choice :
		printf("1.八进制 2.十进制 3.十六进制\n");
		scanf("%d",&t2);	
		for(i=length-1,j=0,sum=0;i>=0;i--,j++){
			sum += (number[i]-'0') * pow(2,j);
		}
		if(t2==1){
			printf("%o",sum);
			}else if(t2==2){
				printf("%d",sum);
			}else if(t2==3){
				printf("%x",sum);
			}else{
				printf("输入错误,请重新选择想要转换的进制\n");
				goto choice;
			}
}

先把二进制数转换成十进制数,再用%o输出八进制数,用%d输出十进制数,用%x输出十六进制数。

八进制转其他进制的函数:

void bajinzhi(void);

void bajinzhi(void){
	char number[128];
	int t2,i,j,length,sum;
	input:
	printf("请输入想要转换的数:\n");
	scanf("%s",number);
	length=strlen(number);
	for(i=length-1;i>=0;i--){
		if(number[i]<'0' || number[i]>'7'){
			printf("您输入的数并不是八进制数,请重新输入\n");
			goto input; 
		}
	}
	printf("您想转换成几进制的数?\n");
	choice:
	printf("1.二进制 2.十进制 3.十六进制\n"); 
	scanf("%d",&t2);
	for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){
		sum += (number[i]-'0') * pow(8,j);
	}
	if(t2==1){
		int n[100];
		i=0;
		while(sum>0){
			n[i]=sum%2;
			sum/=2;
			i++;
		}
		for(j=i-1;j>=0;j--){
			printf("%d",n[j]);
		}
	}else if(t2==2){
		printf("%d",sum);
	}else if(t2==3){
		printf("%x",sum);
	}else{
		printf("输入错误,请重新选择想要转换的进制\n");
		goto choice; 
	}
}

先把八进制数转换成十进制数,然后利用数组把十进制数转换成二进制数并输出,再用%d输出十进制数,用%x输出十六进制数。

十进制转其他进制的函数:

void shijinzhi(void);

void shijinzhi(void){
	char number[128];
	int t2,i,j,length,sum;
	input:
	printf("请输入想要转换的数:\n");
	scanf("%s",number);
	length=strlen(number);
	for(i=length-1;i>=0;i--){
		if(number[i]<'0' || number[i]>'9'){
			printf("您输入的数并不是十进制数,请重新输入\n");
			goto input; 
		}
	}
	printf("您想转换成几进制的数?\n");
	choice:
	printf("1.二进制 2.八进制 3.十六进制\n"); 
	scanf("%d",&t2);
	for(i=0,sum=0;i<length;i++){
			sum= sum*10+(number[i]-'0');
		}
	if(t2==1){
		int n[100];
		i=0;
		while(sum>0){
			n[i]=sum%2;
			sum/=2;
			i++;
		}
		for(j=i-1;j>=0;j--){
			printf("%d",n[j]);
		}
	}else if(t2==2){
		printf("%o",sum);
	}else if(t2==3){
		printf("%x",sum);
	}else{
		printf("输入错误,请重新选择想要转换的进制\n");
		goto choice;
	}
}

利用数组把十进制数转换成二进制数并输出,再用%o输出八进制数,用%x输出十六进制数。

十六进制转其他进制的函数:

void shiliujinzhi(void);

void shiliujinzhi(void){
	char number[128];
	int t2,i,j,length,sum;
	input:
	printf("请输入想要转换的数:\n");
	scanf("%s",number);
	length=strlen(number);
	for(i=length-1;i>=0;i--){
		if(number[i]<'0' || (number[i]>'9' && number[i]<'A') || (number[i]>'F' && number[i]<'a')|| (number[i]>'f')){
			printf("您输入的数并不是十六进制数,请重新输入\n");
			goto input; 
		}
	}
	printf("您想转换成几进制的数?\n");
	choice:
	printf("1.二进制 2.八进制 3.十进制\n"); 
	scanf("%d",&t2);
	for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){
		if(number[i]>='0' && number[i]<='9'){
			number[i] = number[i]-'0';
		}else if(number[i]>='A' && number[i]<='F'){
			number[i] = number[i]-'A'+10;
		}else if(number[i]>='a' && number[i]<='f'){
			number[i] = number[i]-'a'+10;
		}
		sum += (number[i]) * pow(16,j);
	}
	if(t2==1){
		int n[100];
		i=0;
		while(sum>0){
			n[i]=sum%2;
			sum/=2;
			i++;
		}
		for(j=i-1;j>=0;j--){
			printf("%d",n[j]);
		}
	}else if(t2==2){
		printf("%o",sum);
	}else if(t2==3){
		printf("%d",sum);
	}else{
		printf("输入错误,请重新选择想要转换的进制\n");
		goto choice; 
	}
}

先把十六进制数转换成十进制数,然后利用数组把十进制数转换成二进制数并输出,再用%o输出八进制数,用%d输出十进制数。

4.main函数

#include<stdio.h>
#include<string.h>
#include<math.h>
void erjinzhi(void);
void bajinzhi(void);
void shijinzhi(void);
void shiliujinzhi(void);
int main(){
	int t1;//t1,t2是用来判断用户想要是输入和输出的是几进制的数,length是输入的字符串的长度;
    printf("请问您输入的是几进制的数?\n");
    select:
	printf("1.二进制 2.八进制 3.十进制 4.十六进制\n");
	scanf("%d",&t1);	
	if(t1==1){
        erjinzhi();
	}else if(t1==2){
		bajinzhi(); 
	}else if(t1==3){
		shijinzhi();
	}else if(t1==4){
		shiliujinzhi();
	}else{
		printf("输入错误,请重新选择进制\n");
		goto select; 
	}
    return 0;
}

5.用思维导图来表示程序中函数的关系

6.在完成本次作业过程中遇到的问题,如何解决的:

(1)关于如何读入数值,一开始想的是直接用scanf("%d",&number);读进来,但是十六进制不能这么读入,就都改成用scanf("%s",number)读入字符串。

(2)如何计算字符串的长度,本来想用循环计数,读到'\0'就结束,后来直接用了strlen函数得出字符串长度。

(3)怎么把字符串传递到函数中?百度了这个写法void erjinzhi(char*number) 。但是因为goto只能在同一个函数内用,所以还是改成在每个进制转换的函数里读入字符串,而不是在main函数里读入。

(4)关于错误提示,写完错误提示之后应该让用户再输入一次,本来想用循环,但是想了想还是用goto比较方便。goto虽然会使程序的可读性变得更差,但是现在看来还是蛮好用的。

二、代码互评

void Numchange(int m, int b)//将10进制数转化为任意进制数
{
    
    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);
    }
}

以上是杨涛同学的代码的其中一个函数,功能为将10进制数转换为任意进制数。这个函数可以把十进制数转换成其他任意进制数,这样只要把数都先转换成十进制数,就能完成任意进制数转换成任意进制数,少用了几个函数,代码简洁了很多。而我的代码是把二进制转其他三个进制、八进制转其他三个进制、十进制转其他三个进制、十六进制转其他三个进制 分别写成四个函数,这样就把转换的方向给限制死了,没有他的灵活。总之,他的代码可用性强得多,很灵活,我之前都没想到还能这么写,要多向他学习。

总结。

1.收获

对于进制转换的理解更深刻了。

能充分利用所学知识去写一个小程序,锻炼了写代码的能力

也了解了一些知识如 goto 、strlen函数、字符串的实际应用等等。

2.对于函数这一概念的理解

每一个函数都有他自己的功能和目的,函数之间互相不影响,但是也可以根据情况使用递归函数、嵌套函数使两个或多个函数联系起来。

函数可以让代码变的更加简洁、灵活,并增加了可读性,可以省去一大部分重复的步骤。

函数作为代码的一部分,就像一个工具去帮助main函数完成想做的事情,并且,如果一个函数需要修改,也不会影响到代码的整体框架。

posted @ 2019-11-09 22:29  rrrushB  阅读(244)  评论(0编辑  收藏  举报