/*****************************************************************************/ /* */ /* ジョブ名称 : n進計算機(オリジナルプログラム) */ /* */ /* 機能概要 : n進数の四則計算をする(モジュール分割) */ /* */ /* : */ /* */ /* 作成者 : 恒川 昭一(カーネルキャリアスクール) */ /* */ /* バージョン番号 01.20 日付 2005/06 備考 コメント削除版 */ /* */ /*****************************************************************************/ #include int adicinp(void); int numinp(int *num, int ntype); int opeinp(void); /* ----- 滅入ん ----- */ void main() { int ntype; int num1; int op; int num2; int ans; printf("何進数で計算しますか? (2 進数〜 16 進数):"); if ((ntype = adicinp()) == -1) { printf("Error!!\n"); return; } printf("1番目の数値:"); if (numinp(&num1, ntype) == -1) { printf("Error!!\n"); return; } printf("演算子は? (+, -, *, /):"); if ((op = opeinp()) == -1) { printf("Error!!\n"); return; } printf("2番目の数値:"); if (numinp(&num2, ntype) == -1) { printf("Error!!\n"); return; } switch (op) { case '+': ans = num1 + num2; break; case '-': ans = num1 - num2; break; case '*': ans = num1 * num2; break; case '/': if (num2 == 0) { printf("\nCan't divide by 0\n"); return; } ans = num1 / num2; } printf("演算結果 (10 進数): %d\n", ans); } /* ----- 関数定義 ----- */ /* キーボード入力を待ち結果を進数で返す */ /* 返り値: -1 でエラー, 正常終了時は真数の値が返る */ int adicinp(void) { int ntype = 0; int ch; while ((ch = getchar()) != '\n') { /* 改行が表れるまでキーボード入力を受け付ける */ if (ch >= '0' && ch <= '9') { /* 数字の範囲内? */ ntype = ntype * 10 + ch - '0'; /* 数字を表す文字を数値に変換 */ } else { return -1; /* 数字以外ならエラー */ } } if (ntype < 2 || ntype > 16) { /* 進数の範囲内? */ return -1; /* 範囲外ならエラー */ } return ntype; /* 進数値を返して正常終了 */ } /* キーボード入力を待ち結果をポインタ num に格納する */ /* 引 数:int *num (変換結果の値が入る), int ntype 進数 */ /* 返り値: -1 でエラー, それ以外は正常終了 */ int numinp(int *num, int ntype) { int ch; int sign = 1; *num = 0; if ((ch = getchar()) == '\n') { /* 最初の 1 文字を読み込む */ return -1; /* 改行 (空入力) ならエラー */ } if (ch == '-') { /* 行頭が '-' か? */ sign = -1; /* それなら後でマイナス化しなきゃ */ ch = getchar(); /* 1 文字読み飛ばす */ } while (ch != '\n') { /* 改行が現れるまで繰り返し */ if (ntype <= 10) { /* 進数タイプが数字で表せれる? */ if (ch >= '0' && ch <= '9' - (10 - ntype)) { /* 進数範囲内の入力? */ *num = *num * ntype + ch - '0'; /* n 進数文字 → 10 進数数値変換 */ } else { return -1; /* 進数範囲外でエラー */ } } else { /* 進数表現にアルファベットが入りそうな処理はこちら */ if (ch >= '0' && ch <= '9') { /* 数字だけ */ *num = *num * ntype + ch - '0'; /* n 進数文字 → 10 進数数値変換 */ } else { if (ch >= 'a' && ch <= 'f' - (16 - ntype)) { /* 進数範囲内のアルファベット? */ *num = *num * ntype + ch - 'a' + 10; /* アルファベット版 n 進数文字 → 10 進数数値変換 */ } else { return -1; /* 進数範囲外でエラー */ } } } ch = getchar(); /* 1 文字取り込んで繰り返し */ } /* 正常に変換できたみたい */ *num *= sign; /* 符号を処理してみる */ return 1; /* 正常終了w */ } /* キーボード入力を待ち結果を文字コードで返す */ /* 返り値: -1 でエラー, + - * / はその文字コード */ int opeinp(void) { int op; op = getchar(); /* キーボードから 1 文字読み込み */ if (op != '+' && op != '-' && op != '*' && op !='/') { /* 四則演算子以外の入力? */ printf("Operator incorrect!\n"); /* それならエラーだよ〜♪ */ return -1; } if (getchar() != '\n') { /* 改行以外の文字が入力されている? */ printf("Operator incorrect!\n"); /* それもエラーだよ (-_-;) */ return -1; } return op; /* 四則演算子を返して正常終了 */ }