【发布时间】:2018-10-05 16:06:31
【问题描述】:
我需要开发一个程序来求解线性方程。节目 首先读取一个整数 n,它是方程的数量。 然后程序读取包含方程的 n 行。 例如,程序的输入是这样的:
3
2x1+3x2+4x3=16
1x1+2x2+1x3=8
3x1+1x2+2x3=13
任何操作都应该首先将每个方程转换为 适当的形式。方程本身应具有以下性质
-
变量从左到右按字母顺序排列:
3x2+2x1+4x3=16应该是
2x1+3x2+4x3=16 -
任何变量都应该只出现一次:
4x1+3x2-2x1+4x3=16应该是
2x1+3x2+4x3=16 -
方程中只应出现一个常数项,它应该是 右侧:
2x1+3x2+5+4x3-11=10应该是
2x1+3x2+4x3=16 -
系数等于一或-1时,数字1是可选的:
1x1+3x2-1x3=10可以原样输入
x1+3x2-x3=10
到目前为止我所做的如下:
#include<iostream>
#include<string>
#include<sstream>
#include<cstdlib>
using namespace std;
int main() {
int n;
cin >> n;
string eqn[100];
//get eq from user
for (int i = 0; i < n; i++) {
cin >> eqn[i];
}
size_t s = 0;
size_t y = 0;
for (int i = 0; i < n; i++) {
for (int x = 1; x <= ((eqn[i].length() - ((eqn[i].length() - 3) / 4)) / 3); x++)
{
int counter = 0;
ostringstream ss;
ss << x;
string j = ss.str();
for (int t = 0; t < eqn[i].length(); t++) {
y = eqn[t].find("x" + j, y + 1);
if (y < eqn[i].length()) { counter++; }
}
for (int o = 1; o <= counter; o++) {
s = eqn[i].find("x" + j, s + 1);
string x1 = eqn[i].substr(s - 1, 3);
string x2 = x2 + x1;
cout << x1;
}
}
cout << endl;
}
int k; cin >> k;
return 0;
}
但事情变得过于复杂,我不确定这是否是正确的方法..
除了find()、substr()之外,还有更好的方法来操作字符串方程吗?
我应该如何解决这个问题?
【问题讨论】:
-
听起来像家庭作业?
-
这是我负责的大学项目,但我被卡住了,不知道有更好的方法来解决这个问题。
-
使用
find()、substr()这样做可能是可行的,但很乏味。编写语法和编写解析器听起来更容易(对我来说),但如果您从未听说过编译器构造或形式语言,这也可能是一个挑战。我只是推荐其他有类似问题的人看看Syntax Diagram。如果您设法制作了这样的语法图,那么将其翻译成带有ifs、switchs 和for-loops 的手写解析器可能并不难。