「C言語練習」 1-8.c   ・前へ   ・次へ
/* n進法の計算、論理和・論理積   1-8.c */
#include <stdio.h>

main()
{
	int i,j[14],a,n=2001;	// 初めに表示する数 nを用意。何でもよい。

/* j[]が、桁表示に使用する変数。j[0]を一桁目、j[1]を二桁目と使う。 2進数が一番多く桁を
使うので(14桁要る)、その数だけ確保。
 */
	printf("* 10進数( 4桁以下)を、n進数で表示 *\n");
	printf("何進数に変換しますか(2-9):");
		scanf("%d",&a);
			if (a<2 || 9<a) a=2;	// 入力ミスの時 2進数にしておく

/* aが 2より小さい時( 1進数なんてあり得ない)と 9より大きい時(10以上でも良いが、現
段階ではまだ無理)をミスとしている。
 この様に、(a条件)か(b条件)かが成立する場合に、ある命令を実行させたい事がよくある。
これは論理和(二集合のどっちでもいい)であり、||を使う。条件括弧の中は(a<2 || a>9)でも
よい。ここでは、大小関係の向きが同じに見える様に書いている。まあ、どちらでも構わない。
論理和で示す条件は別々に書くことが出来る。つまり、if (a<2) a=2; と if (9<a) a=2; を二つ
並べて書いても同じ事である。
*/
	printf("%d進数\n\n%d=",a,n);

	do {	// do while 文にも慣れておく。
		for (i=0;i<=13;i++) {j[i]=0; j[i]=n%a; n=n/a;}

/* このfor文の一行が計算部分。n進法計算には割り算の余りが必要で、その余りを求めるのに
 %を使う( n÷a=b ...余り c 、であれば c が n%a の値となる)。

 やっている事は簡単で、5進法であれば入力数を 5で割って余りを桁表示用の変数に納める。
桁を一つ上げて、商を再び割る。同様の事を繰り返して商が 0になったら終了である。ただし、
loopは最後まで回している。 j[i]=0;は初期化。 n進法とは何かがこの遣り方で分かる。

 ところで、初めに用意した桁は14あるので、これを頭から表示すると最上位の桁に達するまで
に 0が幾つも連なってしまう。そこで、下のif文の一行で上から桁を調べて 0以外の数が納まって
いる場所を捜している(その桁表示用変数として御用済みの変数 n を使う)。先頭から 0が幾つ
か表示される事を気にしなければ、この一行は不要。n=13から表示していけば良い。 */

		for (i=13;i>=0;i--) if (j[i]!=0) {n=i; break;}	// 最上位桁を求める

/* aと bが違う事を示すには (!=) を使って a!=b の様に書く。 ! は単独でも否定に使うが、
関係演算子として左右が異なる事を示す時には、(!=) とする。*/

		for (i=n;i>=0;i--) printf("%d",j[i]);	// 最上位桁から表示
		printf("\n数を入力:");
			scanf("%d",&n);
	} while (0<=n && n<=9999);

/* 5桁以上の数と負数の入力でloopを抜けている。つまり、loopを回る条件は入力された数が
 0以上9999以下の時である。(0<=n<=9999)の様な書き方は許されないので、こういう時には
(0<=n)且つ(n<=9999)と書かねばならない。これを論理積(二集合が重なった所)といい && を使う。
書き方は、(n>=0 && n<=9999)でも良いが、(0<=n && n<=9999)の方が、間に nが挟まれている事が
分かっていい。
 条件判定においては、論理和も論理積も非常によく用いられる。
*/

printf("\nEnd\n");
return 0;
}


(前に戻る)   ・次へ