zoukankan      html  css  js  c++  java
  • 函数+进制转换器

    1.运行程序截图

    这是我的运行程序截图,首先我先让使用者选择是哪两种进制进行转换,选择相应路径后,输入想转换的的,最后给你相应进制的答案。

    2.建立和使用函数

    这是所有进制转换的函数,可以进行四种进制,任意两种相互转换。

    3.函数关系思维导图

    这是进制转换函数与main函数和其他辅助函数的关系图。

    4.各个函数内容和介绍

    main函数

    #include <stdio.h>
    #include <math.h>
    
    int abc (int n);
    void erba (char m[10000]);
    void ershiliu (char m[10000]);
    void ershi (char m[10000]);
    void baer (char m[10000]);
    void bashiliu (char m[10000]);
    void bashi (char m[10000]);
    void shiliuer (char m[10000]);
    void shiliuba (char m[10000]);
    void shiliushi (char m[10000]);
    void shier (int n);
    void shiba (int n);
    void shishiliu (int n);
    int a(int n);
    int b(int n);
    int c(int n);
    int main()
    {
        printf("二进制转换为八进制,请输入1
    二进制转换为十六进制,请输入2
    二进制转换为十进制,请输入3
    "); 
        printf("八进制转换为二进制,请输入4
    八进制转换为十六进制,请输入5
    八进制转换为十进制,请输入6
    "); 
        printf("十六进制转换为二进制,请输入7
    十六进制转换为八进制,请输入8
    十六进制转换为十进制,请输入9
    ");
        printf("十进制转换为二进制,请输入10
    十进制转换为八进制,请输入11
    十进制转换为十六进制,请输入12
    ");
        
    	int n,p;
    	scanf("%d",&n);
    	char m[10000];
    	
    	int i,j=0;
    	if(n==1||n==2||n==3){
    		scanf("%s",&m);
    		for(i=0;m[i]!='';i++){
    		    if(m[i]<'0'||m[i]>'1'){
    		    	j++;
    			}
    	    }
    	    if(j==0&&n==1){
    	    	erba(m);
    		}else {
    			if(j==0&&n==2){
    				ershiliu(m);
    			}else {
    				if(j==0&&n==3){
    					ershi(m);
    				}else {
    					printf("ERROR,不是二进制数");
    		            return 0;
    				}
    			}	
    		}
    	} 
    	if(n==4||n==5||n==6){
    		scanf("%s",&m);
    		for(i=0;m[i]!='';i++){
    		    if(m[i]<'0'||m[i]>'7'){
    		    	j++;
    			}
    	    }
    	    if(j==0&&n==4){
    	    	baer(m);
    		}else {
    			if(j==0&&n==5){
    				bashiliu(m);
    			}else {
    				if(j==0&&n==6){
    					bashi(m);
    				}else {
    					printf("ERROR,不是八进制数");
    		            return 0;
    				}
    			}	
    		}
    	} 
    	if(n==7||n==8||n==9){
    		scanf("%s",&m);
                    for(i=0;m[i]!='';i++){
    		    if(m[i]<'0'||m[i]>'9'||m[i]<'A'||m[i]>'F'){
    		    	j++;
    			}
    	    }
    	    if(j==0&&n==7){
    	    	shiliuer(m);
    		}else {
    			if(j==0&&n==8){
    				shiliuba(m);
    			}else {
    				if(j==0&&n==9){
    					shiliushi(m);
    				}else {
    					printf("ERROR,不是十六进制数");
    		            return 0;
    				}
    			}	
    		}
    	} 
    	if(n==10||n==11||n==12){
    		scanf("%d",&p);
    		if(p<0){
    			j++;
    		}
    	    if(j==0&&n==10){
    	    	shier(p);
    		}else {
    			if(j==0&&n==11){
    				shiba(p);
    			}else {
    				if(j==0&&n==12){
    					shishiliu(p);
    				}else {
    					printf("ERROR");
    		            return 0;
    				}
    			}	
    		}
    	} 
    	return 0;
    }
    
    

    这是我的main函数里面的内容,讲4种进制两两转换写到一个函数里面,进行计算,通过使用者选择哪种转换,进入相应的函数做进制转换,并且在进入前先进行判断,你输入的进制格式是否符合相应的进制要求,不符合退出,并给你提示。

    二进制转换八进制函数

    void erba(char m[10000])
    {
    	
    	int i,j,l=0,a=0,k=0;
    	int sum=0;
    	
    	printf("二进制转换为八进制
    ");
    	printf("答案是:");
    	
    	for(j=0;m[j]!='';j++){
    		a++;
    	} 
    	if(a<=6){
    		l=6%a;
    	}else {
    		l=3-a%6; 
    	}
    	m[a+l]='';
    	for(i=a-1;i>=0;i--){
    		m[i+l]=m[i];
    	}
    	for(i=0;i<l;i++){
    		m[i]='0';
    	}
    //到这进行二进制数三位三位对应八进制数。
    	for(i=0;m[i]!='';i++){
    		sum+=(m[i]-'0')*pow(2,(2-k));
    		k++;
    		if(k%3==0){
    			printf("%d",sum);
    			k=0;
    			sum=0;
    		}
    	}
    }
    

    这个如函数定义一样,是二进制转换成八进制。应为二进制转换成八进制是,二进制三位为八进制以为,我想进行判断,输入的二进制是否是3的倍数,不是,高位填0;然后再三位三位进行转换。

    二进制转换十六进制函数

    void ershiliu (char m[10000])
    {
    	
    	int i,j,l=0,a=0,k=0;
    	int sum=0;
    
    	printf("二进制转换为十六进制
    ");
    	printf("答案是:");
    	
    	for(j=0;m[j]!='';j++){
    		a++;
    	} 
    	if(a<=8){
    		l=8%a;
    	}else {
    		l=4-a%8; 
    	}
    	m[a+l]='';
    	for(i=a-1;i>=0;i--){
    		m[i+l]=m[i];
    	}
    	for(i=0;i<l;i++){
    		m[i]='0';
    	}
    	//到这将二进制数转换成四位四位二进制数,对应十六进制转换。
    	for(i=0;m[i]!='';i++){
    		sum+=(m[i]-'0')*pow(2,(3-k));
    		k++;
    		if(k%4==0){
    			if(sum>9){
    				printf("%c",'A'+sum-10);
    			}else {
    				printf("%d",sum);
    			}	
    			k=0;
    			sum=0;
    		}
    	}
    }
    

    二进制转换位八进制,与上一个函数有着相似的内容,一个意思。

    二进制转换十进制函数

    void ershi (char m[10000])
    {
    	
    	int i,j,k=0;
    	int sum=0;
    
    	printf("二进制转换为十进制
    ");
    	printf("答案是:");
    	
    	for(k=0;m[k]!='';k++){
    	} 
    	k-=1;
    	for(i=0;m[i]!='';i++){
    		j=abc(k);
    		sum+=(m[i]-'0')*j;
    		k--;	
    	}
    	printf("%d
    ",sum);	
    }
    

    二进制转换为十进制,从高位算起,对应二进制数乘以相应的乘数,相加得出。在这里运用到另一个函数,一个算2的几次方的函数。

    2的次方函数

    int abc (int n)
    {
    	int sum=1;
    	for(int i=1;i<=n;i++){
    		sum*=2;
    	}
    	return sum;
    }
    

    这是个算2的几次方的函数,头文件自带函数运行太慢,自己写一个,便于二进制转换为十进制。

    八进制转换二进制函数

    void baer (char m[10000])
    {
    	
    	int i,j,k,l;
    	
    	printf("八进制转换为二进制
    ");
    	printf("答案是:");
    	
    	for(i=0;m[i]!='';i++){
    		k=m[i]-'0';
    		if(k==1){
    			printf("00");
    		} else {           //中间这个if语句是使输出二进制数为三的倍数,更加好看。
    			if(k>1&&k<4){
    				printf("0");
    			}
    		}
    		l=a(k);
    	}
    }
    

    这个是八进制转换为二进制,同样也用到另一个函数,a(k)是将每一位八进制数,转换为相应的三位二进制数。

    八进制转换十六进制函数

    void bashiliu (char m[10000])
    {
    	
    	int i,j,l=0,a=0,k=0;
    	int p=1,q;
    	int n[10000];
    	
    	printf("八进制转换为十六进制
    ");
    	printf("答案是:");
    	
    	for(i=0;m[i]!='';i++){
    		k=m[i]-'0';
    		q=p*3-1;
    		for(j=i*3;j<i*3+3;j++){
    			n[q]=k%2;
    			k/=2;
    			q--;
    		}
    		p++;
    	}
       //到这八进制转换为二进制数。
    	if(j<=8){
    		l=8%j;
    	}else {
    		l=4-j%6; 
    	}
    	
    	for(i=j-1;i>=0;i--){
    		n[i+l]=n[i];
    	}
    	for(i=0;i<l;i++){
    		n[i]=0;
    	}
    //到这进行二进制数转换成四的倍数,四位二进制对应一个十六进制。
    	int sum=0;
    	
    	for(i=0;i<j+l;i++){
    		sum+=n[i]*pow(2,(3-k));
    		k++;
    		if(k%4==0){
    			if(sum>9){
    				printf("%c",'A'+sum-10);
    			}else {
    				printf("%d",sum);
    			}
    			k=0;
    			sum=0;
    		}
    	}
    //得出十六进制数。
    }
    

    这是八进制转换为十六进制的函数,先将八进制转换为二进制,在将二进制转换为十六进制。

    八进制转换十进制函数

    void bashi (char m[10000])
    {
    	
    	int i,j,l,k,p=1,a;
    	int n[10000];
    	
    	printf("八进制转换为十进制
    ");
    	printf("答案是:");
    	
    	for(i=0;m[i]!='';i++){
    		k=m[i]-'0';
    		l=p*3-1;
    		for(j=i*3;j<i*3+3;j++){
    			n[l]=k%2;
    			k/=2;
    			l--;
    		}
    		p++;
    	}
    
    	int sum=0;
    	int b=j-1;
    	for(i=0;i<j;i++){
    		a=abc(b);
    		sum+=n[i]*a;
    		b--;	
    	}
    	printf("%d",sum);
    	
    }
    

    八进制转换为十进制,先转二进制再转十进制。

    递归算二进制函数

    int a(int n)
    {
    	if(n==1||n==0){
    		printf("%d",n);
    	}else {
    		a(n/2);
    		printf("%d",n%2);
    	}
    	return 0;
    }
    

    这个就是讲以为一位八进制数转换成三位二进制数的函数,输出二进制。

    十六进制转换二进制函数

    void shiliuer (char m[10000])
    {
    	
    	int i,j,l,k;
    	
    	printf("十六进制转换为二进制
    ");
    	printf("答案是:");
    	
    	for(i=0;m[i]!='';i++){
    		
    		if(m[i]>='0'&&m[i]<='9'){
    			k=m[i]-'0';
    		}
    		if(m[i]>='A'&&m[i]<='F'){
    			k=m[i]-'7';
    		}
    		if(k==1){
    			printf("000");
    		}else {
    			if(k<4){
    				printf("00");
    			}else {
    				if(k<8){
    					printf("0");
    				}
    			}
    		}
    		l=a(k);
    	}
    	
    }
    

    十六进制转换为二进制,一位十六进制对应四位二进制,我先判断一位十六进制的大小,先输出高位的0,再去填入二进制数,构成四位二进制数,这里调用了一个a(k)的函数,来算二进制数。

    十六进制转换八进制函数

    void shiliuba (char m[10000])
    {
    	
    	int i,j,l=0,k=0;
    	int n[10000];
    	int a,b=1,c;
    	printf("十六进制转换为八进制
    ");
    	printf("答案是:");
    	
    	for(i=0;m[i]!='';i++){
    		
    		if(m[i]>='0'&&m[i]<='9'){
    			k=m[i]-'0';
    		}
    		if(m[i]>='A'&&m[i]<='F'){
    			k=m[i]-'7';
    		}
            a=b*4-1;
    		for(j=i*4;j<i*4+4;j++){
    			n[a]=k%2;
    			k/=2;
    			a--;
    		}
    		b++;
    	}
    	
    	if(j<=6){
    		l=6%j;
    	}else {
    		l=3-j%6; 
    	}
    	for(i=j-1;i>=0;i--){
    		n[i+l]=n[i];
    	}
    	for(i=0;i<l;i++){
    		n[i]=0;
    	}
    	
        int sum=0;
    	
    	for(i=0;i<j+l;i++){
    		sum+=n[i]*pow(2,(2-k));
    		k++;
    		if(k%3==0){
    			printf("%d",sum);
    			k=0;
    			sum=0;
    		}
    	}
    }
    

    十六进制转换为八进制,函数内容意思与前面相似。

    十六进制转换十进制函数

    void shiliushi (char m[10000])
    {
    		
    	int i,j,k;
    	int n[10000];
    	int a,b=1;
    	
    	printf("十六进制转换为十进制
    ");
    	printf("答案是:");
    	
    	for(i=0;m[i]!='';i++){
    		
    		if(m[i]>='0'&&m[i]<='9'){
    			k=m[i]-'0';
    		}
    		if(m[i]>='A'&&m[i]<='F'){
    			k=m[i]-'7';
    		}
            a=b*4-1;
    		for(j=i*4;j<i*4+4;j++){
    			n[a]=k%2;
    			k/=2;
    			a--;
    		}
    		b++;
    	}
    	
    	int sum=0;
    	int c=j-1,l;
    	for(i=0;i<j;i++){
    		l=abc(c);
    		sum+=n[i]*l;
    		c--;	
    	}
    	printf("%d",sum);
    	
    }
    

    十六进制转换为十进制函数。

    十进制转换二进制函数

    void shier (int n)
    {
    	printf("十进制转换为二进制
    ");
    	printf("答案是:");
    	a(n);
    }
    int a(int n)
    {
    	if(n==1||n==0){
    		printf("%d",n);
    	}else {
    		a(n/2);
    		printf("%d",n%2);
    	}
    	return 0;
    }
    

    在十进制转换二进制的函数中,用到另一个函数来计算答案,运用递归函数写法,得出二进制数。

    十进制转换八进制函数

    void shiba (int n)
    {
    	printf("十进制转换为八进制
    ");
    	printf("答案是:");
    	b(n); 
    }
    int b(int n)
    {
    	if(n<8){
    		printf("%d",n);
    	}else {
    		b(n/8);
    		printf("%d",n%8);
    	}
    	return 0;
    }
    

    十进制转换为八进制的函数,相似的算法规律,也是运用一个递归函数来得出答案。

    十进制转换十六进制函数

    void shishiliu (int n)
    {
    	printf("十进制转换为十六进制
    ");
    	printf("答案是:");
    	c(n); 
    }
    int c(int n)
    {
    	int k;
    	if(n<16){
    		if(n<10){
    			printf("%d",n);
    		}else {
    			printf("%c",'A'+n-10);
    		}
    	}else {
    		c(n/16);
    		k=n%16;
    		if(k<10){
    			printf("%d",k);
    		}else {
    			printf("%c",'A'+k-10);
    		}
    	}
    	return 0;
    }
    

    十进制转换为十六进制函数,较为麻烦,应为十六进制有用到字母,需要进行相应的转换,需要改动一些。

    5.回想代码

    在写这个进制转换时,我遇到一下几个问题:

    1. 如何判断输入数是否符合,四种进制的要求。我通过查询书本了解四种进制的规则。

    2. 如何把读到的数组传到我想去的函数当中。我百度学习知识,了解如何传入。

    3. 如何写递归函数。结合学到的知识和不断常试,明白如何写。

    4. 进制之间的转换如何用代码写出来。运用函数的知识,在结合进制之间的转换规则,去写代码。

    5. 如何使使用者使用起来会舒服点。查询显示代码,美化代码。

    6.代码互评(评价他人代码,学习好的地方)网络1913李永福

    在与我的八进制转换成十进制的函数中,他比我好的地方是,他有运用到string头文件内的计算字符串长度的函数,使得可以更加简便,但和我的思路不一样,但是这样确实好。在八进制转换成十六进制,与我的想法不同,我是转换成二进制然后再转换成十六进制,而他是转换成十进制,再转换成十六进制,我感觉到好像是他的方法比较好,确实转换成十进制会比转换成十六进制来的简单,这是我要学习的地方。还有运用到初始化数组,这也是我没想到的地方,我还是要多向同学学习学习。

    7.总结

    从这次博客作业,我从中学习到:

    1. 加深了我对进制之间的转换规则,也明白如何用代码表示进制转换。

    2. 加深我对其他辅助函数的书写和理解。

    3. 让我可以充分使用我学习的知识去有目的的写出一个程序,收获很多。

    8.对于函数的理解:

    1. 运用函数可以是代码看起来更加的简洁明了,是的代码条理清晰。

    2. 函数可以更好的有目的的完成你目的的一部分,几个函数就可以很好的组成你最终的目的。

    3. 运用函数的代码,可以让别人看你的代码时,更好的明白,什么是干什么的,让别人更好的看懂你的代码。

  • 相关阅读:
    Go 数组与切片
    Go 常用函数
    Go 函数,包(二)
    函数,包及错误处理
    Go 循环控制
    Go 流程控制
    Go 获取键盘输入,进制转换
    Go 指针,标识符命名规范及关键字
    Go 变量及基本数据类型3
    一文详解微服务架构
  • 原文地址:https://www.cnblogs.com/jiuweihong/p/11785223.html
Copyright © 2011-2022 走看看