#include #define MOJI 10 void absolute(int *abs, int *n1, int *n2); int getdec(int *ans, int keta); void keyflush(int input); /* ----- 滅入ん ----- */ void main() { int abs; int ans1; int ans2; do { printf("1つ目の整数を入力:"); if (getdec(&ans1, MOJI) == -1) { /* マイナス値が返るとエラー */ printf("ERROR: 終了します\n"); break; } printf("2つ目の整数を入力:"); if (getdec(&ans2, MOJI) == -1) { /* マイナス値が返るとエラー */ printf("ERROR: 終了します\n"); break; } absolute(&abs, &ans1, &ans2); /* 絶対値を計算するる */ printf("%d と %d の絶対値は %d です\n", ans1, ans2, abs); } while (0); } /* ----- 関数の定義 ----- */ void absolute(int *abs, int *n1, int *n2) /* 値は全て参照渡しでやってくる */ { if (*n1 > *n2) { *abs = *n1 - *n2; /* 結果も参照渡しで返す */ } else { *abs = *n2 - *n1; /* こっちもな */ } } int getdec(int *ans, int keta) /* 数字を表す文字列を数値で返す関数 */ /* ただし -1 が入力されると不都合がある */ /* 2007/01/04 参照渡しに変更して対処済み */ { int input; /* 1 文字入力の値 */ int sign = 2; /* 最初のループ時:2 整数:0 負数:1 */ int i = 0; /* 繰り返しカウンタ ※ 1 文字読み込んだら増やす */ *ans = 0; /* 文字→数値変換の結果が入る */ while ((input = getchar()) != '\n') { i++; /* 繰り返しカウンタを増やす */ if (sign == 2) { /* 符号判定 ※最初の 1 回のみ実行される */ if (input == '-') { /* 負数の時 */ sign = 1; /* 負数フラグ On */ input = getchar(); /* '-' を読み飛ばす */ i++; /* 繰り返しカウンタを増やす */ } else if (input == '\n') { keyflush(input); return -1; /* 行頭での改行はエラー (-1) */ } else { sign = 0; /* 負数フラグ Off */ } } if (i > keta) { /* 繰り返しの判定 */ break; /* 所定回数に達したら抜ける */ } if (input >= '0' && input <= '9') { *ans = (*ans * 10) + (input - '0'); /* 文字数字を 10 進数に変換 */ } else { keyflush(input); return -1; /* 数字以外の入力ならエラー (-1) */ } } if (!i) { /* 改行のみの入力はエラー */ return -1; } keyflush(input); if (sign) { *ans *= -1; /* 負数の時は符号を反転しておく */ } return 1; /* 正の整数は正常終了 */ } void keyflush(int input) { while (input != '\n') { /* 入力バッファのクリア簡易版 */ input = getchar(); } }