수식해석기(및 실행기) 제작시 데이터 타입에 따른 연산자 처리.

raivalor의 이미지

C언어를 이용해 커맨드라인상에서 사용자로 부터 간단한 수식을 입력받고 이를 실행하는 코드를 작성중입니다.(using C. c++아님!!)

고민되는것이 하나 있는데.. 예를 들어 '+' 연산의 경우 피연산자의 데이터 타입별로 크게 4가지(int와 float만 있다고 가정) 연산 형태가 가능합니다.

가장 단순한 방법으로 각 경우의 수 별로(case by case) 코드들을 다 만들어 주면 되겠지요.

int addii(int op1, int op2);
float addff(float op1, float op2);
float addif(int op1, float op2);
float addfi(float op1, int op2);

그러나 위와 같이 단순한 방법은 데이터 타입이 추가될때마다 그 경우의 수가 엄청나게 늘어나게 되니까... 그리 좋은 방법이 아닌것 같아요.

뭔가 세련된 방법이 있지 않을까.. 생각이 듭니다. (저는 모르겠지만.)

비슷한 경험 하신분들.. 어떤 솔루션이 있을까요?

cocas의 이미지

raivalor wrote:
C언어를 이용해 커맨드라인상에서 사용자로 부터 간단한 수식을 입력받고 이를 실행하는 코드를 작성중입니다.(using C. c++아님!!)

고민되는것이 하나 있는데.. 예를 들어 '+' 연산의 경우 피연산자의 데이터 타입별로 크게 4가지(int와 float만 있다고 가정) 연산 형태가 가능합니다.

가장 단순한 방법으로 각 경우의 수 별로(case by case) 코드들을 다 만들어 주면 되겠지요.

int addii(int op1, int op2);
float addff(float op1, float op2);
float addif(int op1, float op2);
float addfi(float op1, int op2);

그러나 위와 같이 단순한 방법은 데이터 타입이 추가될때마다 그 경우의 수가 엄청나게 늘어나게 되니까... 그리 좋은 방법이 아닌것 같아요.

뭔가 세련된 방법이 있지 않을까.. 생각이 듭니다. (저는 모르겠지만.)

비슷한 경험 하신분들.. 어떤 솔루션이 있을까요?

만드려는 프로그램의 용도가 어느정도냐에 달린 문제입니다. 제대로 수치 해석을 하기 위한 프로그램이라면 구조체를 사용해서 직접 정확도와 한계를 제어할 수 있습니다. 대강 계산하기 위한 용도라면 입력되는 숫자를 전부 double로 간주하시면 됩니다. 제 짐작으로는 첫번째 방법까진 사용하지 않아도 될 것 같습니다. 혹시 높은 정확도가 필요한 프로그램을 만들고 계시다면 Numerical Recipes in C 책을 꼭 보세요. :)

M.W.Park의 이미지

학습이 목적이라면, 아래 링크된 컴파일러책의 앞부분을 보시는 것도 좋을것같습니다만, 실무에 적용하실것이라면 다른 유용한 소스가 많을것입니다.
http://kangcom.com/common/bookinfo/bookinfo.asp?sku=199709080001

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

익명 사용자의 이미지

C++에서 하는 것처럼 하면 됩니다. 다만, 연산자 오버로딩은 프로그래머가 직접 처리해 주어야 겠지요.

struct Operand { int type; int i; float f; ... };

void add(Operand * sum, Operand *a, Operand * b)
{
if ( a->type == INT && b->type == INT ) { addii(sum, a, b); }
if ( a->type == INT && b->type == FLOAT ) { addif(sum, a, b); }
if ( a->type == FLOAT && b->type == INT ) { addif(sum, b, a); }
if ( a->type == FLOAT && b->type == FLOAT ) { addff(sum, a, b); }
}

익명 사용자의 이미지

struct Operand { int type; int i; float f; ... };

틀렸군요.

typedef struct Operand__ { int type; int i; float f; ... } Operand;

cinsk의 이미지

struct Operand {
  int type;

  union {
    int i;
    float f;
    ...
  } v;
};

가 더 낫겠지요. :)