C言語教室 第24回 - 関数ポインタとは(回答提出)
こちらの記事の課題回答です。
課題
コメント
関数ポインタって、書き方がなかなか覚えられなくって。いつも、過去コードを見直して書いたりします。そんなに頻繁に書かないし、どこに()をつければいいのか、なんだか直感的にわかりにくいというか。何度書いてもなれないなぁ。最近は「pfunc()」と書けるとは知らなかった。
コード
#include <stdio.h>
// 課題
// 1. まず整数の引き数を2つ持ち、この引き数の和を返す関数と、差を返す関数を書きなさい。
int add(int x, int y)
{
return (x + y);
}
int sub(int x, int y)
{
return (x - y);
}
// 2. 整数を2つと先に作った和と差を求める関数のポインタ型(整数の引き数が2つ、戻り値が整数の関数)を持つ構造体を定義し、この構造体の配列を作って、それぞれの要素の2つの整数型のメンバ変数には適当な値を入れてください。
struct cal
{
int x;
int y;
int (*cal)(int x, int y);
};
struct cal cals[10] =
{
{743, 24, },
{ 3, 366, },
{-55, 5, },
{ 74, 586, },
{ 14, -38, },
{124, 61, },
{-96, 912, },
{ 8, 358, },
{ 41, 22, },
{ 86, 779, },
};
// 3. 構造体配列の最初の整数型のメンバ変数の値が奇数だった場合は、構造体の関数ポインタ型のメンバ変数に和を求める関数、偶数だった場合は、差を求める関数を代入してください。
void cals_init()
{
int i;
for (i = 0; i < 10; i++)
{
if ((cals[i].x & 0x01) != 0)
{
cals[i].cal = add;
}
else
{
cals[i].cal = sub;
}
}
}
// 4. 構造体配列の要素を順に取り出し、整数型の2つのメンバ変数を引数として、関数ポインタ型のメンバ変数の関数を呼び出し、引き数と戻り値を表示してください。
void cals_run()
{
int i;
for (i = 0; i < 10; i++)
{
int result = (*cals[i].cal)(cals[i].x, cals[i].y);
printf("%3d cal %3d = %d\n", cals[i].x, cals[i].y, result);
}
}
int main()
{
cals_init();
cals_run();
return 0;
}
実行結果
743 cal 24 = 767
3 cal 366 = 369
-55 cal 5 = -50
74 cal 586 = -512
14 cal -38 = 52
124 cal 61 = 63
-96 cal 912 = -1008
8 cal 358 = -350
41 cal 22 = 63
86 cal 779 = -693
この記事が気に入ったらサポートをしてみませんか?