C语言中的二进制、八进制、十进制之间的转换

用c语言编程一个二进制,八进制,十进制之间转换的程序,求源代码和思路,不要太复杂,谢谢

//c语言任意进制转换
// scale.cpp : 定义控制台应用程序的入口点。 
// 
#include "stdafx.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 
#define WIDTH 10 
#define DATAWIDTH 50 
#define MAX 4294967295 
#define CONST_2 2 
#define CONST_3 3 
#define CONST_8 8 
#define CONST_9 9 
#define CONST_10 10 
#define CONST_16 16 
#define CHAR_0 '0' 
#define CHAR_9 '9' 
#define CHAR_A 'A' 
#define CHAR_a 'a' 
#define CHAR_Z 'Z' 
#define CHAR_SPACE ' ' 
#define STRING_0 "0" 
#define STRING_Z "Z" 
bool Scale(); 
bool GetSourceScale(int * scale_in); 
bool GetObjectScale(int * scale_out); 
double OtherToDeci(int scale_in,char inputdata[]); 
void DeciToOther(unsigned long deci,int scale_out,char outputdata[]); 
bool GetData(char data[],int CONCOUNT,int flg); 
bool GetScale(char temp[]); 
bool GetSource(int in_scale,char inputdata[]); 
void ScaleChange(int scale_in,char inputdata[],int scale_out,char outputdata[]); 
void CleanScreen(); 
int _tmain(int argc, _TCHAR* argv[]) 

int flg = 0; 
char cs[WIDTH]; 
memset(cs,0x00,sizeof(cs)); 
while(1) 

printf("-----------------------------------------------------------------\n"); 
printf(" Data Transform Between Two Scales \n"); 
printf(" ----------------------------------------\n"); 
/*进制转换主函数*/ 
if(!Scale()) 

break; 

printf("-----------------------------------------------------------------\n"); 
printf("input any key and press 'Enter' key to continue, 'Z' for exit:"); 
if(!GetData(cs,WIDTH,flg)) /*判断是否继续执行下一次转换*/ 

break; 

system("cls"); /*清屏*/ 

return 0; 

bool Scale() 

int scale_in,scale_out; 
char inputdata[DATAWIDTH]; 
char outputdata[DATAWIDTH]; 
/*输入源数据进制*/ 
if(!GetSourceScale(&scale_in)) 

return false; 

/*输入源数据*/ 
if(!GetSource(scale_in,inputdata)) 

return false; 

/*输入目标数据进制*/ 
if(!GetObjectScale(&scale_out)) 

return false; 

/*进行进制转换*/ 
ScaleChange(scale_in,inputdata,scale_out,outputdata); 
return true; 

bool GetSourceScale(int * scale_in) /*输入源数据进制*/ 

char temparray[WIDTH]; 
memset(temparray,0x00,sizeof(temparray)); 
printf("Input source data scale and press 'Enter' key(one of 2,8,10,16. 'Z' for exit): \n"); 
if(!GetScale(temparray)) 

return false; 

*scale_in = atoi(temparray); 
return true; 

bool GetObjectScale(int * scale_out) /*输入目标数据进制*/ 

char temparray[WIDTH]; 
memset(temparray,0x00,sizeof(temparray)); 
printf("Input object data scale and press 'Enter' key(one of 2,8,10,16. 'Z' for exit): \n"); 
if(!GetScale(temparray)) 

return false; 

*scale_out = atoi(temparray); 
return true; 

bool GetData(char data[],int CONCOUNT,int flg) /*输入数据*/ 

int i,icount; 
char c; 
char *p; 
bool spaceFlag; 
i = 0; 
icount = 0; 
spaceFlag = true; 
while ((c = getchar()) != 0x0a) 

if (spaceFlag && c == CHAR_SPACE) /*去掉前空格*/ 

continue; 

if (!spaceFlag && c == CHAR_SPACE) /*去掉后空格*/ 

icount++; 
continue; 

else if (icount > 0) 

if (flg) 

CleanScreen(); 
printf("ERROR! Please input again('Z' for exit): \n"); /*输入进制或者源数据时,中间有空格,则重新输入*/ 
i = 0; 
icount = 0; 
spaceFlag = true; 
fflush(stdin); 
continue; 

else 

break; 


if (i == CONCOUNT - 1) /*判断是否输入数据过长*/ 

if (flg) 

CleanScreen(); 
printf("ERROR! Too many characters.Please input again('Z' for exit): \n"); 
memset(data,0x00,sizeof(data)); 
fflush(stdin); 
i = 0; 
continue; 

else 

break; 


if (c == CHAR_0 && !strcmp(data,STRING_0)) 

continue; 

data[i] = c; 
i++; 
spaceFlag = false; 

data[i] = '\0'; 
p = data; 
if (*p == CHAR_0 && strlen(p) > 1) 

p++; 

strcpy(data,p); 
if (strlen(data) && !strcmp(data,STRING_Z)) 

return false; 

return true; 

/*输入数据进制*/ 
bool GetScale(char temp[]) 

int i,num,kbn_flg; 
char scalewidth[WIDTH]; 
char * s; 
bool flag; 
kbn_flg = 1; 
flag = false; 
while (!flag) 

memset(scalewidth,0x00,sizeof(scalewidth)); 
memset(temp,0x00,sizeof(temp)); 
if (!GetData(scalewidth,WIDTH,kbn_flg)) /*输入数据*/ 

return false; 

s = scalewidth; 
if (!strlen(s)) /*判断是否输入数据*/ 

CleanScreen(); 
printf("ERROR! Please input the scale(one of 2,8,10,16. 'Z' for exit): \n"); 
continue; 

i = 0; 
while (*s) 

if (*s >= CHAR_0 && *s <= CHAR_9) /*判断是否输入整数*/ 

temp[i] = *s; 
i++; 
s++; 
flag = true; 

else 

CleanScreen(); 
printf("ERROR! Please input the scale(one of 2,8,10,16. 'Z' for exit): \n"); 
flag = false; 
break; 


temp[i] = '\0'; 
num = 0; 
if (flag) 

num = atoi(temp); 
if (!(num == CONST_2 || num == CONST_8 || num == CONST_10 || num == CONST_16)) /*判断是否输入合法整数*/ 

CleanScreen(); 
printf("ERROR! Please input the scale(one of 2,8,10,16. 'Z' for exit): \n"); 
flag = false; 



return true; 

/*输入源数据*/ 
bool GetSource(int in_scale,char inputdata[]) 

int i,kbn_flg; 
char * s; 
char sourcedata[DATAWIDTH]; 
bool flag; 
kbn_flg = 1; 
flag = false; 
printf("Please input one %d scale data('Z' for exit): \n",in_scale); 
while (!flag) 

memset(sourcedata,0x00,sizeof(sourcedata)); 
memset(inputdata,0x00,sizeof(inputdata)); 
if(!GetData(sourcedata,DATAWIDTH,kbn_flg)) /*输入数据*/ 

return false; 

fflush(stdin); 
s = sourcedata; 
if (!strlen(s)) /*判断是否输入数据*/ 

CleanScreen(); 
printf("ERROR! The input is not available!Please input again('Z' for exit): \n"); 
continue; 

i = 0; 
while(*s) /*判断是否输入合法数据*/ 

if
 ((in_scale >= CONST_2 && in_scale <= CONST_10) &&
 ( CHAR_0 <= *s && *s < in_scale + CHAR_0)) 

inputdata[i] = *s; 
i++; 
s++; 
flag = true; 

else if ((in_scale == CONST_16) 
&& ((CHAR_0 <= *s && *s <= CHAR_9) 
|| (CHAR_A <= *s && *s <= in_scale + CHAR_A - CONST_10 - 1) 
|| (CHAR_a <= *s && *s <= in_scale + CHAR_a - CONST_10 - 1))) 

inputdata[i] = *s; 
i++; 
s++; 
flag = true; 

else 

CleanScreen(); 
printf("ERROR! The input is not available!Please input again('Z' for exit):\n"); 
flag = false; 
break; 


inputdata[i] = '\0'; 
if (OtherToDeci(in_scale,inputdata) > (double)MAX) 

CleanScreen(); 
printf("ERROR! The input is not available!Please input again(less than "); 
switch (in_scale) 

case CONST_2: printf("32 bits 1."); 
break; 
case CONST_8: printf("37777777777."); 
break; 
case CONST_10:printf("4294967295."); 
break; 
case CONST_16:printf("8 bits F or f."); 
break; 

printf(" 'Z' for exit): \n"); 
flag = false; 
continue; 


return true; 

/*其他进制转换为十进制*/ 
double OtherToDeci(int scale_in,char inputdata[]) 

int i,len,midint; 
double middbl,temp; 
len = strlen(inputdata); 
temp = 0.00; 
for(i = 0;i < len; i++) 

midint = inputdata[i]; 
if ( CHAR_0 <= midint && midint <= CHAR_9 ) 

midint = midint - CHAR_0; /*0-9*/ 

else if ( CHAR_A <= midint && midint <= CHAR_Z ) 

midint = midint - CHAR_A + CONST_10; /*A-Z*/ 

else 

midint = midint - CHAR_a + CONST_10; /*a-z*/ 

middbl = midint * pow(scale_in,len-i-1); 
temp = temp + middbl; 

return temp; 

/*十进制转换为其他进制*/ 
void DeciToOther(unsigned long deci,int scale_out,char outputdata[]) 

int m,n; 
m = 0; 
n = 0; 
while (deci) 

m = deci % scale_out; 
if (m > CONST_9) 

outputdata[n] = m + CHAR_A - CONST_10; 

else 

outputdata[n] = m + CHAR_0; 

deci = deci / scale_out; 
n++; 

for (m = 0; m <= n / 2 - 1; m++) /*反序得到目标数据*/ 

char t; 
t = outputdata[m]; 
outputdata[m] = outputdata[n - 1 - m]; 
outputdata[n - 1 - m] = t; 

outputdata[n] = '\0'; 

void PutSource(char inputdata[]) /*输出源数据*/ 

int k; 
if (!strcmp(inputdata,STRING_0)) /*源数据为0*/ 

printf("(The source data is: 0)\n"); 

else 

printf("(The source data is: "); 
for( k = 0; k < strlen(inputdata); k++ ) 

printf("%c",inputdata[k]); 

printf(")\n"); 


void ScaleChange(int scale_in,char inputdata[],int scale_out,char outputdata[]) /*进制转换*/ 

int k; 
unsigned long deci; 
deci = 0; 
if (scale_in == scale_out) /*原数据进制和目标数据进制相同,不用转换 */ 

if (!strcmp(inputdata,STRING_0)) 

printf("The object data is: \n0\n"); 

else 

printf("The object data is: \n"); 
for( k = 0; k < strlen(inputdata); k++ ) 

printf("%c",inputdata[k]); 

printf("\n"); 

PutSource(inputdata); 

else 

if (scale_in == CONST_10) 

deci = atol(inputdata); /*源数据是十进制,直接转换为十进制数*/ 

else 

deci = (unsigned long)OtherToDeci(scale_in,inputdata); /*其他进制转换为十进制*/ 

if (scale_out == CONST_10) /*如果目标进制是十进制,直接输出十进制数*/ 

printf("The object data is: \n%u \n",deci); 

else 

if (!deci) /*源数据为0*/ 

printf("The object data is: \n0\n"); 

else 

DeciToOther(deci,scale_out,outputdata); /*十进制转换为其他进制*/ 
printf("The object data is: \n"); /*输出转换后结果*/ 
for( k = 0; k < strlen(outputdata); k++ ) 

printf("%c",outputdata[k]); 

printf("\n"); 


PutSource(inputdata); 


void CleanScreen() /*清屏*/ 

static int errcount = 0; 
errcount++; 
if(!(errcount % CONST_3)) 

errcount = 0; 
system("cls"); 

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-11-29
你这个要求源代码比较麻烦,网上比较多的,数据结构要多看看了,比较好实现的方法,是利用栈。十进制转为二进制,你必须知道是如何算的,就是除2取余数,反复直到0,但是二进制的结果却和开始的顺序是反的,所以利用栈好实现。
给你一个Qt控制台下实现的十进制到二进制的转换,利用了栈实现,其他的你自己实现吧
#include <QCoreApplication>
#include<QDebug>

#include<QStack>

void T2T(int d);//转换函数声明

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

T2T(10);

qDebug()<<"test";

return a.exec();

}

void T2T(int d)

{

QStack<int> s;

int r;//保存余数

while(d!=0)

{

r = d%2;//取余数

s.push(r);//余数入栈

d = d/2;//除2

}

while(!s.isEmpty())//栈不为空

{

r =s.pop();//挨个出栈

qDebug()<<r;//控制台输出

}
}追问

这个不能就用数组或者结构体做吗??我是一个初学者,对于栈不太了解。。。都不懂怎么用,能不能就用结构体或者数组做呢??

本回答被提问者和网友采纳
第2个回答  2020-01-30
二进制的1101转化成十进制
 
 1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13
  转化成十进制要从右到左用二进制的每个数去乘以2的相应次方
  不过次方要从0开始
十进制转二进制:
  用2辗转相除至结果为1
  将余数和最后的1从下向上倒序写
就是结果
  例如302
  302/2
=
151
余0
  151/2
=
75
余1
  75/2
=
37
余1
  37/2
=
18
余1
  18/2
=
9
余0
  9/2
=
4
余1
  4/2
=
2
余0
  2/2
=
1
余0
  1/2
=
0
余1
  故二进制为100101110
二进制转八进制
在把二进制数转换为八进制表示形式时,对每三位二进制位进行分组,应该从小数点所在位置分别向左向右划分,若整数部分倍数不是3的倍数,可以在最高位前面补若干个0;对小数部分,当其位数不是的倍数时,在最低位后补若干个0.然后从左到右把每组的八进制码依次写出,即得转换结果.
你算一下就知道了啊
比如110=2^2+2+0=6
二进制转十六进制
要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,分的不够的前边补零,用四位数的二进制数来代表一个16进制。转换表如下,括号内为十六进制
0000(0)
0001
(1)
0010
(2)
0011
(3)
0100
(4)
0101
(5)
0110
(6)
0111
(7)
1000
(8)
1001
(9)
1010(A)
1011
(B)
1100
(C)
1101
(D)
1110
(E)
1111
(F)
例如:10101011划分为1010
1011,根据转换表十六进制为AB

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网