
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
最大スタックサイズを大きくす...
-
VC++でプログラムから現在のス...
-
VB.netでDLLを読み込んで実行す...
-
printf / sprintf のスタック消...
-
CASLとCASL2の違いについて
-
プログラムの規模を表す単位「k...
-
パソコンでインターネット接続...
-
ubuntuで デイスク/deb/loopと...
-
ライン数とステップ数の違いに...
-
ステップ数について
-
Excel VBA マクロ処理 リンク先...
-
ネットワークアイコンが黄色三...
-
「下士官に告ぐ」って公の発表...
-
ブラインドタッチって練習し始...
-
タイピングソフトおすすめは?
-
ワープロ検定一級 を受けようと...
-
SP領域とはなんですか?
-
ソフトウェアブレークで停止し...
-
第一級陸上特殊無線技士
-
トランザクションとは何のこと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
最大スタックサイズを大きくす...
-
VB.netでDLLを読み込んで実行す...
-
逆ポーランド記法
-
printf / sprintf のスタック消...
-
cloneのスタック管理
-
VC++でプログラムから現在のス...
-
H8マイコン スタック領域に...
-
ヘッドセットとスカイプとBluet...
-
Visual C++ 2008 オーバーフロ...
-
スタック領域変更
-
gccでスタックサイズを変更する...
-
二分木について
-
WINDOWSなどのOSを構成している...
-
スタックを用いたプログラム
-
スタックモジュール
-
VC6でコンパイルでスタックの領...
-
pthreadのスタックサイズ設定取...
-
GCCで関数の引数が渡らない
-
基本情報技術者のデータ構造あ...
-
スタックとキューについて
おすすめ情報