C++ 通过备案优先
C++ Precedence via filing
本文关键字:C++ 更新时间:2023-10-16
我想在读取优先归档后解决这种类型的表达式
2+3/5*9+3-4
这是我尝试解决该任务的代码,我该如何解决这个问题
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] = ' ';
read[read.length() - 2] = ' ';
}
}
cout << result << endl;
cout << read << endl;
}
您需要根据输入构建树状结构。首先,您需要对等式进行 lex(/tokenization),以便获得一个列表/数组/您认为适合您的标记的任何容器(即数字、运算符、括号)。这些可能已经包含正确的数据类型(float 或 int 表示数字等)。
然后,您可以使用正确的优先级将令牌解析为树状结构。这是构建类似计算器的应用程序的棘手部分。
基本上你在这里解析语法,但你应该自己考虑一下(这是一个很好的做法)。
2+3/5*9+3-4 的树结构需要如下所示:
MINUS
|- PLUS
| |- PLUS
| | |- 2
| | |- MULTIPLY
| | | |- DIVIDE
| | | | |- 3
| | | | |- 5
| | | |- 9
| |- 3
|- 4
你的代码有很多问题
-
那里隐藏了一个索引越界错误,在循环的第一次迭代中,您尝试访问 read[-1] 内存地址,该地址可能不存在
read (大概)是一个字符数组,这意味着read[i]包含一个ASCII字符而不是一个原始数字。因此,如果 read[i] 包含 '5',则应用 static_cast<float>(read[i]) 的结果是 '53.0',因为 ASCII 的 '5' 代码是 53。所以你真正需要的是static_cast<浮点>(读[i] - '0')
您不应该将浮点除法的结果存储回 read[I-1],因为很明显您将浮点值与 char 混淆了。如果你真的想这样做,你应该将你的操作结果转换成一个字符串,但我敢说这是一个不必要的复杂性:你为什么不简单地使用浮点临时变量来存储部分结果?
在使用前两个操作数后,绝对没有必要缩小读取缓冲区内容,只需推进指针即可。
相关文章:
- 没有找到相关文章