電子書籍の厳選無料作品が豊富!

C++について質問があります。
コマンドライン上に4+(1+2*3)-2といった式を書き
それを計算するプログラムを作りたいのですが、
どう書けばいいのかわらりません。

わかる方教えていただけないでしょうか?
お願いします。

A 回答 (4件)

「数式の評価」というのは、正攻法でやるとなると、結構難易度が高い問題です。


初めて手をだすなら、再帰下降解析ぐらいが簡単だと思いますが、
コードの記述は結構単純ですが、「それでどうして式が計算できるのか」を理解するのはなかなか難しかったりします。

再帰下降解析の解説
http://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0% …

C++ での記述例
http://www.prefield.com/algorithm/string/parser. …
    • good
    • 0
この回答へのお礼

なるほどです、ありがとうございました。
snowizeさんの回答と合わせてようやく
理解できました。
この度はありがとうございました。

お礼日時:2008/10/15 22:04

正攻法はすでに回答が出ているとおりですので、イカサマ的手法も紹介しておきましょう。



#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

int main()
{
 std::string expr;
 std::getline(std::cin, expr);

 std::ofstream ofs("sub.cpp");
 ofs << "#include <iostream>\nint main() { ";
 ofs << "std::cout << (" << expr << ") << std::endl;\n}" << std::endl;
 ofs.close();

 std::system("g++ -o sub sub.cpp; ./sub");
 return 0;
}

GCC限定になりますが、上記のようにしても計算させることはできます。
    • good
    • 0
この回答へのお礼

なるほど、ありがとうございます。
正攻法でもできるように調べてみます。

お礼日時:2008/10/15 13:34

あは。

高2のときの課題で出て泣きながら頑張った記憶があります。
前段階として「逆ポーランド記法で計算できる電卓」を作成して、追って「普通の数式を逆ポーランド記法に書き換えるソフト」を作ってみるのがいいかもしれません。
まどろっこしいかもしれませんが、「43+5*2」を「43 + 5 * 2」と適切に分解することができるかどうかが肝なので、最初はスペースを区切り文字として使うなどして、段階的に処理をしていくと結果的には早いかも。
余談ですが、括弧は再帰処理すればいいだけなので、あんまり難しく考えなくてもいいです。開きと閉じの数が一致してるかだけはチェック。
    • good
    • 0
この回答へのお礼

ありがとうございました。
mataka2さんとあわせて
理解できました。

お礼日時:2008/10/15 22:06

言語処理系の基礎なので、構文解析とか字句解析などを


調べてみてください。

またはbison, yacc, boost::spiritなどのツール名で
検索するとサンプルが見つかるかと思います。
# 四則演算程度であれば手書きでも十分ですが。

この手の処理は実は結構敷居が高いものと思いますが、
分かってしまえばさほどでもないかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
理解できました。
この度は回答してくださりありがとうございました

お礼日時:2008/10/15 21:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!