まとめ:計算機のディスパッチ
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 37/61。
チャレンジ
簡単ディスパッチテーブルを使用して電卓を作成します。演算コードを対応する関数にマッピングする関数ポインタの配列を作成し、それを使って計算を実行します。
次のプログラムを作成してください。
- 2つの
intパラメータを受け取り、intを返す関数ポインタ用に、Operationという名前のtypedefを作成する - 4つの arithmetic 関数を定義する:
add:a + b を returnssub:a - b を returnsmul:a * b を returnsdivide:a / b を returns(整数除算)
main内で dispatch table を作成する:4つのOperation関数ポインタの array で、インデックス 0 は add、インデックス 1 は sub、インデックス 2 は mul、インデックス 3 は divide とする- 3つの入力、つまり2つの整数と operation code(0-3)を読み取る
- operation code を使用して dispatch table をインデックス指定し、appropriate 関数を call する
- result を出力する
3つの入力、すなわちfirst number、second number、およびoperation code(add は 0、sub は 1、mul は 2、divide は 3)を受け取ります。
Output は単一の整数、つまり operation の result である必要があります。
7入力が 10、3、1 のこの例では、operation code 1 によって dispatch table から sub が選択されるため、10 - 3 = 7 を計算します。
ここで重要なのは、array indexing を使用して function を選択することです。if や switch ステートメントは不要です。dispatch table は次のようになります。
Operation ops[4] = {add, sub, mul, divide};次のように function を call します:ops[code](a, b)
自分で試してみよう
#include <stdio.h>
// TODO: 関数ポインタ用の 'Operation' という typedef を作成する
// 2つの int パラメータを取り、int を返す
// TODO: 4つの算術関数を定義する: add, sub, mul, divide
int main() {
// 入力を読み取る
int a, b, code;
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &code);
// TODO: ディスパッチテーブル(4つの Operation 関数ポインタの配列)を作成する
// Operation ops[4] = { ... };
// TODO: 操作コードを使って適切な関数を呼び出す
// そして結果を格納する
int result;
// 結果を出力する
printf("%d\n", result);
return 0;
}オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ