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で質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- その他(プログラミング・Web制作) Pythonでこのプログラミングを作成するには 2 2022/10/25 21:19
- その他(プログラミング・Web制作) プログラミングって本来数学的な計算をする為のものではないのですか? 学校で配られたFortran90 11 2022/08/25 22:14
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- 数学 「FFTの基本は、DFTはサンプル数Nが偶数なら 2つのDFTに分解できるということ。 分解するとD 3 2022/03/31 21:01
- 高校 有効数字計算 確定した値を含む 2 2023/01/18 06:03
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GCCで関数の引数が渡らない
-
スタック領域変更
-
コンパイラオプション
-
関数呼び出しでのスタック消費量
-
スタックフレームの消滅
-
VC++でプログラムから現在のス...
-
関数のプロローグとエピローグ...
-
CASLとCASL2の違いについて
-
VB.netでDLLを読み込んで実行す...
-
プログラムの規模を表す単位「k...
-
ubuntuで デイスク/deb/loopと...
-
ステップ数について
-
パソコンでインターネット接続...
-
ステップ数??
-
エクセルのHLOOKUP関数の検索範...
-
パソコン初心者がキーボードを...
-
コンパクションとガーベジコレ...
-
AutoCAD LTの中古。
-
VB6.0で #の意味
-
ライン数とステップ数の違いに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
最大スタックサイズを大きくす...
-
printf / sprintf のスタック消...
-
gccでスタックサイズを変更する...
-
スタックの伸張方向
-
エラー?メッセージ
-
スタックフレームの消滅
-
_CRTIMPの意味は?
-
スタックを用いて整数配列を入...
-
コンパイラオプション
-
関数のプロローグとエピローグ...
-
GCCで関数の引数が渡らない
-
Bluetoothアダプタとスタックソ...
-
これで最後、スタックの問題です…
-
H8マイコン スタック領域に...
-
Ethernetヘッダの取得 NDIS
-
スタックとキューの使い所
-
関数呼び出しでのスタック消費量
-
スタック領域変更
-
スタックとキュー
おすすめ情報