/* 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; }