使用数学运算作为输入

时间:2014-11-13 20:31:48

标签: c

让我们说我希望从用户那里收到两个数学运算(例如+ - %)并相应地计算数字。我们还说我可以使用一个 if/else语句来确定优先级(并且所有操作都有不同的优先级)。

我有几个想法用于实施,并希望得到关于哪些被认为是更好的反馈"编码(更清晰,更有效等)。

  1. 我可以这样做:

    if (firstOperator >= secondOperator){
        switch (firstOperator){
            case '+':
                switch (secondOperator)
                    // insert all 6 possible cases
            case '-':
                switch (secondOperator)
                    // insert all 5 possible cases
            ...
            ...
    }
    else{
        // same idea as above
    }
    
  2. 或者我可以通过为switch的每个选项创建一个firstOperation来简单地对所有选项进行硬编码,并在每个switch中嵌套第二个cases对于所有可能的secondOperation

  3. 这两种方法不同,我还有一两种方法。我原以为第一个更正是"正确"优雅,但它实际上导致更多的代码行而不是"蛮力"全力以赴的第二选择。

    我很想听到关于这种编码的任何意见。

    注意:我只谈论非常基本的C编程(即不使用其他数据结构,如堆栈等。只需基本的if/elseswitchloops等。

1 个答案:

答案 0 :(得分:1)

这是我如何做到的,但这取决于你的第一次和第二次操作是独立处理的(如果你正在做的是一个表达式评估器,我认为这应该是可能的)。在我的例子中,我假设有一个队列持有按解析顺序解析的参数。

if (firstOperator >= secondOperator) {
    handle(firstOperator);
    handle(secondOperator);
} else {
    // Assuming something like 1 + 2 * 3, with 1 2 3 in the queue:
    //
    // tmp = dequeueArg() makes the queue: 2 3
    // handle('*')        makes the queue: 6
    // pushFront(tmp)     makes the queue: 1 6
    // handle('+')        makes the queue: 7
    //
    int tmp = dequeueArg();
    handle(secondOperator);
    pushFront(tmp);
    handle(firstOperator);
}

void handle(Op operator)
{
    int x = dequeueArg();
    int y = dequeueArg();

    switch (operator) {
        case '+': pushFront(x+y); break;
        case '-': pushFront(x-y); break;
        case '*': pushFront(x*y); break;
        case '/': pushFront(x/y); break; // Maybe check for 0
        case '%': pushFront(x%y); break; // Maybe check for 0
        case '&': pushFront(x&y); break;
        etc...
    }
}

我在这里写的内容可能不适用于具有优先权的通用中缀解析器。它是一个如何不使用O(N ^ 2)嵌套的case语句的例子。