#include <stdio.h>
enum{ GOOD, BAD }; /* waru_zero用 */
int waru_zero = GOOD; /* 0で割りそうだったらBAD, それ以外はGOOD */
#define ENZAN_NUM 4 /* 演算の種類の数 */
#define ERRORSTR "ERROR ! " /* エラーの文字 */
#define TASU(p, q) p+q /* マクロ (たす) */
#define HIKU(p, q) p-q /* マクロ (ひく) */
#define KAKERU(p, q) p*q /* マクロ (かける) */
#define WARU(p, q) ((q) ? p/q : (waru_zero=BAD)) /* マクロ (わる) */
/* q が 0 なら割り算を行わず、waru_zero に BAD を代入する */
/* 四則演算の関数 */
int tasu(int x, int y){ return TASU(x, y); }
int hiku(int x, int y){ return HIKU(x, y); }
int kakeru(int x, int y){ return KAKERU(x, y); }
int waru(int x, int y){ return WARU(x, y); }
/* マクロ関数 */
int (*p_enzan[ENZAN_NUM])(int, int) = { tasu, hiku, kakeru, waru };
/* ============================= */
/* main 関数 */
/* ============================= */
int main(int argc, char *argv[])
{
int i, i2, a=4, b=2, result; /* ループ、2つの数と演算結果 */
char resultstr[32] = ERRORSTR; /* 演算結果の文字列 */
const char *enzanshi[ENZAN_NUM]={"+", "-", "*", "/"}; /* 演算子4つ */
for(i=0; i<2; i++){ /* ループ */
if(i>0) b=0; /* 2ループ目は b=0 */
for(i2=0; i2<ENZAN_NUM; i2++){ /* ENZAN_NUM 個の計算 */
result = (*(p_enzan+i2))(a, b); /***** 計算 *****/
/* 0で割ろうとしたかどうか */
if(waru_zero==GOOD) sprintf(resultstr, "%d", result);
else strcpy(resultstr, ERRORSTR);
/***** 結果出力 *****/
printf("%d %s %d = %s\n", a, *(enzanshi+i2), b, resultstr);
}
}
return 0;
}
|