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

  • 相关阅读:
    hdu 1017 A Mathematical Curiosity 解题报告
    hdu 2069 Coin Change 解题报告
    hut 1574 组合问题 解题报告
    hdu 2111 Saving HDU 解题报
    hut 1054 Jesse's Code 解题报告
    hdu1131 Count the Trees解题报告
    hdu 2159 FATE 解题报告
    hdu 1879 继续畅通工程 解题报告
    oracle的系统和对象权限
    oracle 自定义函数 返回一个表类型
  • 原文地址:https://www.cnblogs.com/cjt0722/p/11826671.html
Copyright © 2011-2022 走看看