まとめ:計算機のディスパッチ
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 37/61。
チャレンジ
簡単ディスパッチテーブルを使用して計算機を構築します。演算コードを対応する関数にマッピングする関数ポインタの配列を作成し、それを使用して計算を実行します。
以下のプログラムを作成してください:
- 2つの
int型パラメータを受け取り、int型を返す関数ポインタのtypedef名Operationを作成します。 - 4つの算術関数を定義します:
add— a + b を返しますsub— a - b を返しますmul— a * b を返しますdivide— a / b を返します(整数除算)
main関数内で、ディスパッチテーブルを作成します。これは4つのOperation関数ポインタの配列で、インデックス0は add、インデックス1は sub、インデックス2は mul、インデックス3は divide とします。- 3つの入力(2つの整数と、0から3の演算コード)を読み取ります。
- 演算コードを使用してディスパッチテーブルのインデックスを参照し、適切な関数を呼び出します。
- 結果を出力します。
入力として、最初の数値、2番目の数値、および演算コード(0は add、1は sub、2は mul、3は divide)の3つを受け取ります。
出力は、演算結果である1つの整数にする必要があります:
7入力が 10, 3, 1 の例では、演算コード 1 がディスパッチテーブルから sub を選択するため、10 - 3 = 7 を計算します。
ここでのポイントは、関数の選択に配列のインデックスを使用することです。if 文や switch 文は必要ありません。ディスパッチテーブルは以下のようになります:
Operation ops[4] = {add, sub, mul, divide};その後、次のように関数を呼び出します:ops[code](a, b)
自分で試してみよう
#include <stdio.h>
// TODO: 2つのint型パラメータを受け取り、int型を返す
// 関数ポインタのtypedef 'Operation' を作成してください
// 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;
}