• 第二次博客作业: 函数+进制转换器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函数完成想做的事情,并且,如果一个函数需要修改,也不会影响到代码的整体框架。

  • 相关阅读:
    MySQL讲义
    python使用matplotlib在一个图形中绘制多个子图以及一个子图中绘制多条动态折线问题
    python爬虫登陆网页版腾讯课堂
    父子组件之间相互传值
    echarts图中使用到的属性及对应的作用,饼图实例、折线图实例
    vue get类型接口调用方式
    javaScript前进后退点击事件
    vue页面跳转
    如何修改vant组件中原有样式?
    Module not found: Error: Can't resolve 'less-loader' in '文件位置'报错解决
  • 原文地址:https://www.cnblogs.com/cjt0722/p/11826671.html
Copyright © 2020-2023  润新知