0

私は常にユーザーに入力xしてyから結果を計算するように依頼しました。これは非常に簡単な例です:

int main()
{
int x,y;
cout << "Please enter x" <<endl;
cin >> x ;
cout << "please enter y" <<endl;
cin >> y;

int result = x + y ;
cout << result << endl;
return 0;
}

しかし、ユーザーが完全な式を入力するとどうなるでしょうか? たとえば、ユーザーに式とユーザー入力 : を入力するように求める場合、 4+5これを直接計算して結果を出すことはできますか?

4

3 に答える 3

1

Michael Anderson の回答に続き、私のaeフロントエンドを Lua エンジンに使用すると、コードの中心は単純になります。

ae_open();
ae_set("x",x);
ae_set("y",y);
int result = ae_eval("x + y");
ae_close();

もちろん、楽しいのはae_eval、ユーザーが入力した任意の式を含む文字列を取得するときです。

于 2013-02-21T11:07:50.657 に答える
1

車輪の再発明に時間を費やすつもりはありません。ユーザー入力には既存のスクリプト言語を使用し、個人的には lua を選択しますが、他にも多くの言語が実行可能です。

これは、lua をインタープリターとして使用したアプリケーションの大まかな外観です。

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

#include <string>
#include <iostream>


int main()
{
  using namespace std;
  string x,y;
  cout << "Please enter x" <<endl;
  cin >> x ;
  cout << "please enter y" <<endl;
  cin >> y;

  //TODO: You may want to check that they've entered an expression
  //
  lua_State * L = lua_open();

  // We only import the maths library, rather than all the available
  // libraries, so the user can't do i/o etc.

  luaopen_math(L);
  luaopen_base(L);

  // We next pull the math library into the global namespace, so that
  // the user can use sin(x) rather than math.sin(x).
  if( luaL_dostring(L,"for k,v in pairs(math) do _G[k] = v end") != 0)
  {
    std::cout<<"Error :"<<lua_tostring(L,-1)<<std::endl;
    return 1;
  }

  // Convert x to an integer
  x = "return "+x;
  if( luaL_dostring(L,x.c_str()) != 0 )
  {
    std::cout<<"Error in x :"<<lua_tostring(L,-1)<<std::endl;
    return 1;
  }
  int xv = lua_tointeger(L,-1);
  lua_pop(L,1);

  // Convert y to an integer
  y = "return "+y;
  if( luaL_dostring(L,y.c_str()) != 0 )
  {
    std::cout<<"Error in y :"<<lua_tostring(L,-1)<<std::endl;
    return 1;
  }
  int yv = lua_tointeger(L,-1);
  lua_pop(L,1);

  int result = xv + yv ;
  cout << result << endl;
  return 0;
}

これで、 のようなものを入力できます1+sin(2.5)*3

于 2013-02-19T04:10:30.417 に答える
0

中置記法解析アルゴリズムを実装する必要があります。

例えば; http://en.wikipedia.org/wiki/Shunting-yard_algorithm

于 2013-02-18T22:54:14.533 に答える