質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

Q&A

解決済

2回答

3358閲覧

逆ポーランド記法による簡単な電卓プログラムを作成したいです。

Na_ma6565

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

0グッド

1クリップ

投稿2021/06/14 11:25

前提・実現したいこと

スタックに関する演習として,逆ポーランド記法による簡単な電卓プログラムを作成したいです。
プログラムでは,逆ポーランド記法で記述された計算式に対して,以下の処理を行うことで,計算結果を表示します。
• 数字であればスタックに積む.
• 四則演算子(+, −, ∗, /)であれば,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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

75+64-*3/

  • のとこで underflow 起こすんじゃないですか?
  • は ふたつ pop し、加えたコタエを push するんだけど、ふたつ pop できんから。

投稿2021/06/14 11:32

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Na_ma6565

2021/06/14 12:48

すみません。 どのように修正すれば良いでしょうか。
episteme

2021/06/14 13:03

(7+5)*(6-4)/3 をやらせたいんなら 各数を空白で区切って入力せんならんのでは?
guest

0

ベストアンサー

65+ という入力では 65 に何を足すんですか?
6 と 5 を足すんだったら、
6 5 + と入力しなければならないことがコードから分かりませんか?

また、引き算と割り算は a と b が逆です。

投稿2021/06/14 12:56

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Na_ma6565

2021/06/14 13:13

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問