【问题标题】:Simple calculator in c with bracketsc中带括号​​的简单计算器
【发布时间】:2014-06-07 13:20:50
【问题描述】:

我尝试用 c 语言制作简单的计算器,支持带括号的 +、-、* 和 / 运算符。例如((2.1 - 5.6)*4)+(2.8+2 / 2.2) 应该是-10.29...我试过这样但它只适用于没有括号。如果用户的输入包含括号,我不知道如何处理。

float calc(void)
{
    float x,y, parse;
    char c;

    int test = scanf("%f %c %f", &x,&c,&y);
    if (test == 0){ // if '(' starts equation
        parse = calc();
        }

    else{
        if (c == '-'){
            return x - y;
        }
        else if (c == '/'){
            return x / y;
        }
        else if (c == '+'){
            return x + y;
        }
        else if (c == '*'){
            return x * y;
        }
    }
}

【问题讨论】:

  • 你必须把它分解成两个问题:1)找到所有的括号,将它们配对,找到它们最里面的内容; 2) 评估这些内容。它变成了一个递归代码——详细解释这一点的范围超出了 StackOverflow 的范围。
  • 您没有按正确的优先级进行数学运算。通过Shunting-yard算法将其转换为RPN并计算

标签: c calculator brackets


【解决方案1】:

这里有算法: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

顺便说一句,您使用的称为中缀表示法。该算法似乎要做的是将其转换为后缀表示法(这更容易计算,因为您只需要一个堆栈)。

另外,为了好奇,旧的计算器使用后缀表示法(还有一些编程语言仍在使用它)所以,要计算 3+5,你写 3 5 +

【讨论】:

    【解决方案2】:

    你不能用这种简单的方法解一个用括号复杂的方程。您必须遵循一些算法。在某些计算器中使用的其中之一是 Reversed Polish Notation,您可以在其中将等式转换为特定形式,然后使用堆栈开始推送和弹出来进行计算,同时考虑优先级。 p>

    Link to Reverse Polish Notation

    【讨论】:

    • @amir-这里有很好的实用解释。来自我的支持。
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多