【第10回】


『内容』

<プリプロセッサ>

 preprocessor:前処理をするためのコンピュータプログラム.

1. ファイルの組み込み(#include 2. マクロ定義(#define マクロ(macro):呼び出して使えるあらかじめ登録された操作手順<英和辞典より> 3. マクロ定義の解除(#undef

<ライブラリ関数>

 標準入出力関数(printf()scanf()等)については既に学んだ.システムで既に用意されている標準関数はライブラリ(library:図書館,書庫,情報源)関数と呼ばれる.これらのライブラリ関数を使用するには,その関数を記述したヘッダファイル(stdio.hmath.h等)をインクルードする(#include文を用いる)必要がある.
 ここでは,以下のライブラリ関数について学習する.

1. 文字列操作関数

 ヘッダファイルstring.hをインクルードする必要がある.各関数名の最初のstrstring(文字列)の略である.

2. 数学関数

 三角関数や数式計算を行う関数であり,stdlib.hstandard library:標準ライブラリ)またはmath.hmathematics:数学)をインクルードする必要がある.基本的に,数学関数の引数ならびに戻り値はdouble型である(absは例外).

ヘッダファイルmath.hをインクルードした場合は,コンパイル時に

    cc sample.c -lm
とする必要がある.-lmlibraryのmath関数を含めてコンパイルするというオプションである.

3. データ変換関数

 文字列データを異なるデータ型(int型とdouble型)へ変換する関数として,以下のものがある.ただし,stdlib.hをインクルードしておく必要がある.


条件付きコンパイル,メモリ操作関数,入出力関数,その他の関数(教科書p.57の6.3.4節,p.93以降の9.5節,9.6節,9.7節)は省略する

 この範囲は,テスト範囲から除外するが,興味のある学生は一読しておくと良い.


『演習』

6.3 プリプロセッサ

 プログラムのコンパイル時に,前処理として,ヘッダファイルやユーザ定義関数の組み込み処理,文字列の置換処理などがプリプロセッサにより行われる.

6.3.1 ファイルの読み込み(#include

 標準入出力関数などシステムで用意されているものや,別ファイルに記述したユーザ関数を使用するためには,それらのファイルを組み込まなければならない.この処理を行うものが#includeである.教科書p.54の「文法6-7」を参照のこと.


6.3.2 マクロ定義(#define

 文字列や関数の置換処理,すなわち,定義を行うことができる.

 教科書p.55の「プログラム6-4」を実行し,その動作を確認せよ.(教科書p.55の「文法6-8」を参照)

 簡単な関数も同様に定義することができる.

 教科書p.56の「プログラム6-5」を実行し,その動作を確認せよ.(教科書p.55の「文法6-9」を参照)

 三項演算子というものがある.教科書p.56の「文法6-10」とその下に説明があるので見ておくこと.三項演算子は,マクロ定義以外のプログラム中でも使用することができる.これを使った例が,教科書p.56の「プログラム6-6」である.


6.3.3 マクロ定義の解除(#undef

 #define文で定義したものを解除するのが#undef文である.再度定義したい場合は,#undef文の後に再度#define文を記述すればよい.この例が,教科書p.57の「プログラム6-7」である(教科書p.57の「文法6-11」を参照).


9.ライブラリ関数

9.1 ライブラリ関数の使用法

 ライブラリ関数を使用する場合,必要なヘッダファイルを#include文を使って取り込む必要がある.この章で説明されるライブラリ関数を表で説明している.表の見方が教科書p.84に記載されているので見ておくこと.


9.2 文字列操作関数

 文字列の結合,コピーなどの操作を行う関数である.

9.2.1 strcat()

 2つの文字列を結合する関数である.

 教科書p.85の「プログラム9-1」を実行し,その動作を確認せよ.(教科書p.84の表を参照)


9.2.2 strncpy()strcpy()

 strncpyは指定文字数だけ,strcpy()は全文字列をコピーする.

 教科書p.86の「プログラム9-2」を実行し,その動作を確認せよ.(教科書p.86の表を参照)


9.2.3 strncmp()strcmp()

 2つの文字列を比較して,同一かどうかを判定する.同一の場合は「0」を,異なっている場合は「正または負の整数」の値を返す.異なる場合の正と負は,比較される文字列の文字コードの大きさ(教科書p.8の「表2-3」を参照)で決まる.文字コードで判定されているので,大文字と小文字も区別される.

 教科書p.87の「プログラム9-3」を実行し,その動作を確認せよ.(教科書p.86とp.87の表を参照,表中の「size_t」は符号無し整数型を表す)


9.2.4 strlen()

 文字列の長さ(文字数)を調べることができる.文字数にヌル文字「\0」は含まれない.

 教科書p.87の「プログラム9-4」を実行し,その動作を確認せよ.(教科書p.87の表を参照)


9.3 数学関数

 三角関数や数式計算を行う関数である.

9.3.1 abs()fabs()

 整数型(int型)と実数型(double型)の引数の絶対値を求める関数である.abs()はヘッダファイルstdlib.hを,fabs()はヘッダファイルmath.hをインクルードする点に注意せよ.

 教科書p.88の「プログラム9-5」を実行し,その動作を確認せよ.さらに,実数値(double型)をキーボードから入力し,その絶対値を表示するようにプログラムを修正せよ.(教科書p.88の表を参照)


9.3.2 rand()

 疑似乱数を生成する関数である.通常,関数srand()と共に使用される.srand()の引数として異なった整数値を与えると,rand()により生成される疑似乱数列は異なったものになる.言い換えると,srand()の引数として同じ整数値を与えると,rand()により生成される疑似乱数列は常に同じものとなる.

 教科書p.89の「プログラム9-6」を実行し,その動作を確認せよ.さらに,srand(0)srand(-1)srand(10)等に変えて,その実行結果の違いを確認せよ.(教科書p.88の表を参照)


9.3.3 pow()

 べき乗を求める関数である.計算が実行できない場合は「0」を返す.

 教科書p.89の「プログラム9-7」を実行し,その動作を確認せよ.(教科書p.89の表を参照)


9.3.4 sqrt()

 平方根を求める関数である.

 教科書p.90の「プログラム9-8」を実行し,その動作を確認せよ.(教科書p.90の表を参照)


9.3.5 sin()cos()tan()

 正弦,余弦,正接を求める関数である.引数はラジアン[rad]で与える.

 教科書p.91の「プログラム9-9」を実行し,その動作を確認せよ.(教科書p.90の表を参照)


9.3.6 exp()

 指数値を求める関数である.


9.3.7 log()log10()

 自然対数と常用対数を求める関数である.

 教科書p.91の「プログラム9-10」を実行し,その動作を確認せよ.(教科書p.91の表を参照)


9.4 データ変換関数

9.4.1 atoi()atof()

 文字列データを整数型(int型)と実数型(double型)へ変換する関数である.

 教科書p.92の「プログラム9-11」を実行し,その動作を確認せよ.(教科書p.92の表を参照)


レポート課題9(授業終了後にアップロード)

 RePORTシステム