/*----------------------------------------------------------------------------- C課題 逆ポーランド電卓プログラム '2003.09.20 -----------------------------------------------------------------------------*/ #include #include #define STACK_SIZE 100 // スタックの最大値 double stack[STACK_SIZE]; // 値のスタック int sp = 0; // スタックポインタ /*---- スタックに値をPUSHする -----------------------------------------------*/ void push(double x) { if (sp < STACK_SIZE) { // スタックポインタが最大値未満の場合 stack[sp++] = x; // スタックに値をPUSHする } else { printf("スタック・オーバフロー!\n"); sp = 0; } } /*---- 値をスタックからPOPする ----------------------------------------------*/ double pop() { if (sp > 0) { // スタックに値があれば return stack[--sp]; // 値をスタックからPOPする } else { printf("スタックに値はありません!\n"); sp = 0; return 0; } } /*---- 逆ポーランド電卓プログラム -------------------------------------------*/ main() { int c; long x; double a, b; printf("逆ポーランド電卓プログラム\n"); printf("(3+2)*(15/3)=25 は 3 2+15 3/* と入力して下さい!\n"); while ((c = getchar()) != EOF) { if (isdigit(c)) { // 入力文字が数字の場合 ungetc(c, stdin); // 入力文字を再度入力ストリームに戻す scanf("%ld", &x); // 数値を入力し // printf("x=%ld ",x); // (debug) push(x); // PUSHする } else { // 入力文字が数字でない場合 switch (c) { case '+': // + の場合 b = pop(); // a = pop(); // push(a + b); // 2つの値をPOPし、加算する break; case '-': // - の場合 b = pop(); // a = pop(); // push(a - b); // 2つの値をPOPし、減算する break; case '*': // * の場合 b = pop(); // a = pop(); // push(a * b); // 2つの値をPOPし、乗算する break; case '/': // / の場合 b = pop(); // a = pop(); // if (b!=0) { push(a / b); // 2つの値をPOPし、除算する } else { printf("0以外の数値を入力して下さい!\n"); } break; case '\n': // リターンキーで答えを計算する printf("答えは%7.2fです\n", pop()); break; case ' ': // 空白と case '\t': // タブは読み飛ばす break; default: // それ以外はエラー printf("数値を入力して下さい!\n"); sp = 0; break; } } } }