45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:数值相互转换源程序的详细介绍

数值相互转换源程序的详细介绍

2016-08-30 08:50:45 来源:www.45fan.com 【

数值相互转换源程序的详细介绍

使用计算机的人每时每刻都在与数打交道,在计算机内部,数是以二进制表示的,而我们习惯上使用的是十进

制数,所以计算机从我们这里接收到十进制数后,要经过翻译,把十进制数转换为二进制数才能进行处理,这

个过程是由计算机自动完成的。但是对程序员来说,有时需要把十进制数转换为二进制数、十六进制数和八进

制数,或者把十六进制数转换为十进制数等,这都不是一件轻松的工作,为了使这项工作变得轻松愉快,作者

用TURBO C 2.0编写了一个通用的数制转换程序TNS.C,使用它可以方便地完成2~36之间的各种数制的相互转

换工作。

一、数制转换的原理

数制转换的基本原理是:将一个指定进制的数,从高位到低位,一位一位取出,并计算出每位的十进制值,然

后乘以其数基的特定幂指数,得出这一位数的十进制值,将所有各位的十进制值相加得出这个数的十进制值,

然后再将该十进制数转换为指定数制的数,此过程可以采用求余法进行,用这个十进制数作为被除数,用指定

的数基作除数,连续求余,得出的余数依由个位到十位等的顺序组成新数,即得指定数制的数。

二、程序设计的原理

程序设计的关键有两点:

⑴把输入的数转换为十进制数

从输入数值的高位开始,每取一位数字(X),判断它是否为该数制(数基为r)的有效数字,如果是有效数字,求

出其十进制值,然后乘以数基(r)的n-1次幂(n为该数字在数值中所处依右到左的位数),即求“X * r攩n-1攪

”,求出该位数所表示的十进制数值,最后将各位数的十进制值求和,即得该数值的十进制值。

⑵把这个数的十进制值转换为指定数制的数

这个转换过程可以方便地通过C语言提供的itoa,ltoa,ultoa三个函数来实现,它们都可以把以十进制表示的

数值(整型、长整型、无符号长整型)转换为指定数制的字符串,它们的用法是:

char *itoa(int value,char *string,int radix)

cahr *ltoa(long value,char *string,int radix)

char *ultoa(unsigned long value,char *string,int radix)

其中,value是一个十进制数,radix是转换value过程中的数基,它必须在2~36之间,string为字符串。

三、程序使用方法

该程序采用DOS命令行格式:

TNS <数值> <数制1的基> <数制2的基>

其中,“数值”是数制1的有效数,“数制1的基”和“数制2的基”是有效的十进制数,可以取2~36之间的

任意数。例如:

TNS 128 10 16 <回车>

屏幕显示的结果为:

128(10) = 80(16)

其中,等式左边为输入的数,等式右边为输出的数,括号中的数为该数的基,如80(16)的意义为十六进制的

80,128(10)为十进制的128。

再如:

TNS 128 10 2 <回车>

屏幕显示为:

128(10) = 10000000(2)

四、源程序清单

/********************************************************/

/* 程序名称: TNS.C 1.0 */

/* 作 者: 董占山 */

/* 完成日期: 1995-11-09 */

/* 用 途: 2~36之间的各种数制的数任意转换 */

/********************************************************/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

/* 显示帮助信息 */

void help()

{

printf("/nUsage : Translate the number between two number systems/n");

printf("Syntex: TNS <number> <radix1> <radix2>/n");

exit(0);

}

/* 显示错误信息 */

void printerror(errno,num,base1)

char errno,*num,*base1;

{

switch (errno) {

case 1 : printf("/nError : Origin number %s(%s) is valid !!!/n",num,base1);

break;

case 2 : printf("/nError : radix (%s) is invalid !!!/n%s/n",base1,

"Correct : radix>=2 and radix <=36");

break;

}

help();

}

/* 数制转换函数 */

void transnum(num,base1,base2)

char *num,*base1,*base2;

{

int i,k,l,m,j,ibase1,ibase2;

long inum=0;

char temp[20];

double r=0;

i = strlen(num); /* 数值的长度 */

ibase1 = atoi(base1); /* 数基1 */

if ((ibase1<2) || (ibase1>36)) printerror(2,"",base1); /* 有效吗? */

ibase2 = atoi(base2); /* 数基2 */

if ((ibase2<2) || (ibase2>36)) printerror(2,"",base2); /* 有效吗? */

for (j=0;j<i;j++) {

r = pow(ibase1,i-j-1); /* 计算数基的幂指数 */

if (ibase1<=10) l = '9' - (10 - ibase1); /* 计算有效的数范围 */

else {

m = 'a' + (ibase1 - 11);

l = '9';

}

if ((num[j]>=48) && (num[j]<=l)) /* 求每位数字的十进制值 */

k = num[j]-48;

else if (ibase1>10) {

/* 求每个字母所代表的十进制值 */

if ((num[j]>='A') && (num[j]<=m - 32))

k = num[j] - 'A'+10;

else if ((num[j]>='a') && (num[j]<=m))

k = num[j] - 'a'+10;

else printerror(1,num,base1);

}

else printerror(1,num,base1);

inum += k * (int) r; /* 累加计算结果 */

}

/* 输出转换结果 */

printf("%s(%d) = %s(%d)/n",num,ibase1,ltoa(inum,temp,ibase2),ibase2);

}

/* 主程序 */

main(argc,argv)

int argc;

char *argv[];

{

static char num[10],base1[10],base2[10];

printf("(TNS)Translator of Number System 1.0 Copyright (c) 1995 Dong Zhanshan/n");

switch (argc) {

case 1:

case 2:

case 3: help();

break;

case 4: strcpy(num,argv[1]);

strcpy(base1,argv[2]);

strcpy(base2,argv[3]);

transnum(num,base1,base2);

}

 

本文地址:http://www.45fan.com/a/question/69702.html
Tags: 转换 数值 相互
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部