7日目フラグとビット演算フラグフラグとは、英語でflag、つまり旗を意味する単語です。この言葉はプログラミングによく用いられ、あるものが有効か無効か、ONかOFFか、といったような状態を表すものとしてしばしば利用されます。このような状態を表す型は、一般的にはbooleanなどと呼ばれ、多くの言語では、専用のデータ型が存在しますが、C言語においては、存在しません。そこで、C言語でこういったフラグを用いる際には、様々な方法を用います。簡単な方法は、#defineでマクロを用いて定義する方法です。その方法から紹介してくことにします。サンプルプログラム以下のサンプルは、C言語でフラグを表現するための最も単純なサンプルです。入力して実行してみてください。8乱数関連の関数このプログラムの特徴は、実行するたびに結果が変わることです。それは、10行目、11行目で変数a,bに値を代入する際に使用するrand()関数に理由があります。このプログラムで用いられている関数を紹介しましょう。randで発生させる乱数の系列を変更。1;time関数これだけを見ると、srand()を使用する意味がよくわからないと思います。なんども同じパターンの乱数が発生してしまいます。そこで、srand()関数を用いて変数を初期化するのですが、この時、引数が同じでは、やはり同じパターンの数値しか出ません。引数として、秒単位で現在時刻を返すtime()関数を用い、実行するごとに違う系列の乱数が出現するようにしているわけです。現在までの経過時間を秒単位で取得する。time(NULL);なお、rand(),srand()関数を利用するには、stdlib.h、time()関数を利用するには、time.hをインクルードする必要があります。乱数の範囲を指定するでは、プログラムの中身を紹介していきましょう。8行目で乱数を初期化しています。通常、rand()関数は、0からRAND_MAXという非常に大きな値を発生させます。そのため、1から10の乱数を発生させるには、まず%10をします。これは10で割った余りという意味なので、乱数は0から9の範囲に限定されますから、それに1を足せば、1から10の値を得ることが出来るのです。考え方としては難しいですが、以下の方法を覚えておくと、非常に便利でしょう。1)数学関数サンプルプログラムC言語には、沢山の数値計算用の関数が用意されています。非常にたくさんあり、全てを紹介することはできませんが、比較的使用頻度の高いものをここでいくつか紹介していきましょう。三角関数を使ったサンプルを見てみましょう。180.0;//三角関数での計算printf("sin(%d)=%f¥n",angle,sin(rad));printf("cos(%d)=%f¥n",angle,cos(rad));printf("tan(%d)=%f¥n",angle,tan(rad));}実行結果1(入力した値が同じ場合)角度を入力してください(0~360):45sin(45)=0.706825cos(45)=0.707388tan(45)=0.999204三角関数sin、cos、tanは、その綴りのとおり、ずばりサイン・コサイン・タンジェントを意味します。数学でいうところの三角関数です(表1-3.参照)。()に指定したラジアンを入れるとタンジェントが得られる。()に指定したラジアンを入れるとサインが得られる。()に指定したラジアンを入れるとコサインが得られる。cos(2*3.14);なお、これらはすべて、math.hに含まれています。ラジアンただ、引数として与えるのは、角度ではなく、ラジアンだという点に注意してください。通常、角度を0度から360度までで測るやり方を、度数法(どすうほう)と言いますが、これに対し、ラジアンで角度を指定する方法を弧度法(こどほう)と言います。ラジアンという考え方は、180度をπ(パイ)ラジアンと考えるやり方で、一般の角度をラジアンに変換するには、180で割り、そこに円周率をかけてやる必要があります。定数の設定この計算は、12行目で行っていますが、円周率を表すPIが定義されているのは4行目です。#defineマクロはすでにファイル分割で扱いましたが、このように、定数を定義するのにも用いることが出来ます。3.14このようにすれば、PIという文字列が出てくれば、このソースの中では、3.14として扱うことが出来ます。マクロには、定数を表現する方法のほかに、引数を与えて関数のような処理を行う引数付きマクロと呼ばれるものがあります。詳しくは、こちらをご覧ください。続いては、その他よく使う数学関数を見てみましょう。4.0;printf("%dの絶対値は%d¥n",n,abs(n));printf("%fの絶対値は%f¥n",d1,fabs(d1));printf("%fの2乗は%fです。¥n",d2,pow(d2,2));printf("%fの平方根は%fです。¥n",d2,sqrt(d2));}実行結果-2の絶対値は2-2.500000の絶対値は2.5000004.000000の2乗は16.000000です。4.000000の平方根は2.000000です。使用した関数の説明をしましょう(表1-4)。与えられた整数の絶対値を求める。与えられた実数の絶対値を求める。与えらられた実数の平方根を求める。sqrt(25.0);絶対値を求める関数には、abs(),fabs()の二種類があります。状況に応じて使い分けましょう。ビット演算サンプルプログラム今まで数値の演算ばかり扱ってきましたが、ビット演算も大事な演算です。以下にC言語におけるビット演算のサンプルを取り上げてみました。実行してみてください。その処理の内容を表にまとめます(表1-5)。指定されたビット数分、数値を左シフトする。指定されたビット数分、数値を右シフトする。二つの数値の論理和をとる。論理積(AND演算)。二つの数値の論理積をとる。否定演算(NOT演算)。入力された1なら0に、0なら1に反転。11110000これらの演算は、いわゆる数学的な処理とは違いますが、様々な場面で応用されることがあります。基本的な使い方をおさえておきましょう。