数据结构:进制转换

思路:

        将输入的数据,先转换为10进制数,再转换成期望的数

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>

typedef struct Node {
	char *base;//指向栈底 
	char *top;//指向栈顶 
	int size; 
	//size = 99;
}*stack;

stack init(){//栈的初始化 
	//int n;
	stack s = (stack)malloc(sizeof(stack));
	s->base = (char*)malloc(sizeof(char)*64);
	if(!s->base)
	return NULL;
	//scanf("%d",&n);
	s->size = 64;
	printf("初始化成功\n"); 
	s->top = s->base;
	s->size = 64;
	return s;
}

int full_stack(stack s){//判断是否栈空 
	if(s->top - s->base == 64)
		return 1;
	else
	return 0;
}

int empty_stack(stack s){
	if(s->top == s->base)
	return 1;
	else
	return 0; 
}

void push_stack(stack s,char n){//压栈
	
	if(full_stack(s) == 1){
		printf("已经栈满,无法添加!\n");
		return;
	}
	else {
	*(s->top++) = n;
//	printf("入栈成功\n");
	}	
}

void pop_stack(stack s,char*e){
	if(empty_stack(s) == 1){
		printf("已经栈空!\n");
		return ;
	}
	else{
		*e = *(--s->top);
	}
}

char* BinChange(stack s,int n);
char* OctChange(stack s,int n);
char* HexChange(stack s,int n);
char* Change(stack s,int n,int q);
int DecChange(stack s,char*p,int q);





void judge(){
	stack s = init();
	printf("请输入待转换数据的类型:(2,8,16)\n");
	int q,n;
	scanf("%d",&q);
	printf("请输入您要转换的数据:\n");
	char arr[64];
	scanf("%s",arr);
	char*temp = arr;
	int i;
	if(q<16)
	for(i=0;i<strlen(arr);i++){
		if((int)arr[i]-48>= q || (int)arr[i]-48< 0)
		{
			printf("%d\n",(int)arr[i]-48);
			printf("%d\n",i);
			printf("数据类型不匹配!");
			return;
		 } 
	}else
	for(i=0;i<strlen(arr);i++)
	if(	(	(int)arr[i]-48>=9 && ((int)arr[i]-55<=0 ||(int)arr[i]-55>=q) ) || (int)arr[i]-48<=0)
	{
			printf("数据类型不匹配!");
			return;
		 } 
	char*p = (char*)malloc(sizeof(char)*64);
	char*p1 = (char*)malloc(sizeof(char)*64);
	strcpy(p,arr);
	printf("请输入期望的类型:\n");
	scanf("%d",&n);
	int tot;
	tot = DecChange(s,p,q);
	printf("十进制后为%d\n",tot);
	stack sp = init();
	switch(n){
		case 2: p1 = BinChange(sp,tot);break; 
		case 8: p1 = OctChange(sp,tot);break;
		case 16: p1 = HexChange(sp,tot);break;
		default : p1 = Change(sp,tot,n);break;   //printf("输入非法!\n")
	}
} 

int main(){
	judge();
} 


char* BinChange(stack s,int n)//转二进制 
{
	int temp;
	int i,cnt;
	char ch = '0';
	char *p = malloc(sizeof(char)*64);
	while(n!=0){
		temp = n/2;
		i = n-temp*2;
		printf("%c",(char)ch+i);
		push_stack(s,ch+i);
		cnt++;
		n/=2;
	}
	while(empty_stack(s)!=1){
		//printf("!!!\n");
		pop_stack(s,&ch);
		*p++ = ch;
		printf("%c",*(p-1));
	}
	return p;
}
char* OctChange(stack s,int n){
	int temp;
	int i,cnt;
	char ch = '0';
	char *p = malloc(sizeof(char)*64);
	while(n!=0){
		temp = n/8;
		i = n-temp*8;
		push_stack(s,ch+i);
		cnt++;
		n/=8;
	}
	while(empty_stack(s)!=1){
		pop_stack(s,&ch);
		*p++ = ch;
		printf("%c",*(p-1));
	}
	return p;
}
char* HexChange(stack s,int n){
	int temp;
	int i,cnt;
	char ch = '0';
	char *p = malloc(sizeof(char)*64);
	while(n!=0){
		temp = n/16;
		i = n-temp*16;
		if(i<10 && i>0)
		push_stack(s,ch+i);
		if(i>=10 && i<15 )
		{
			i-=10;
			push_stack(s,'A'+i);
		}
		cnt++;
		n/=16;
	}
	while(empty_stack(s)!=1){
		pop_stack(s,&ch);
		*p++ = ch;
		printf("%c",*(p-1));
	}
	return p;
}


char* Change(stack s,int n,int q){
	int temp;
	int i,cnt;
	char ch = '0';
	char *p = malloc(sizeof(char)*64);
	while(n!=0){
		temp = n/q;
		i = n-temp*q;//判断除以q后的余数 
		if(i<10 && i>0)
		push_stack(s,ch+i);
		if(i>=10 && i<q-1 )
		{
			i-=10;
			push_stack(s,'A'+i);
		}
		cnt++;
		n/=q;
	}
	while(empty_stack(s)!=1){
		pop_stack(s,&ch);
		*p++ = ch;
		printf("%c",*(p-1));
	}
	return p;
}




int DecChange(stack s,char*p,int q){
	int len = strlen(p);
	int i;
	char temp='0';
	int cap=0;
	for(i=0;i<len;i++){
		
		//printf("\np ASCII:%d\n",(int)*p-48);
		push_stack(s,*p++);
		//printf("%c\n",*(s->top-1));
	}
	for(i=0;i<len;i++){
		if(q!=16){
			pop_stack(s,&temp);
			//printf("temp:%c\n",temp);
			cap+=((int)pow(q,i)*((int)temp-48));
			//printf("cap:%d\n",cap);
		  
		}	
		if(q==16){
		pop_stack(s,&temp);
		if((int)temp-48<=9 && (int)temp-48>=0)
		{
			
			//printf("temp<10:%c\n",temp);
			cap+=((int)pow(q,i)*((int)temp-48));
			//printf("cap:%d\n",cap);
			
		 } 
		 else if((int)temp-55>=0 && (int)temp-55<=q) 
			{
			
			//printf("temp>10:%c\n",temp);
			cap+=((int)pow(q,i)*((int)temp-55));
			//printf("cap:%d\n",cap);
		} 
	}
	
	}
	return cap;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值