next up previous
Next: 配列を引数にする(例: 内積を用いた角度の計算) Up: 復習: 16進法 revisited Previous: 変換プログラムその 1

変換プログラムその 2

上のように, C言語の仕様を使えば, 簡単にプログラムが書けますが ここでは, それを利用せず 10 進表記から 16 進表記に変換する プログラムを書く事を考えます. プログラミングでは, 「有る物は利用し, 無い物は作る」というのは基本ですが, ここでは 無いものを作る事ができるようになるための練習です 2.

さて, 16 進表記 $x = a_n\times16^n + \cdots + a_1\times16^1 + a_0\times 16^0$ において, $x \equiv a_0~ {\rm mod}~ 16,~ (x-a_0)/16 \equiv a_1~ {\rm mod}~ 16,
\cdots$ が成立しますから, 10 進表記の数を 16 で割っていき, その余りを 下の桁から順に書いていけば, 自動的に 16 進表記ができる事になります.

下のプログラムは, 符号無し int 型の 10 進表記を 16 進表記に変換する プログラムで, 簡単のために 16 進の出力は先頭部分に 0 の列が現れる様に なってます. プログラム内で, do - while 文が現れています. これは, 既に現れた while 文と同様ですが, まず最初に do を一度実行してから while 判定が行われて, その後判定結果が偽になるまで doの {  } で 囲まれた部分が繰り返されます.

文字列リテラル(literal)
ANSI の規格では, 2重引用符 " で囲まれた文字列は, 「文字列リテラル」 と呼ばれます.

C言語の文字列は最期に '\0 のついた char 型配列です.下のプログラムでは,
 
char output[]="00000000";
char moji[]="0123456789ABCDEF";
の部分は, 文字列リテラルを用いた文字列(char 型配列変数)の初期化です.

/* File name 10-3.c  */
#include <stdio.h>
#define BUFFSIZE 1024

main()
{
     char input[BUFFSIZE];
     char output[]="00000000";
     char moji[]="0123456789ABCDEF";
     
     unsigned int  decimal, residue;
     int  radix=16;
     int  i=1;     
     
     printf("Input a decimal number.>>");
     fgets(input, BUFFSIZE, stdin);
     sscanf(input, "%ud", &decimal);
     
     do{
          residue = decimal%radix;
          decimal = decimal/radix;
          output[8-i] = moji[residue];
          i++;
     } while(decimal != 0);
     
     printf("Its hexadecimal notation is 0x%s.\n", output);
}



Next: 配列を引数にする(例: 内積を用いた角度の計算) Up: 復習: 16進法 revisited Previous: 変換プログラムその 1