【发布时间】:2014-05-08 02:11:21
【问题描述】:
我在处理自己为自己制作的项目时遇到了问题。我对 C++ 和一般编程相当缺乏经验,所以我的代码可能不是最优雅或最有效的。目标是将从文件中读取的两个多项式相加、相减或相乘。这些方程的数量未知,但现在我正在处理一个。
- 方程的形式为 (2*x^2+3*x^4+5*x+6)+(1*x^5+4*x^2+7*x)。李>
- 这是我用于测试的方程式。
- 程序正在输出 6x^2+6x+2x^2+3x。
我今天已经为此工作了一段时间,但我似乎无法找到问题所在。我的主要问题是程序不会输出正确的答案,即使它的第一项是正确的。我知道你们不喜欢代码转储,但我不确定我们还能如何找到问题。谢谢你的帮助。
string multiplication(double polyArray0[MAX_SIZE][2], double polyArray1[MAX_SIZE][2], int counter = 0, int iteration = 0)
{
int updated = (counter + 1);
string line;
for(int i = 0; i < counter; ++i)
{
for(int n = 0; n < iteration; ++n)
{
polyArray0[i][0] *= polyArray1[n][0];
polyArray0[i][1] += polyArray1[n][1];
}
}
line = counter;
for(int i = 0; i < counter; ++i)
{
line += polyArray0[updated][0];
line += polyArray0[updated][1];
}
return line;
}
string addition(double polyArray0[MAX_SIZE][2], double polyArray1[MAX_SIZE][2], int counter = 0, int iteration = 0)
{
double polyArray2[MAX_SIZE][2];
int updated = 0;
bool additionTo;
string line;
for(int i = 0; i < counter; ++i)
{
additionTo = false;
for(int n = 0; n < iteration; ++n)
{
if(polyArray0[i][1] == polyArray1[n][1])
{
polyArray0[i][0] += polyArray1[n][0];
additionTo = true;
}
}
if(!additionTo)
{
polyArray2[updated][0] = polyArray0[i][0];
polyArray2[updated][1] = polyArray0[i][1];
++updated;
}
}
line = static_cast<ostringstream*>(&(ostringstream() << (updated + counter)))->str();
for(int i = 0; i < counter; ++i)
{
line += static_cast<ostringstream*>(&(ostringstream() << polyArray0[i][0]))->str();
line += static_cast<ostringstream*>(&(ostringstream() << polyArray0[i][1]))->str();
}
for(int i = 0; i < updated; ++i)
{
line += static_cast<ostringstream*>(&(ostringstream() << polyArray2[i][0]))->str();
line += static_cast<ostringstream*>(&(ostringstream() << polyArray2[i][1]))->str();
}
return line;
}
string subtraction(double polyArray0[MAX_SIZE][2], double polyArray1[MAX_SIZE][2], int counter = 0, int iteration = 0)
{
double polyArray2[MAX_SIZE][2];
int updated = counter;
string line;
bool additionTo;
for(int i = 0; i < iteration; ++i)
{
polyArray1[i][0] *= -1;
}
for(int i = 0; i < counter; ++i)
{
additionTo = false;
for(int n = 0; n < iteration; ++n)
{
if(polyArray0[i][1] == polyArray1[n][1])
{
polyArray0[i][0] += polyArray1[n][0];
additionTo = true;
}
}
if(!additionTo)
{
polyArray2[updated][0] = polyArray0[i][0];
polyArray2[updated][1] = polyArray1[i][1];
++updated;
}
}
line = static_cast<ostringstream*>(&(ostringstream() << (updated + counter)))->str();
for(int i = 0; i < counter; ++i)
{
line += static_cast<ostringstream*>(&(ostringstream() << polyArray0[i][0]))->str();
line += static_cast<ostringstream*>(&(ostringstream() << polyArray0[i][1]))->str();
}
for(int i = 0; i < updated; ++i)
{
line += static_cast<ostringstream*>(&(ostringstream() << polyArray2[i][0]))->str();
line += static_cast<ostringstream*>(&(ostringstream() << polyArray2[i][1]))->str();
}
return line;
}
int main()
{
//
// Variables :
// polyArray0 : used to store the left side of the equation
// polyArray1 : used to store the right side of the equation
// updated : a counter used to ensure that the bounds of the arrays are not being overstepped
// counter : a counter to find the length of a polynomial
// iteration : see updated
// startPosition/endPosition : used to find the length of each polynomial inside of the parenthesis
// number : number being converted into the array
// newPolynomial : will store the answer in a string
// polyInfo : the string contained within the file
// add : check to see if the program will be using the addition function
// subtract : check to see if the program will be using the subtraction function
// multiply : check to see if the program will be using the multiplication function
//
double polyArray0[MAX_SIZE][2];
double polyArray1[MAX_SIZE][2];
double updated;
int counter = 0;
int iteration = 0;
int startPosition;
int endPosition;
string number;
string newPolynomial;
string polyInfo;
string polynomial0;
string polynomial1;
string polynomial2;
bool polynomial;
bool adding;
bool subtracting;
bool multiplying;
//
// This will read in file. The file must be located in the same folder as the .cpp file.
//
ifstream polyFile;
polyFile.open("functions.txt");
//
// Use an if statement to make sure the file is opened and then retrieve the information and store it
// in a string called "polyFile."
//
if(polyFile.good())
{
getline(polyFile, polyInfo);
}
else
{
cout << "The file could not be open." << endl;
}
polynomial = true;
//
// Use a for loop to search through the string and find the math operator located
// between ")" and "(."
//
for(int i = 0; i < polyInfo.length(); ++i)
{
if(polyInfo.substr(i, 1) == "(")
{
startPosition = (i + 1);
}
else if(polyInfo.substr(i, 1) == ")")
{
if(polynomial)
{
polynomial0 = polyInfo.substr(startPosition, (i - 1));
polynomial = false;
//
// To determine whether the program will be adding, subtracting, or multiplying, we
// set one of the booleans to true depending on which character was found.
//
if(polyInfo.substr(i + 1, 1) == "+")
{
adding = true;
}
else if(polyInfo.substr(i + 1, 1) == "-")
{
subtracting = true;
}
else if(polyInfo.substr(i + 1, 1) == "*")
{
multiplying = true;
}
}
else
{
polynomial1 = polyInfo.substr(startPosition, i - startPosition);
}
}
}
polynomial2 = polynomial0;
//
// For loops and if statements are used to parse the string into an array so we will be able to
// easily handle the coefficients and powers later on for the operations.
//
for(int i = 0; i < polynomial2.length(); ++i)
{
if(i == 0)
{
if(polynomial2.substr(0, 1) == "x")
{
polyArray0[counter][0] = 1;
if(polynomial2.substr(1, 1) != "^")
{
polyArray0[counter][1] = 1;
++counter;
}
}
else
{
number = polynomial2.substr(0, 1);
polyArray0[counter][0] = atoi(number.c_str());
if(polynomial2.substr(i, 1) == "-")
{
polyArray0[counter][0] *= -1;
}
if(polynomial2.substr(1, 1) != "*")
{
polyArray0[counter][1] = 0;
++counter;
}
else if((polynomial2.substr(i + 2, 1) == "*") && (polynomial2.substr(i + 5, 1) != "^"))
{
polyArray0[counter][1] = 1;
++counter;
}
}
}
else if((polynomial2.substr(i, 1) == "-") || (polynomial2.substr(i, 1) == "+"))
{
if(polynomial2.substr(i + 1, 1) == "x")
{
polyArray0[counter][0] = 1;
if(polynomial2.substr(i, 1) == "-")
{
polyArray0[counter][0] *= -1;
}
if(polynomial2.substr(i + 2, 1) != "^")
{
polyArray0[counter][1] = 1;
++counter;
}
}
else
{
number = polynomial2.substr(i + 1, 1);
polyArray0[counter][0] = atoi(number.c_str());
if(polynomial2.substr(i, 1) == "-")
{
polyArray0[counter][0] *= -1;
}
if(polynomial2.substr(i + 2, 1) != "*")
{
polyArray0[counter][1] = 0;
}
else if((polynomial2.substr(i + 2, 1) == "*") && (polynomial2.substr(i + 4, 1) != "^"))
{
polyArray0[counter][1] = 1;
++counter;
}
}
}
else if(polynomial2.substr(i, 1) == "^")
{
number = polynomial2.substr(i + 1, 1);
polyArray0[counter][1] = atoi(number.c_str());
++counter;
}
}
polynomial2 = polynomial1;
for(int i = 0; i < polynomial2.length(); ++i)
{
if(i == 0)
{
if(polynomial2.substr(0, 1) == "x")
{
polyArray0[iteration][0] = 1;
if(polynomial2.substr(1, 1) != "^")
{
polyArray1[iteration][1] = 1;
++iteration;
}
}
else
{
number = polynomial2.substr(0, 1);
polyArray1[iteration][0] = atoi(number.c_str());
if(polynomial2.substr(i, 1) == "-")
{
polyArray0[counter][0] *= -1;
}
if(polynomial2.substr(1, 1) != "*")
{
polyArray1[iteration][1] = 0;
++iteration;
}
else if((polynomial2.substr(i + 1, 1) == "*") && (polynomial2.substr(i + 3, 1) != "^"))
{
polyArray1[iteration][1] = 1;
++iteration;
}
}
}
else if((polynomial2.substr(i, 1) == "+") || (polynomial2.substr(i, 1) == "-"))
{
if(polynomial2.substr(i + 1, 1) == "x")
{
polyArray1[iteration][0] = 1;
if(polynomial2.substr(i, 1) == "-")
{
polyArray0[counter][0] *= -1;
}
if(polynomial2.substr(i + 2, 1) != "^")
{
polyArray1[iteration][1] = 1;
++iteration;
}
}
else
{
number = polynomial2.substr(i + 1, 1);
polyArray1[iteration][0] = atoi(number.c_str());
if(polynomial2.substr(i, 1) == "-")
{
polyArray0[counter][0] *= -1;
}
if(polynomial2.substr(i + 2, 1) != "*")
{
polyArray1[iteration][1] = 0;
++iteration;
}
else if((polynomial2.substr(i + 2, 1) == "*") && (polynomial2.substr(i + 4, 1) != "^"))
{
polyArray1[iteration][1] = 1;
++iteration;
}
}
}
else if(polynomial2.substr(i, 1) == "^")
{
number = polynomial2.substr(i + 1, 1);
polyArray1[iteration][1] = atoi(number.c_str());
++iteration;
}
}
//
// If the program found a "+" it will call the addition function and store the answer in "newPolynomial."
// Similar process with subtracting and multiplying.
//
if(adding)
{
newPolynomial = addition(polyArray0, polyArray1, counter, iteration);
}
else if(subtracting)
{
newPolynomial = subtraction(polyArray0, polyArray1, counter, iteration);
}
else
{
newPolynomial = multiplication(polyArray0, polyArray1, counter, iteration);
}
number = newPolynomial.substr(0, 1);
updated = atoi(number.c_str());
for(int i = 1; i < (updated + 1); ++i)
{
number = newPolynomial.substr(i, 1);
polyArray0[i][0] = atoi(number.c_str());
number = newPolynomial.substr((i + updated), 1);
polyArray0[i][1] = atoi(number.c_str());
}
for(int i = 0; i < updated; ++i)
{
cout << polyArray0[i][0] << "x^" << polyArray0[i][1];
if(polyArray0[i][0] > 0 && i != updated)
{
cout << "+";
}
}
cout << endl;
system("PAUSE");
return 0;
}
【问题讨论】:
-
请发布一个 main() 程序,以及使用的数据。此外,这可能会让人感到震惊,但程序员,无论多么先进,都无法仅仅通过注视堆积如山的代码来找出问题所在。它需要在调试器下运行。
-
这是做什么的?
line = static_cast<ostringstream*>(&(ostringstream() << (updated + counter)))->str();为什么要全部投到ostringstream*? -
) 和 ( 之间的字符是 + 还是 * ?C++ 有这些漂亮的东西称为类。也许多项式类有助于组织你的代码。注释是解释数据结构的好方法。解释你的poly[MAX][2] 数据结构将帮助人们阅读您的代码。
-
对于我使用的示例,它是一个“+”。但是,我应该能够将其更改为“*”或“-”并且程序输出正确答案。我没有使用课程,因为我对它们几乎没有经验。