/*Binary Digit Translation*/
/*这个程序用于十进制数字到二进制数字的转换,使用的是字符串和数字的互相转化,
具体使用规格说明如下:
Type of Number: unsigned long 32bits
Type of Strings: char *s[13]
Cycle variable:unsigned int i,t*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
char bin[33]="00000000000000000000000000000000";
int isnumerical(char *s)/*用于判断是否为数字的函数,0-非数字,1-数字*/
{
unsigned int i,flag=1;/*flag为数字类型标识*/
if ((s[0]!='-')&&(s[0]<'0'||s[0]>'9')) flag=0;/*非数字*/
else
{
if (s[0]=='-') flag=1;/*负数*/
for (i=1;i<strlen(s);i++)/*从第二个字符开始验证是否为数字*/
if (s[i]<'0'||s[i]>'9')
{
flag=0;
break;
}
}
return flag;
}
void lowcase(char *s)/*将非数字的字符串统一转换成小写*/
{
unsigned int i;
for (i=0;i<strlen(s);i++)
if (s[i]>='A'&&s[i]<='Z') s[i]+=32;
}
unsigned long e(unsigned int times)/*这个函数用来返回10^times*/
{
unsigned int i;
unsigned long num=1;
if (times==0) return 1;
else
for (i=0;i<times;i++)
num*=10;
return num;
}
long val(char *s)/*这个函数实现字符串到数字的转换,返回数字部分,负数返回数字部分*/
{
unsigned int i,len=strlen(s);
long num=0;
if (s[0]!='-')/*正数*/
for (i=0;i<len;i++) num+=(s[i]-'0')*e(len-i-1);
else /*负数*/
{
for(i=1;i<len;i++) num+=(s[i]-'0')*e(len-i-1);
num=-num;
}
return num;
}
char *D_B(long val) /*十进制转换成二进制,val-value*/
{
char c;/*bin[]前32位为二进制,最后一位为'/0'*/
unsigned int i=0,t=0,len,ad=1;/*ad-进位*/
if (val==0) return bin;
if (val>0)/*正数*/
{
while (val!=0)
{
bin[i++]=val%2+'0';
val/=2;
}
//bin[i]='/0';
len=i-1;/*len下脚标恢复到'/0'之前的位置*/
for (i=0,t=len;i<t;i++,t--)
{
c=bin[i];
bin[i]=bin[t];
bin[t]=c;
}/*交换二进制字符串使得从0-len为正确的顺序*/
/*把数字部分移动到数组尾部*/
for (i=0;i<len+1;i++)
{
c=bin[31-i];
bin[31-i]=bin[len-i];
bin[len-i]=c;
}
}
else /*负数*/
{
/*负数部分还存在问题*/
bin[0]='1';/*负数为最高位为1,其他位为正数二进制取反加1*/
i=1;/*转换的数字要从第二个字符串开始*/
val=abs(val);
while (val!=0)
{
bin[i++]=val%2+'0';
val/=2;
}
len=i-1;/*len下脚标恢复到'/0'之前的位置*/
for (i=1,t=len;i<t;i++,t--)
{
c=bin[i];
bin[i]=bin[t];
bin[t]=c;
}/*交换二进制字符串使得从0-len为正确的顺序*/
/*把数字部分移动到数组尾部*/
for (i=0;i<len;i++)
{
c=bin[31-i];
bin[31-i]=bin[len-i];
bin[len-i]=c;
}
/*按位取反*/
for (i=1;i<32;i++)
{
if (bin[i]=='0') bin[i]='1';
else bin[i]='0';
}
/*再加一*/
for (i=31;ad!=0;i--)
{
if (bin[i]+ad>'1') bin[i]='0';/*需要进位*/
else
{
bin[i]='1';/*前面有进位,此时可以推出s[i]=='0'*/
ad=0;
}
}
}/*else 结束*/
return bin;
}
main()
{
char s[14];
puts("This program is made for translate Decimal Digit to Binary Digit.");
puts("/"Exit/" for exit.");
putchar('/n');
puts("ATTENTION:");
puts("The number rangement:-2147483647~2147483647/n");
while (1)
{
printf(">>");
gets(s);
if (isnumerical(s))/*s是数字*/
{
putchar('/n');
printf("Binary Digit:");
puts(D_B(val(s)));
putchar('/n');
}
else
{
lowcase(s);
if (strcmp(s,"exit")!=0)
{
puts("/nInvalid input.");
puts("Only /"exit/" can exit this program./n");
}
else break;
}
strcpy(bin,"00000000000000000000000000000000");
}
}