作者在 2010-10-23 18:34:35 发布以下内容
因为要学习汇编,里面要频繁的用到进制的转换,所以,用了一个下午,编写了个进制转换的小程序。虽然不是很难,但是很麻烦,很费力。还算是比较满意,所以把源码贴出来了。
#include "stdio.h"
#include <math.h>
#include <stdlib.h>
#include <string.h>
void d_b(int num);
void b_d(char *b);
void b_o(char *b);
void b_h(char *b);
void b_t(char *b);
void o_b(int num);
void h_b(int num);
void help();
void main()
{
char b[256];
int num;
char c;
help();
for(;;)
{
fflush(stdin);
scanf("%c",&c);
switch(c)
{
case 'a': scanf("%d",&num); d_b(num);break;
case 'b': scanf("%s",b); b_d(b); break;
case 'c': scanf("%s",b); b_t(b); break;
case 'd': scanf("%d",&num); printf("十六进制:%x\n",num); break;
case 'e': scanf("%d",&num); printf("八进制:%o\n",num); break;
case 'f': scanf("%o",&num); printf("十进制:%d\n",num); break;
case 'g': scanf("%x",&num); printf("十进制:%d\n",num); break;
case 'h': scanf("%x",&num); h_b(num); break;
case 'i': scanf("%o",&num); o_b(num); break;
case 'j': scanf("%s",b); b_o(b); break;
case 'k': scanf("%s",b); b_h(b); break;
case 'l': scanf("%o",&num); printf("十六进制:%x\n",num); break;
case 'm': scanf("%x",&num); printf("八进制:%o\n",num); break;
case 'r': system("CLS"); help(); break;
case 'q': return 0;
default:printf("格式输入错误!\n");break;
}
}
}
void d_b(int num) /*十进制转二进制*/
{
int t,i=0,c=1;
int s[256];
while(num)
{
s[i]=num%2;
num/=2;
i++;
}
t=i;
printf("二进制:");
while(i%8!=0) /*前补0*/
{
printf("%d",0);
i++;
c++;
}
for(t--;t>=0;t--,c++)
{
printf("%d",s[t]);
if(c%8==0&&t!=0) printf(","); /*每八位用,隔开*/
}
printf("\n");
}
void b_d(char *b)
{ /*二进制转十进制*/
int len=strlen(b);
int i,j,sum=0;
for(i=0,j=len-1;i<len;i++,j--)
{
sum=pow(2,i)*(b[j]-'0')+sum;
}
printf("十进制:%d\n",sum);
}
void o_b(int num)
{ /*八进制转二进制*/
d_b(num);
}
void h_b(int num)
{ /*十六进制转换二进制*/;
d_b(num);
}
void b_o(char *b)
{ /*二进制转八进制*/
int len=strlen(b);
int i,j,sum=0;
for(i=0,j=len-1;i<len;i++,j--)
{
sum=pow(2,i)*(b[j]-'0')+sum;
}
printf("八进制:%o\n",sum);
}
void b_h(char *b)
{ /*二进制转十六进制*/
int len=strlen(b);
int i,j,sum=0;
for(i=0,j=len-1;i<len;i++,j--)
{
sum=pow(2,i)*(b[j]-'0')+sum;
}
printf("十六进制:%x\n",sum);
}
void b_t(char *b)
{ /*二进制负数求补码*/
int len=strlen(b);
int i,c=0,carry=1; /*c用于格式控制,每八位输出一个','*/
for(i=len-1;i>=0;i--)
{
b[i]=!((b[i]-'0')&&1)+carry;
if(b[i]==2) {b[i]=0; carry=1;}
else carry=0;
}
if(carry==1) c++; /*如果最高位还有进位*/
i=len+c;
printf("二进制补码:");
while(i%8!=0) /*不足八位,前补0*/
{
printf("%d",0);
i++;
c++;
}
if(carry==1) printf("1");
if(c%8==0&&c!=0) printf(",");
for(i=0;i<len;i++)
{
printf("%d",b[i]);
c++;
if(c%8==0&&i!=len-1) printf(","); /*每八位用,隔开*/
}
printf("\n");
}
void help()
{
printf("欢迎使用进制转换程序\n");
printf("j:二进制转换八进制\ti:八进制转二进制\ta:十进制转换二进制\n");
printf("b:二进制转十进制\tf:八进制转十进制\te:十进制转八进制\n");
printf("k:二进制转十六进制\tl:八进制转十六进制\td:十进制转十六进制\n");
printf("h:十六进制转二进制\tm:十六进制转八进制\tg:十六进制转十进制\n");
printf("c:二进制负数补码\tr:清理屏幕\tq:退出\n");
printf("命令格式为:“命令+待转换数字”,例如将十进制数9转换为二进制数,输入“a9”,得到00001001。\n");
printf("---------------------------------------------------------------------\n");
printf("作者:Outsider\t 2010年10月23日\n");
}
#include <math.h>
#include <stdlib.h>
#include <string.h>
void d_b(int num);
void b_d(char *b);
void b_o(char *b);
void b_h(char *b);
void b_t(char *b);
void o_b(int num);
void h_b(int num);
void help();
void main()
{
char b[256];
int num;
char c;
help();
for(;;)
{
fflush(stdin);
scanf("%c",&c);
switch(c)
{
case 'a': scanf("%d",&num); d_b(num);break;
case 'b': scanf("%s",b); b_d(b); break;
case 'c': scanf("%s",b); b_t(b); break;
case 'd': scanf("%d",&num); printf("十六进制:%x\n",num); break;
case 'e': scanf("%d",&num); printf("八进制:%o\n",num); break;
case 'f': scanf("%o",&num); printf("十进制:%d\n",num); break;
case 'g': scanf("%x",&num); printf("十进制:%d\n",num); break;
case 'h': scanf("%x",&num); h_b(num); break;
case 'i': scanf("%o",&num); o_b(num); break;
case 'j': scanf("%s",b); b_o(b); break;
case 'k': scanf("%s",b); b_h(b); break;
case 'l': scanf("%o",&num); printf("十六进制:%x\n",num); break;
case 'm': scanf("%x",&num); printf("八进制:%o\n",num); break;
case 'r': system("CLS"); help(); break;
case 'q': return 0;
default:printf("格式输入错误!\n");break;
}
}
}
void d_b(int num) /*十进制转二进制*/
{
int t,i=0,c=1;
int s[256];
while(num)
{
s[i]=num%2;
num/=2;
i++;
}
t=i;
printf("二进制:");
while(i%8!=0) /*前补0*/
{
printf("%d",0);
i++;
c++;
}
for(t--;t>=0;t--,c++)
{
printf("%d",s[t]);
if(c%8==0&&t!=0) printf(","); /*每八位用,隔开*/
}
printf("\n");
}
void b_d(char *b)
{ /*二进制转十进制*/
int len=strlen(b);
int i,j,sum=0;
for(i=0,j=len-1;i<len;i++,j--)
{
sum=pow(2,i)*(b[j]-'0')+sum;
}
printf("十进制:%d\n",sum);
}
void o_b(int num)
{ /*八进制转二进制*/
d_b(num);
}
void h_b(int num)
{ /*十六进制转换二进制*/;
d_b(num);
}
void b_o(char *b)
{ /*二进制转八进制*/
int len=strlen(b);
int i,j,sum=0;
for(i=0,j=len-1;i<len;i++,j--)
{
sum=pow(2,i)*(b[j]-'0')+sum;
}
printf("八进制:%o\n",sum);
}
void b_h(char *b)
{ /*二进制转十六进制*/
int len=strlen(b);
int i,j,sum=0;
for(i=0,j=len-1;i<len;i++,j--)
{
sum=pow(2,i)*(b[j]-'0')+sum;
}
printf("十六进制:%x\n",sum);
}
void b_t(char *b)
{ /*二进制负数求补码*/
int len=strlen(b);
int i,c=0,carry=1; /*c用于格式控制,每八位输出一个','*/
for(i=len-1;i>=0;i--)
{
b[i]=!((b[i]-'0')&&1)+carry;
if(b[i]==2) {b[i]=0; carry=1;}
else carry=0;
}
if(carry==1) c++; /*如果最高位还有进位*/
i=len+c;
printf("二进制补码:");
while(i%8!=0) /*不足八位,前补0*/
{
printf("%d",0);
i++;
c++;
}
if(carry==1) printf("1");
if(c%8==0&&c!=0) printf(",");
for(i=0;i<len;i++)
{
printf("%d",b[i]);
c++;
if(c%8==0&&i!=len-1) printf(","); /*每八位用,隔开*/
}
printf("\n");
}
void help()
{
printf("欢迎使用进制转换程序\n");
printf("j:二进制转换八进制\ti:八进制转二进制\ta:十进制转换二进制\n");
printf("b:二进制转十进制\tf:八进制转十进制\te:十进制转八进制\n");
printf("k:二进制转十六进制\tl:八进制转十六进制\td:十进制转十六进制\n");
printf("h:十六进制转二进制\tm:十六进制转八进制\tg:十六进制转十进制\n");
printf("c:二进制负数补码\tr:清理屏幕\tq:退出\n");
printf("命令格式为:“命令+待转换数字”,例如将十进制数9转换为二进制数,输入“a9”,得到00001001。\n");
printf("---------------------------------------------------------------------\n");
printf("作者:Outsider\t 2010年10月23日\n");
}