計算機科学のブログ

ほしい物リスト

C - 高度な関数 - 関数を最大限に活用する - 関数, ポインター, 配列

Head First C ―頭とからだで覚えるCの基本David Griffiths(著)、 Dawn Griffiths(著)、 中田 秀基(監修)、 木下 哲也(翻訳)、 O’Reilly Media)の7章(高度な関数 - 関数を最大限に活用する)、p.339(自分で考えてみよう)の解答を求めてみる。

Makefile

all: main.c
	cc main.c && ./a.out

コード

main.c

#include <stdio.h>

typedef enum
{
    DUMP,
    SECOND_CHANCE,
    MARRIAGE
} response_type;
typedef struct
{
    char *name;
    response_type type;
} response;

typedef void (*reply)(response);

void dump(response r)
{
    printf("%sさんへ、\n", r.name);
    puts("残念ながら、前回のデートの結果、");
    puts("再度お会いすることはないことの連絡を受けました。");
}
void second_chance(response r)
{
    printf("%sさんへ、\n", r.name);
    puts("よいお知らせです。、前回のデートの結果、");
    puts("もう一度お会いしたいとの連絡を受けました。至急ご連絡ください。");
}
void marriage(response r)
{
    printf("%sさんへ、\n", r.name);
    puts("おめでとうございます!前回のデートの結果、");
    puts("結婚を申し込みたいとの連絡を受けました。");
}
reply replies[] = {dump, second_chance, marriage};
int main()
{
    response r[] = {
        {"マイク", DUMP},
        {"ルイス", SECOND_CHANCE},
        {"マット", SECOND_CHANCE},
        {"ウィリアム", MARRIAGE}};
    for (size_t i = 0; i < 4; i++)
    {
        replies[r[i].type](r[i]);
    }
}

入出力結果(Terminal, Zsh)

% make
cc main.c && ./a.out
マイクさんへ、
残念ながら、前回のデートの結果、
再度お会いすることはないことの連絡を受けました。
ルイスさんへ、
よいお知らせです。、前回のデートの結果、
もう一度お会いしたいとの連絡を受けました。至急ご連絡ください。
マットさんへ、
よいお知らせです。、前回のデートの結果、
もう一度お会いしたいとの連絡を受けました。至急ご連絡ください。
ウィリアムさんへ、
おめでとうございます!前回のデートの結果、
結婚を申し込みたいとの連絡を受けました。
%