题目:分别编写把十进制整数转化为二进制和把二进制整数转化为十进制整数的函数,并编写主程序调用它们,以验证其正确性。

【算法】:将十进制整数转化为二进制整数的算法是:将十进制数除以2,得到一个商数和一个余数;再将商数除以2,又得到一个商数和一个余数;继续这个过程,直到商数为0为止。每次得到的余数(必定是0或1)就是对应二进制的各位数字。最后一次得到的余数为二进制的最高位,第一次得到的为二进制的最低位。

将二进制数转化为十进制数的算法是:将二进制数的各位数字乘以2的n次方再相加,其中n等于相应二进制数数字的位序号(从该整数的末位数起)减1;这样得到的和就是所求的十进制数。

【流程图】

shi_zhuan_er的流程图

i=0并定义静态数组a[24]

输出提示(printf("将十进制数转化为二进制数:\n");)

n>0

 

k=n%2;n=(n-k)/2;a[i]=k;i++;

i=23

 

输出a[i] (printf("%d",a[i]);)

i=i-1

换行

Return

er_zhuan_shi的流程图:

m=0

输出提示(printf("将二进制数转化为十进制数:\n");)

i=0

i<=n

k=n-I-1;m=a[i]*pow(2,k)+m;

i=i+1

输出m (printf("%d",m);)

Return

主函数因简单,流程图省略。

【程序清单】:

/*5.c*/
#include"stdio.h"
#include"math.h"
void shi_zhuan_er(int n)
{int k;int i=0;
static int a[24];
printf("将十进制数转化为二进制数:\n");
while (n>0)
{k=n%2;n=(n-k)/2;a[i]=k;i++;}
for(i=23;i>=0;i--)
printf("%d",a[i]);
printf("\n");
return;
}

 

void er_zhuan_shi(int a[],int n)
{int k,i; int m=0;
printf("将二进制数转化为十进制数:\n");
for(i=0;i<=n-1;i++)
{k=n-i-1;m=a[i]*pow(2,k)+m;}
printf("%d",m);
return;
}

 

void main()
{char c;int n,i;int a[24];
printf("\n十进制转化为二进制还是二进制转化为十进制(s&e):\n");
scanf("\n%c",&c);
if (c=='s')
{printf("输入数据:\n");scanf("%d",&n);
shi_zhuan_er(n);
}
else if (c=='e')
{printf("输入数据的位数:\n");
scanf ("%d",&n);
printf("输入数据(请输入一个数字后加空格分隔):\n");
for(i=0;i<n;i++) scanf("%d",&a[i]);
er_zhuan_shi(a,n);
}
}

【运行结果】

十进制转化为二进制还是二进制转化为十进制(s&e):

s

输入数据:

123

将十进制数转化为二进制数:

000000000000000001111011

再次运行:

十进制转化为二进制还是二进制转化为十进制(s&e):

e

输入数据的位数:

6

输入数据(请输入一个数字后加空格分隔):

1 0 1 0 1 1

将二进制数转化为十进制数:

43