0

我必须在 C 中实现一个计算器。它有 3 个参数(int、char、int),其中 char 可以是 +、-、x 或 /。我必须使用指向 4 个相应函数(例如 plus(int x, int y))的跳转表来实现计算器。我知道如何访问跳转表中的函数,但我不能使用 switch 语句或多个 'if' 来选择适当的函数。我得到一个提示,string.h 中有一个函数可以用来解决这个问题。

tl; dr:如何使用 string.h 中的函数将 4 个不同的字符转换为从 0 到 3 的索引,而不使用 switch 或 if?

4

4 回答 4

3

strchr()功能。

// Call with oper = '+', '-', 'x' or '/'.
unsigned int op_to_index(char ch)
{
  const char *ops = "+-x/";

  return strchr(ops, op) - ops;
}
于 2013-11-11T14:35:52.953 回答
0

您可以创建一个数组,然后使用 for 循环在其中搜索相应的字符。但是在机器代码方面,这与开关完全相同,因此没有多大意义。

const char OPERATORS[] = 
{
  '+', 
  '-', 
  '*', 
  '/'
};

bool calculate (int x, char symbol, int y)
{
  bool valid = false;
  int i;

  for(i=0; i<sizeof(OPERATORS); i++)
  {
    if(symbol == OPERATORS[i])
    {
      valid = true;
      break;
    }
  }

  if(!valid)
  {
    return valid;
  }

  operator_func[i](x, y);

  return valid;
}

(上面唯一比开关更有效的地方是当有很多运算符并且您以排序顺序(按ASCII值)存储它们时。然后您可以进行二进制搜索而不是线性搜索for 循环。但是对于这几个运算符,这种搜索函数调用的开销只会减慢程序的速度。)


上面的好处是可以和函数指针表合并,得到更加面向对象的设计:

// the above rewritten with a bit of OO design:

typedef void(*operator_func_t)(int , int y);

typedef struct
{
  char             symbol;
  operator_func_t  func;
} operator_t;

...

void add (int x, int y);
void subtract (int x, int y);

...


operator_t OPERATORS[] = 
{
  {'+', &add},
  {'-', &subtract},
  {'*', &multiply},
  {'/', &divide}
};
于 2013-11-11T15:05:54.460 回答
0

你自己的跳台呢?

typedef int (*calcfun)(int,int) ;

int plus(int,int) ;
int minus(int,int) ;
int mul(int,int) ;
int div(int,int) ;

calcfun fun[256] ;

void init(void)
{
    fun[(int) '+'] = plus ;
    fun[(int) '-'] = minus ;
    fun[(int) '*'] = mul ;
    fun[(int) '/'] = div ;
}

void (void)
{
     init() ;
     ...
     if (fun[symbol]) 
          result = fun[symbol](x,y) ;
     else printf("invalid op '%c'\n",symbol) ;
}
于 2013-11-11T18:21:11.437 回答
-1

这是一个提示...

我假设您可以拥有一个数组,其中包含与“+”、“-”、“x”或“/”的 ascii 值一样多的元素,以最高者为准……

于 2013-11-11T14:43:03.037 回答