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

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;
};

가 더 낫겠지요. :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.