2014-06-07 49 views
0

我试图用c中的+, - ,*和/运算符来制作简单的计算器。例如((2.1 - 5.6)*4)+(2.8+2/2.2)应该是-10.29 ...我尝试过这样,但它只适用于出门bar。如果用户的输入包含括号,我不知道如何处理。用括号括起来的c中的简单计算器

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

你要打破这种分为两个问题:1)找到所有的支架,配对起来,找到自己最里面的内容; 2)评估这些内容。它成为一个递归代码 - 详细解释这个范围的范围超出了StackOverflow的范围。 – Floris

+2

你可能想看看这个:http://en.wikipedia.org/wiki/Shunting-yard_algorithm –

+0

甚至http://stackoverflow.com/questions/4582398/writing-a-simple-equation-parser – Floris

回答

2

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

什么你正在使用被称为顺便说缀表示法。该算法似乎做的是将其转换为后缀符号(由于您只需要一个堆栈,所以它更容易计算)。

而且,只是出于好奇,老计算器使用后缀符号(有也仍然使用它SOM的编程语言),所以,要计算3 + 5,你写3 5 +

1

你解决不了的方程以这种简单的方式使括号复杂化。有一些算法必须遵循。其中一个在某些计算器中使用的是逆转波兰表示法其中将公式转换为特定形式,然后使用堆栈开始推送和弹出以考虑优先级进行计算。

Link to Reverse Polish Notation

+0

@ amir-尼斯和实际的解释here.An upvote from myside。 –

+0

@shekharsuman谢谢 – CMPS

相关问题