• 締切済み

C言語で逆ポーランド演算式をスタックを用いて表現するには

C言語でスタックを使って逆ポーランド表記の演算を行うプログラムを作っています。 正の整数の場合はできたのですが、小数や負の数にも対応できるように変えるにはどうしたらよいのでしょうか? 例えば、スペースで区切られた 1.2 4.2 -3.2 + * と言う様な値を入力してちゃんと計算できるようにしたいのですが・・・。

みんなの回答

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

符号の - と引き算演算子の -に同じ文字(-)を使っているとうまく作れません。 -の直後に数字が来れば負の数、空白が来れば引き算演算子、というような制約条件でいいのなら、楽に作れます。 まず、何故自力で出来ないのかを説明しないと、うまく助言できないと思いますよ。プログラム構造的には、正の整数でできればもう完成したも同然なので。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

今どんな感じでやっているのか ソースを補足してください。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

基本的な部分はできているわけですよね? とりあえず数値の読み取り部分を strtod などでやってやれば 小数でも符号付のものでも問題なく解析できると思いますが (今現在どうやってるのかわかりませんけど)。 後はスタックへの積み幅が変わりますが、どの辺で詰まっているのでしょう? あー、小数と整数が混在するからそこで引っかかっている?

関連するQ&A

  • C言語のリスト、スタック、キュー、逆ポーランド法など

    リスト、スタック、キュー、逆ポーランド法などプログラム例ののったサイト知りませんか?どうしてもわからないのですどうか教えてください。

  • 逆ポーランド記法

    電卓もどきのアルゴリズムを教えて下さい 指定された数式を解読して、演算結果を求める処理を作成したいのですが・・・・ 今考えている手順は (1) 数式を解析して 逆ポーランド記法の中間言語にして於いておく (2) 逆ポーランド記法の中間言語を演算して答えを求める と考えているのですが・・・ << 例 >>  演算式 1+2×3=    答え 7  演算式 (1+2)×3=  答え 9 大昔の知識ですのでもっとシンプルな方法が有りましたらアドバイス頂けませんでしょうか?

  • 電卓ソフトを作るには逆ポーランド法で良いのですか?

     プログラミングの勉強をしながら式入力型の電卓を作りたいと思い調べたところ「逆ポーランド法」を知りました。  まず四則演算出来るものを作り最終的には関数電卓を目指そうと思っているのですが、この「逆ポーランド法」を取り入れた計算プログラムを学べば良いのでしょうか?もっと適している他の手法はありますか? 公開されている式入力型の電卓ソフトはどのような手法でプログラムされているのでしょうか?(なかなか式入力型のサンプルが見つからなくて…。)  言語はActiveBasicを使用していますが、情報が少ない為VisualBasicのサイトで勉強しています。 宜しくお願いいたします。

  • C言語・スタックを使用した逆ポーランド記法について

    C言語でスタック(リスト構造)を使用した逆ポーランド記法のプログラムを作りたいのですが 計算式(例:1234+*+)が入力された場合、どのようにして数字と演算子を区別すればいいのでしょうか? 一応スタック構造の部分は、 #include <stdio.h> #include <stdlib.h> /*スタック構造*/ typedef struct stack { int max; int ptr; int *stk; } Stack; /*スタックの確保・初期化*/ int StackAlloc(Stack *s, int max) { s->ptr = 0; if ((s->stk = calloc(max, sizeof(int))) == NULL) { s->max = 0; return (-1); } s->max = max; return (0); } /*スタック解放*/ void StackFree(Stack *s) { if (s->stk != NULL) { free(s->stk); s->max = s->ptr = 0; } } /*プッシュ*/ int StackPush(Stack *s, int x) { if (s->ptr >= s->max) return (-1); s->stk[s->ptr++] = x; return (0); } /*ポップ*/ int StackPop(Stack *s, int *x) { if (s->ptr <= 0) return (-1); *x = s->stk[--s->ptr]; return (0); } /*データのピーク*/ int StackPeek(const Stack *s, int *x) { if (s->ptr <= 0) return (-1); *x = s->stk[s->ptr - 1]; return (0); } /*スタックの大きさを返却*/ int StackSize(const Stack *s) { return (s->max); } /*データを返却*/ int StackNo(const Stack *s) { return (s->ptr); } /*スタックは空か*/ int StackEmpty(const Stack *s) { return (s->ptr <= 0); } /*スタックは満杯か*/ int StackFull(const Stack *s) { return (s->ptr >= s->max); } /*スタックを空にする*/ void StackClear(Stack *s) { s->ptr = 0; } といった感じで仕上げています。

  • C言語の余剰演算子について

    読みにくい文章ですみませんでした 学校の課題(C言語)で 書いてある数字の奇数、偶数、負の数を調べて、それぞれの数をだせ という課題で負の数は0以下を++でカウントしていくのは調べてわかったのですが、 奇数偶数を調べるときに「余剰演算子」「%」を使って調べるみたいなのですが、 学校の講義で余剰演算子を習ってないのに使うのはだめだと思うので、 余剰演算子を使わずに余りを出して、奇数・偶数を調べるのはどうすればいいのか教えてください。

  • ポーランド記法、逆ポーランド記法のプログラム

    ポーランド記法、逆ポーランド記法のプログラムがわかる方、是非教えてくださいm(__)m 言語は何でもいいのでお願いします~

  • c言語でのプログラミング

    キーボードから複数個の正整数値を読み込み,合計値と平均値(小数第1位まで)を表示するプログラムを作りなさい。 ただし入力数値の個数はプログラミング時には決定していない。 負整数が入力されたら入力値はもうなくなったと判断することとし,負の数は計算には使用しないこととする。またデータは少なくとも1つは入力されるものとする。(p02ex15.c) 検証は1から10までの数字すべてを与え,合計値55,平均値5.5が表示されることを確かめること。 (「1,2,3,4,5,6,7,8,9,10,-1」(-1はデータ終わりの合図)を入力して確かめなさい。) また,1から5までの数字すべてを与え,合計値15,平均値3が表示されることを確かめること。 (「1,2,3,4,5,-1」(-1はデータ終わりの合図)を入力して確かめなさい。) このプログラムのソースコードを教えて下さい。 解説もよろしくお願いします。

  • 逆ポーランド記法

    C言語で逆ポーランド記法への変換をしようとしています. 演算子の優先順位の付け方がわかりません. 構造体の配列に数式を入れて,それぞれに優先度をつけてみたりしたのですが,いい方法でないように思います. 適切な方法を知っている方よろしくお願いします.

  • C言語の四則演算

    C言語で次のようなプログラムを作りたいのですが ソースを教えていただけないでしょうか? 四則演算のみの計算式を標準入力から受け取り計算式の通りに計算を行い計算式と答えを標準出力に出力する どなたか教えてください

  • C言語による演算時の誤差について

    C言語初心者でどなたかご教授お願いします。 小数点の演算を行うわけではないのですが、 演算を行う数値が大きすぎるために、double型を使用して以下の計算を行うつもりです。 計算結果はlong型(小数点以下切り捨て)です。 double a,b,c; long x; x = (long)((a*b/c/100) 例)  x=(long)((189000*105000/100000)/100) 上記のような計算を行った際でも誤差が発生する可能性があるのでしょうか?