Cプログラミングの関数電卓のアルゴリズムについてですが、
標準入力からの文字列式を、トークンに区切り、先頭から配列型スタックに格納して、計算を行う処理を考えていて、
a-b-cという処理のアルゴリズムに困っています。
どういった解決策があるのか教えて頂けませんか??
お願いします!!
フローチャートを書くほどの事でも無いと思うので、僕が考えていたアルゴリズムを、文で記載しますが、できれば、このアルゴリズムからどうすれば解決できるかを考えて頂けたらとても助かります!!
1.
別のスタックを用意して、元々のをstack1,コピー用をstack2とし、stack1のトップからstack2に格納。(スタックの構造は二次元文字型配列)
この場合、cからstack2に格納される。
2.
演算子を見つけると、その前後の数字をその演算子によって処理。
この場合なら、c-bという処理。
3.
計算結果を、cが格納されていた、演算子の前に格納。
4.引き続き、この操作を繰り返す。
これを考えてたんですが、実行すると、(c-b)-aという式になり、違う答えが出てしまいます。加算ならば影響はでません。
きちんと(-c-b)+a の処理をさせるにはどうしたら良いかがわからないです。
お願いします!!
※返事が多少遅れるかもしれませんが、すみません!!
No.5ベストアンサー
- 回答日時:
昔ながらの書き方をするとスタックを利用すること自体は
おかしいことではないと思いますよ。
この場合、どちらかといえば「2.」がおかしいんじゃないかなと思います。
まぁ二次元配列じゃなくて一次元配列にして、
二次元の部分は再帰呼び出しを使うべきなのかなーとは考えますが~
このへんは好みなんですかね?
昔つくったやつはこんな感じだったかな。。。
1. ()を探して ()の内部で再帰呼び出し
2. 単項1 演算子1 単項2 演算子2 続き に分離
3. 単項1 と 演算子1をスタック
4. 演算子1 が */ なら 単項2と演算してスタック
5. 演算子1 が +- なら そのままスタック
6. 終端まで来たらたまっているスタックを先頭から演算
7. 答えの返却
ん~もうすこし複雑だったかも
ありがとうございます。
確かにこの方針は学校の授業でほのめかされたやり方なんですが、
教授陣は年配の方達なので、その影響が出てるんだと思います!!
二次元配列は単純にわかりやすさですかね。。
かなりわかりやすいです。
是非使わせてもらいます!!
No.6
- 回答日時:
>APL とか J なら「おしりから処理する」のは合理的なんですけどねぇ
他の言語の話をここで持ち出されましてもねぇ。
プログラミング言語に関する造詣が深いらしいことだけはわかりました。
>RPN にするのはちょっと中途半端感がただようんじゃないかな. 解析しつつ計算しちゃうか, 木構造を作ってから計算するか, どっちかではないかと.
数式の木を作ってから、行きがけだか通りがけだか帰りがけだかで探索すると
RPNになるという話をどこかで聞いたことがあったようななかったような。
まあ、あれですね、元の質問者さんが目指している「関数電卓」と
「a-b-cで悩んでいる」こととの間には相当隔たりがあるように思います。
まずは、(カッコを含んだ)四則演算を正確に実行できる
「四則演算電卓」を作成して、それを改良していく、というのが
早道ではないかなとも思います。
ありがとうございます。
指数、括弧も含める四則演算に関してですが、すでに減算以外は完成しています。
なので、後には退けなくなってしまったのです。。
No.4
- 回答日時:
APL とか J なら「おしりから処理する」のは合理的なんですけどねぇ>#3. それでも a-b-c = a-(b-c) だから, やっぱりおかしい.
もともと最初の「スタック」は何を意図したものなんだろう.
RPN にするのはちょっと中途半端感がただようんじゃないかな. 解析しつつ計算しちゃうか, 木構造を作ってから計算するか, どっちかではないかと.
スタックは解析処理のためのものです。頭から一文字ずつ解析していこうと、
そういう手法で処理するためのものです。
このアルゴリズムはとんでもない失敗みたいですね…
No.2
- 回答日時:
私も「考え直す」ことを強くお勧めします.
多分, このままいくと加減算だけならまだしも乗除算が入ったりするとごっちゃごちゃになるでしょう. 「数式の処理」というのはコンパイラやインタプリタでは基本的なものですから, そっちの方で調べてみる方がいいと思います.
ありがとうございます。
でもすでに、加算、乗算、除算、指数演算、括弧内の項の演算のプログラムは
このアルゴリズムで完成させてしまっているので、後に退けない状態となっております。
確かに500行くらいの面倒なプログラムになってしまってますが。。
No.1
- 回答日時:
>1.
>別のスタックを用意して、元々のをstack1,コピー用をstack2とし、stack1のトップから
>stack2に格納。(スタックの構造は二次元文字型配列)
>この場合、cからstack2に格納される。
このロジックは本当に必要でしょうか。
考え直した方がいいと思います。
ありがとうございます。
そのような回答がもらえることも予測していました。
しかし、すでに加算、乗算、除算、括弧内の項の演算、指数演算について、
このアルゴリズムで完成させたため、後に退けない状態になっております。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
printf / sprintf のスタック消...
-
最大スタックサイズを大きくす...
-
_CRTIMPの意味は?
-
スタックフレームの消滅
-
スタックの伸張方向
-
エラー?メッセージ
-
スタックとキューの使い所
-
CASLとCASL2の違いについて
-
逆ポーランド記法
-
キューとスタックの問題です、...
-
再帰関数を使うとき、ソフトウ...
-
pthreadのスタックサイズ設定取...
-
再帰処理を非再帰処理に書き換...
-
二分探索木の行きがけ順走査
-
gccでスタックサイズを変更する...
-
スタックのpush/pop動作について
-
スタックを用いて整数配列を入...
-
ゆゆにゃ。
-
スタック領域変更
おすすめ情報