반응형

프로그램을 짜다 보면 하드코딩이 아닌 사용자가 입력한 텍스트로 수식을 계산해야 하는 경우가 종종 있다.


계산식이 하드코딩(hard coding)으로 짜면 매우 편하지만 계산식이 하나로 정해져있지 않거나 상황에 따라서 변경되는 경우에는 한계가 있다.


사용자가 정의한 수식은 텍스트 형태로 저장되므로 이를 파싱(parsing)하는 작업은 그리 어려운 작업은 아니다. 물론 4칙연산의 경우엔..



사용자가 입력한 수식에 x^2꼴이나 제곱근(√), 로그함수, 지수함수 등이 들어있으면 모두 대응하기가 어렵다.


따라서 개발 시간 단축과 스트레스 감소를 위해 관련 라이브러리를 사용하기로 한다.


관련된 라이브러리는 구글링하면 다양하게 나온다.


내가 선택한 라이브러리는 바로 muparser이다. 무엇보다 MIT라이센스로 사용에 별도의 제한이 없기 때문이다.


사용법은 여타 외부 라이브러리와 같다.


VS 프로젝트에 추가하고, include로 땡겨서 사용하면 된다.


예제에 나온 코드도 매우 심플하다.


#include 
#include "muParser.h"

// Function callback
double MySqr(double a_fVal) 
{ 
  return a_fVal*a_fVal; 
}

// main program
int main(int argc, char* argv[])
{
  using namespace mu;

  try
  {
    double fVal = 1;
    Parser p;
    p.DefineVar("a", &fVal); 
    p.DefineFun("MySqr", MySqr); 
    p.SetExpr("MySqr(a)*_pi+min(10,a)");

    for (std::size_t a=0; a<100; ++a)
    {
      fVal = a;  // Change value of variable a
      std::cout << p.Eval() << std::endl;
    }
  }
  catch (Parser::exception_type &e)
  {
    std::cout << e.GetMsg() << std::endl;
  }
  return 0;
}

DefineVar : 수식에 존재하는 a라는 문자를 fVal 값으로 정의

DefineFun : 수식에 존재하는 MySqr이라는 문자를 위에 정의한 Mysqr함수로 정의

SetExpr : 텍스트 형태의 수식. 여기에 수식을 입력하면 된다.

Eval() : 수식 계산


예제코드 조금만 보면 금방 응용이 가능하다.


그리고 반드시 try ~ catch 구문을 추가하여 올바르지 않은 수식이 들어왔을 경우 예외처리를 해주자.

+ Recent posts