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

你的代码有很多问题

  1. 那里隐藏了一个索引越界错误,在循环的第一次迭代中,您尝试访问 read[-1] 内存地址,该地址可能不存在

  2. read
  3. (大概)是一个字符数组,这意味着read[i]包含一个ASCII字符而不是一个原始数字。因此,如果 read[i] 包含 '5',则应用 static_cast<float>(read[i]) 的结果是 '53.0',因为 ASCII 的 '5' 代码是 53。所以你真正需要的是static_cast<浮点>(读[i] - '0')

  4. 您不应该将浮点除法的结果存储回 read[I-1],因为很明显您将浮点值与 char 混淆了。如果你真的想这样做,你应该将你的操作结果转换成一个字符串,但我敢说这是一个不必要的复杂性:你为什么不简单地使用浮点临时变量来存储部分结果?

  5. 在使用
  6. 前两个操作数后,绝对没有必要缩小读取缓冲区内容,只需推进指针即可。

相关文章:
  • 没有找到相关文章