2016-03-15 38 views
1

我想从与优先申请阅读后以解决这种类型的表达式
2 + 3/5 * 9 + 3-4
这里是我试图解决该任务的代码我怎样才能解决这个问题C++优先经由申请

while (!inputFile.eof()) { 
    getline(inputFile, read); 
    cout << read << endl; 
    for (int i = 0; i < read.length(); i++) { 
    if (read[i] == '/') { 
     result = static_cast<float>(read[i - 1])/static_cast<float>(read[i + 1]); 
     read[i - 1] = result; 
     for (int j = i; j < read.length() - 2; j++) { 
     read[j] = read[j + 2]; 
     } 
     read[read.length() - 1] = '\0'; 
     read[read.length() - 2] = '\0'; 
    } 
    } 
    cout << result << endl; 
    cout << read << endl; 
} 
+0

你正在评估的操作数为花车但你保存它放回串作为一个字符,失去了任何精度。您正在基于它们的ascii表示来评估操作数,而不是实际值。该代码假定每个操作数只有一个字符长。你只显示分区,但是在执行乘法时,你可能会得到大于9的值,因此会有问题。我认为你应该重新思考你的解决方案,我建议不要试图在一个字符串中完成所有工作。 – vu1p3n0x

+0

我不确定自己明白你想要做什么。评估表达式不是一项简单的任务。 [This](http://www.stroustrup.com/3rd_code.html)可能会帮助你(寻找桌面计算器)。如果'“/”'是字符串的第一个字符,而如果给定的格式良好的输入不会发生 – ZDF

回答

2

您将需要从输入中构建树状结构。首先你需要lex(/ tokenize)你的方程,这样你就可以得到一个List/Array /任何你认为符合你的标记(数字,运算符,括号)的容器。这些可能已经拥有正确的数据类型(float或int等等)。

然后您就可以使用正确的优先顺序解析您的标记成树状结构。这是构建类似计算器的应用程序的棘手部分。

基本上你在这里解析语法,但你应该考虑一下这个自己(这是一个很好的做法)。

你的树结构2 + 3/5 * 9只+ 3-4需要看起来像这样:

MINUS 
|- PLUS 
| |- PLUS 
| | |- 2 
| | |- MULTIPLY 
| | | |- DIVIDE 
| | | | |- 3 
| | | | |- 5 
| | | |- 9 
| |- 3 
|- 4 
1

代码有一些问题

  1. 有在第一次循环中尝试访问大概不存在的读取[-1]存储器地址时,会出现索引超出边界错误。

  2. 读取(可能是)字符数组,这意味着read [i]包含一个ASCII字符而不是原始数字。所以,如果读[我]包含“5”,应用结果的static_cast <浮动>(读[1])是'53 0.0' ,因为ASCII的代码‘5’是53.所以你真正需要的是的static_cast <浮动>(阅读[i] - '0')

  3. 你不应该将浮点除法的结果存回读[i-1],因为很明显你正在用chars混合浮点值。如果你是认真的做,你应该转换为字符串的操作的结果,但我敢说这是一个不必要的复杂性:你为什么不干脆用一个浮点数临时变量来存储部分结果?

  4. 但绝对没有你消耗了前两个操作数后,就推进指针萎缩读取缓冲区内容的必要性。

+0

#1只能发生。 – vu1p3n0x

+0

我不会假设输入结构良好的,因为它没有任何地方检查 –

+0

够公平的.... – vu1p3n0x