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只能在'/'
是字符串的第一个字符时发生,如果给定格式良好的输入不会发生,我不会假设输入格式良好,因为它没有在任何地方检查。