7-4 NumberTrans.c
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define STACK_INIT_SIZE 100 4 #define SIZE_INCREMENT 5 5 typedef struct //栈结构 6 { 7 int *base; //栈底 8 int *top; //栈顶 9 int stacksize; //栈大小 10 }SqStack,*SQSTACK; 11 int StackInit(SQSTACK s) //初始化栈 12 { 13 s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); 14 if(!(s->base)) 15 exit(0); 16 s->top=s->base; 17 s->stacksize=STACK_INIT_SIZE; 18 return 1; 19 } 20 int PUSH(SQSTACK s,int e) //入栈 21 { 22 if(s->base+s->stacksize==s->top) 23 { 24 s->base=(int *)realloc(s->base,(SIZE_INCREMENT+s->stacksize)*sizeof(int)); 25 s->top=s->base+s->stacksize; 26 s->stacksize+=SIZE_INCREMENT; 27 } 28 *(s->top)=e; 29 s->top+=1; 30 return 1; 31 } 32 int POP(SQSTACK s,int *p) //出栈 33 { 34 if(s->base==s->top) //空栈 35 return 0; 36 *p=*(s->top-1); 37 s->top--; 38 return 1; 39 } 40 int StackLength(SQSTACK s) //栈的长度(元素数量) 41 { 42 return (s->top-s->base); 43 } 44 int StackFree(SQSTACK s) //释放栈 45 { 46 free(s->base); 47 s->top=s->base=NULL; 48 return 1; 49 } 50 char *DecToOther(unsigned long num,int sys) //10进制转换为其他进制,返回一个字符串 51 {//num需转换的数据,sys为需转换的进制 52 SqStack s; 53 int rem,i,length,num1,inc=1; 54 char *out,*p; //控制输出字符串 55 if(!StackInit(&s)) //初始化栈失败 56 exit(0);//退出 57 do{ 58 if(num<sys) //被除数小于进制 59 { 60 rem=num; 61 PUSH(&s,rem); //进接将被除数入栈 62 break;//退出循环 63 } 64 else 65 { 66 rem=num % sys; //除进制数取余数 67 PUSH(&s,rem); //将余数入栈 68 num=(num-rem)/sys; //商 69 } 70 }while(num); //dividend不为0 71 if(sys==16) //16进制有两个字符的前缀 72 inc++; 73 length=StackLength(&s); //获取栈的长度(需输出元素的个数) 74 if(!(out=(char *)malloc(sizeof(char)*(length+inc))))//若分配内存失败 75 { 76 printf("内存分配失败!\n"); 77 exit(0); 78 } 79 p=out; //指针p指向分配内存首地址 80 *p++='0';//添加前缀 81 if(sys==16) //16进制的前缀 82 *p++='x'; 83 for(i=1;i<=length;i++) 84 { 85 POP(&s,&num1); //从栈中弹出一个数 86 if(num1<10) //若小于10 87 *p++=num1+'0'; //保存数字的ASCII字符 88 else //大于10,输出A~F 89 *p++=num1+'A'-10;//输出A~F之间的字母 90 } 91 StackFree(&s); //释放栈所占用空间 92 *p='\0'; 93 return (out);//返回字符串 94 } 95 int OtherToDec(int sys,char *in_str) //其他进制转换为10进制(输入数) 96 { //sys进制,arrat_char需处理的字符串 97 int i,j,length,start=0; 98 unsigned long sum=0,pow; 99 int *in_bit; 100 101 length=strlen(in_str); //字符串的长度 102 if(!(in_bit=(int *)malloc(sizeof(int)*length))) 103 { 104 printf("内存分配失败!\n"); 105 exit(0); 106 } 107 if(in_str[0]=='-') //为负数,跳过符号 108 start++; 109 j=0; 110 for(i=length-1;i>=start;i--) 111 { 112 if(in_str[i]>='0' && in_str[i]<='9') //为数字0~9 113 in_bit[j]=in_str[i]-'0'; //将字符转换为整数 114 else if(in_str[i]>='A' && in_str[i]<='F') //大写字母 A~F 115 in_bit[j]=in_str[i]-'A'+10; 116 else if(in_str[i]>='a' && in_str[i]<='f') //小写字母 a~f 117 in_bit[j]=in_str[i]-'a'+10; 118 else 119 exit(0); 120 j++; 121 } 122 length-=start; 123 for(i=0;i<length;i++) 124 { 125 if(in_bit[i]>=sys) //若某个数超过了进制 126 { 127 printf("输入的数据不符合%d进制数据的规则!",sys); //显示错误 128 exit(0); 129 } 130 for(j=1,pow=1;j<=i;j++) 131 pow*=sys; 132 sum+=in_bit[i]*pow; 133 } 134 return sum; 135 } 136 137 int main() 138 { 139 int old,new1; 140 char select='N',*other,str[80]; //符号 141 unsigned long num10; //保存10进制数 142 char array[32]; 143 do{ 144 printf("\n原数据进制:"); 145 scanf("%d",&old); 146 printf("输入%d进制数:",old); 147 scanf("%s",str); //保存字符串 148 num10=OtherToDec(old,str); //将其他进制转换为10进制 149 printf("需转换的进制:"); 150 scanf("%d",&new1); 151 if(10==new1) //若是转换为10进制 152 { 153 printf("\n将%d进制数%s\n转换为10进制数:%d\n",old,str,num10); 154 } 155 else 156 { 157 other=DecToOther(num10,new1); 158 printf("将%d进制数%s\n转换为%d进制数:%s\n",old,str,new1,other); 159 } 160 printf("\n继续(Y/N)?"); 161 select=getch(); 162 }while(select=='y' || select =='Y'); 163 getch(); 164 return 0; 165 }