论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

通用数制转换程序

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:43:26

使用计算机的人每时每刻都在与数打交道,在计算机内部,数是以二进制表示的,而我们习
惯上使用的是十进制数,所以计算机从我们这里接收到十进制数后,要经过翻译,把十进制
数转换为二进制数才能进行处理,这个过程是由计算机自动完成的。但是对程序员来说,有
时需要把十进制数转换为二进制数、十六进制数和八进制数,或者把十六进制数转换为十进
制数等,这都不是一件轻松的工作,为了使这项工作变得轻松愉快,作者用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);
    }
}

上一篇:{实例}用C语言编写串口程序 人气:6558
下一篇:{实例}一个分形图形 人气:6775
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058