前提・実現したいこと
スタックに関する演習として,逆ポーランド記法による簡単な電卓プログラムを作成したいです。
プログラムでは,逆ポーランド記法で記述された計算式に対して,以下の処理を行うことで,計算結果を表示します。
• 数字であればスタックに積む.
• 四則演算子(+, −, ∗, /)であれば,2 つの数をスタックから降ろして演算を行い,その結果を再びスタックに積む.
下記プログラムの switch 文内の処理をコメントをもとに補完し,逆ポーランド電卓のプログラムを完成させたいです。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
エラーメッセージ ```65+ Stack underflow 答えは 65 です. Stack underflow 答えは 0 です. 75+64-*3/ Stack underflow Stack underflow 浮動小数点例外 (コアダンプ) ### 該当のソースコード ```ここに言語名を入力 /* * ------------------------------------------- * スタックを用いた逆ポーランド電卓 * * ------------------------------------------- */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_SIZE 100 // スタック・サイズ long stack[STACK_SIZE]; // スタック int pointer; // スタック・ポインタ // プロトタイプ宣言 void init(void); // スタックを初期化する関数 void push(long); // スタックに要素を積む関数 long pop(void); // スタックから要素を取り出す関数 int main(void) { int c; long x, a, b; init(); while ((c = getchar()) != EOF) { if (isdigit(c)) { ungetc(c, stdin); // 入力ストリームに文字(数字)を戻す scanf("%ld", &x); // 改めて,その数字を変数xに入力させる push(x); } else { switch(c) { /* すべての四則演算において, 一番上の数をスタックから降ろしてbに代入, 次の数をスタックから降ろしてaに代入 */ case '+': // スタックからb,aの順番で降ろし, a + bをスタックに積む /* ここにコードを記述.一文とは限らない */ a=pop(); b=pop(); push(a+b); break; case '-': // スタックからb,aの順番で降ろし,a - bをスタックに積む /* ここにコードを記述.一文とは限らない */ a=pop(); b=pop(); push(a-b); break; case '*': // スタックからb,aの順番で降ろし,a * bをスタックに積む /* ここにコードを記述.一文とは限らない */ a=pop(); b=pop(); push(a*b); break; case '/': // スタックからb,aの順番で降ろし,a / bをスタックに積む /* ここにコードを記述.一文とは限らない */ a=pop(); b=pop(); push(a/b); break; case '\n': printf("答えは %ld です.\n", pop()); init(); break; case ' ': case '\t': break; default: printf("不正な文字がありました.もう一度入力してください\n"); while ((c = getchar()) != EOF && c != '\n'); break; } } } } void init() { // スタックを初期化する関数 pointer = 0; } void push(long x) { // スタックにデータを積む関数 if (pointer >= STACK_SIZE) printf("Stack overflow\n"); else stack[pointer++] = x; // スタックにxの値を積み,ポインタを更新 } long pop() { // スタックからデータを降ろす関数 if (pointer <= 0) { printf("Stack underflow\n"); return 0; } else return stack[--pointer]; // スタックの一番上の数を返し,ポインタを更新 } nao
試したこと
x=a+bと置き換えてみたり書き換えを何度か行いましたが変わりませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/14 12:48
2021/06/14 13:03