函数+进制转换器

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\n二进制转换为十六进制,请输入2\n二进制转换为十进制,请输入3\n"); 
    printf("八进制转换为二进制,请输入4\n八进制转换为十六进制,请输入5\n八进制转换为十进制,请输入6\n"); 
    printf("十六进制转换为二进制,请输入7\n十六进制转换为八进制,请输入8\n十六进制转换为十进制,请输入9\n");
    printf("十进制转换为二进制,请输入10\n十进制转换为八进制,请输入11\n十进制转换为十六进制,请输入12\n");
    
	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]!='\0';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]!='\0';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]!='\0';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("二进制转换为八进制\n");
	printf("答案是:");
	
	for(j=0;m[j]!='\0';j++){
		a++;
	} 
	if(a<=6){
		l=6%a;
	}else {
		l=3-a%6; 
	}
	m[a+l]='\0';
	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]!='\0';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("二进制转换为十六进制\n");
	printf("答案是:");
	
	for(j=0;m[j]!='\0';j++){
		a++;
	} 
	if(a<=8){
		l=8%a;
	}else {
		l=4-a%8; 
	}
	m[a+l]='\0';
	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]!='\0';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("二进制转换为十进制\n");
	printf("答案是:");
	
	for(k=0;m[k]!='\0';k++){
	} 
	k-=1;
	for(i=0;m[i]!='\0';i++){
		j=abc(k);
		sum+=(m[i]-'0')*j;
		k--;	
	}
	printf("%d\n",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("八进制转换为二进制\n");
	printf("答案是:");
	
	for(i=0;m[i]!='\0';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("八进制转换为十六进制\n");
	printf("答案是:");
	
	for(i=0;m[i]!='\0';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("八进制转换为十进制\n");
	printf("答案是:");
	
	for(i=0;m[i]!='\0';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("十六进制转换为二进制\n");
	printf("答案是:");
	
	for(i=0;m[i]!='\0';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("十六进制转换为八进制\n");
	printf("答案是:");
	
	for(i=0;m[i]!='\0';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("十六进制转换为十进制\n");
	printf("答案是:");
	
	for(i=0;m[i]!='\0';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("十进制转换为二进制\n");
	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("十进制转换为八进制\n");
	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("十进制转换为十六进制\n");
	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. 运用函数的代码,可以让别人看你的代码时,更好的明白,什么是干什么的,让别人更好的看懂你的代码。

posted @ 2019-11-08 21:46  违久(丁鸿沛)  阅读(301)  评论(0编辑  收藏  举报