見出し画像

C言語教室 第24回 - 関数ポインタとは(回答提出)

こちらの記事の課題回答です。

課題


課題
1. まず整数の引き数を2つ持ち、この引き数の和を返す関数と、差を返す関数を書きなさい。

2. 整数を2つと先に作った和と差を求める関数のポインタ型(整数の引き数が2つ、戻り値が整数の関数)を持つ構造体を定義し、この構造体の配列を作って、それぞれの要素の2つの整数型のメンバ変数には適当な値を入れてください。

3. 構造体配列の最初の整数型のメンバ変数の値が奇数だった場合は、構造体の関数ポインタ型のメンバ変数に和を求める関数、偶数だった場合は、差を求める関数を代入してください。

4. 構造体配列の要素を順に取り出し、整数型の2つのメンバ変数を引数として、関数ポインタ型のメンバ変数の関数を呼び出し、引き数と戻り値を表示してください。

コメント

関数ポインタって、書き方がなかなか覚えられなくって。いつも、過去コードを見直して書いたりします。そんなに頻繁に書かないし、どこに()をつければいいのか、なんだか直感的にわかりにくいというか。何度書いてもなれないなぁ。最近は「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

この記事が気に入ったらサポートをしてみませんか?