計算機科学のブログ

ほしい物リスト

C - 高度な関数 - 関数を最大限に活用する - 可変個引数

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

Makefile

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

コード

main.c

#include <stdio.h>
#include <stdarg.h>

typedef enum
{
    MUDSLIDE,
    PUZZY_NAVEL,
    MONKEY_GLAND,
    ZOMBIE
} drink;

double price(drink d)
{
    switch (d)
    {
    case MUDSLIDE:
        return 6.79;
    case PUZZY_NAVEL:
        return 5.31;
    case MONKEY_GLAND:
        return 4.82;
    case ZOMBIE:
        return 5.89;
    }
}
double total(int args, ...)
{
    double total = 0;
    va_list ap;
    va_start(ap, args);
    for (size_t i = 0; i < args; i++)
    {
        total += price(va_arg(ap, double));
    }
    va_end(ap);
    return total;
}

int main()
{
    printf("価格は%.2fです。\n",
           total(3, MONKEY_GLAND, MUDSLIDE, PUZZY_NAVEL));
}

入出力結果(Terminal, Zsh)

% make
cc main.c && ./a.out
価格は20.37です。
%