C實現數制之間的相互轉換

 

         使用計算機的人每時每刻都在與數打交道,在計算機內部,數是以二進制表示的,而我們習
慣上使用的是十進制數,所以計算機從我們這裏接收到十進制數後,要經過翻譯,把十進制
數轉換爲二進制數才能進行處理,這個過程是由計算機自動完成的。但是對程序員來說,有
時需要把十進制數轉換爲二進制數、十六進制數和八進制數,或者把十六進制數轉換爲十進
制數等,這都不是一件輕鬆的工作,爲了使這項工作變得輕鬆愉快,作者用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,base1,base2;
  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);
     strcpy


文章出處:www.diybl.com):http://www.diybl.com/course/3_program/vc/vc_js/20100630/262452.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章