7-4 NumberTrans.c
1 #include2 #include 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 =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~F115 in_bit[j]=in_str[i]-'A'+10;116 else if(in_str[i]>='a' && in_str[i]<='f') //小写字母 a~f117 in_bit[j]=in_str[i]-'a'+10;118 else119 exit(0);120 j++;121 }122 length-=start; 123 for(i=0;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 else156 {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 }