Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;通过归档优先_C++_C++11_Visual C++ - Fatal编程技术网

C++ C++;通过归档优先

C++ C++;通过归档优先,c++,c++11,visual-c++,C++,C++11,Visual C++,我想在阅读了文件后解决这类表达式 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_ca

我想在阅读了文件后解决这类表达式
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] = '\0';
      read[read.length() - 2] = '\0';
    }
  }
  cout << result << endl;
  cout << read << endl;
}
while(!inputFile.eof()){
getline(输入文件,读取);

cout您的代码有许多问题

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

  • read(大概)是一个字符数组,这意味着read[i]包含一个ASCII字符,而不是一个原始数字。因此,如果read[i]包含“5”,则应用静态_转换(read[i])的结果是“53.0”,因为“5”的ASCII代码是53。因此,您真正需要的是静态_转换(read[i]-“0”)

  • 不应将浮点除法的结果存储回read[i-1],因为很明显你把浮点值和字符混在一起了。如果你真的想这么做,你应该把你的操作结果转换成字符串,但我敢说这是一个不必要的复杂性:你为什么不干脆用一个浮点临时变量来存储部分结果呢

  • 在使用前两个操作数之后,绝对没有必要收缩读取缓冲区内容,只需前进指针即可


  • 您需要根据输入构建一个树状结构。首先,您需要对您的等式进行lex(/tokenize),以便获得一个列表/数组/您认为适合您的标记的任何容器(数字、运算符、括号)。这些可能已经包含了正确的数据类型(数字的float或int等)

    然后,您可以使用正确的优先级将令牌解析为树状结构。这是构建类似计算器的应用程序的棘手部分

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

    2+3/5*9+3-4的树结构需要如下所示:

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

    您将操作数计算为浮点数,但随后将其作为字符存储回字符串中,从而失去任何精度。您将根据操作数的ascii表示而不是实际值来计算操作数。此代码假定每个操作数只有一个字符长。您只显示除法,但在实现乘法时,您可能会忽略除法t值大于9,因此会有问题。我认为您应该重新考虑您的解决方案,我建议不要尝试在一个字符串中完成所有操作。我不确定我是否理解您尝试执行的操作。计算表达式不是一项简单的任务。可能会帮到您(查找桌面计算器).#1只能在
    '/'
    是字符串的第一个字符时发生,如果给定格式良好的输入不会发生,我不会假设输入格式良好,因为它没有在任何地方检查。