C++ C++;多项式乘法的重载*
所以我一直在开发一个多项式类,其中用户输入:1x^0+2x^1+3x^2。。。和1,2,3(系数)存储在int数组中C++ C++;多项式乘法的重载*,c++,polynomial-math,C++,Polynomial Math,所以我一直在开发一个多项式类,其中用户输入:1x^0+2x^1+3x^2。。。和1,2,3(系数)存储在int数组中 我的重载+和-函数可以工作,但是,*不能工作。无论输入什么,它总是显示-84215040 什么时候应该是(5x^0+x^1)*(-3x^0+x^1)=-15x^0+2x^1+1x^2 或(x+5)(x-3)=x^2+2x-15 我使用重载的*函数,比如:多项式乘法=1*2 我猜问题出在strtol(p,&endptr,10)上,因为它使用了一个长int,然而,加法和减法都能很好地
我的重载+和-函数可以工作,但是,*不能工作。无论输入什么,它总是显示-84215040
什么时候应该是(5x^0+x^1)*(-3x^0+x^1)=-15x^0+2x^1+1x^2
或(x+5)(x-3)=x^2+2x-15 我使用重载的*函数,比如:
多项式乘法=1*2代码>
我猜问题出在strtol(p,&endptr,10)上,因为它使用了一个长int,然而,加法和减法都能很好地工作
我的构造器
Polynomial::Polynomial(char *s)
{
char *string;
string = new char [strlen(s) + 1];
int length = strlen(string);
strcpy(string, s);
char *copy;
copy = new char [length];
strcpy(copy, string);
char *p = strtok(string, " +-");
counter = 0;
while (p)
{
p = strtok(NULL, " +-");
counter++;
}
coefficient = new int[counter];
p = strtok(copy, " +");
int a = 0;
while (p)
{
long int coeff;
char *endptr;
coeff = strtol(p, &endptr, 10); //stops at first non number
if (*p == 'x')
coeff = 1;
coefficient[a] = coeff;
p = strtok(NULL, " +");
a++;
}
}
还有重载的*函数
Polynomial Polynomial::operator * (const Polynomial &right)
{
Polynomial temp;
//make coefficient array
int count = (counter + right.counter) - 1;
temp.counter = count;
temp.coefficient = new int [count];
for (int i = 0; i < counter; i++)
{
for (int j = 0; j < right.counter; j++)
temp.coefficient[i+j] += coefficient[i] * right.coefficient[j];
}
return temp;
}
多项式::运算符*(常数多项式和右)
{
多项式温度;
//制作系数数组
整数计数=(计数器+右计数器)-1;
温度计数器=计数;
温度系数=新整数[计数];
对于(int i=0;i
这是我的全部代码:您似乎没有在操作符*()
中将温度系数[i+j]
初始化为零
在操作符*()
中,似乎没有将温度系数[i+j]
初始化为零
做
给你一个零数组
否则,在for循环中,您将向垃圾中添加内容。确实如此
给你一个零数组
否则,在for循环中,您将向垃圾中添加内容。将-84215040转换为十六进制,以在调试构建中找到CRT中使用的一个。这有助于在代码中查找错误:
temp.coefficient = new int [count];
// Must initialize the memory
for (int ix = 0; ix < count; ++ix) temp.coefficient[ix] = 0;
温度系数=新整数[计数];
//必须初始化内存
对于(intix=0;ix
顺便说一句,还有很多其他的bugz错误,祝你好运修复它们。将-84215040转换为十六进制,以便在调试版本中找到CRT中使用的一个。这有助于在代码中查找错误:
temp.coefficient = new int [count];
// Must initialize the memory
for (int ix = 0; ix < count; ++ix) temp.coefficient[ix] = 0;
温度系数=新整数[计数];
//必须初始化内存
对于(intix=0;ix
顺便说一句,还有很多其他的错误,祝你好运修复它们。更换
temp.coefficient = new int [count];
借
为了将数组值归零,请初始化数组值。替换
temp.coefficient = new int [count];
借
为了将数组值初始化为零。我的重载+和-函数工作,但是重载*不工作。不管输入是什么,它总是显示-84215040i从pastie.org下载了您的代码,用g++4.4.1编译后运行良好。需要一些错误检查。很明显,但你实际上是在乘以多项式,而不是字符串或其他东西吗?我的C是公认的生锈了,但他不是在堆栈上按写入方式分配返回值,然后尝试返回它。。。根据测试代码的不同,哪些选项可能起作用,哪些选项可能不起作用?1)为什么要在字符串中有任何内容之前先计算字符串的长度?2) 您应该将strlen()的结果存储在size\t
中,而不是像int
这样的有符号变量中。我的重载+和-函数可以工作,但是重载*不起作用。不管输入是什么,它总是显示-84215040i从pastie.org下载了您的代码,用g++4.4.1编译后运行良好。需要一些错误检查。很明显,但你实际上是在乘以多项式,而不是字符串或其他东西吗?我的C是公认的生锈了,但他不是在堆栈上按写入方式分配返回值,然后尝试返回它。。。根据测试代码的不同,哪些选项可能起作用,哪些选项可能不起作用?1)为什么要在字符串中有任何内容之前先计算字符串的长度?2) 您应该将strlen()
的结果存储在size\u t
中,而不是像int
这样的有符号变量中。在一个语句中更容易实现这一点的方法是new int[count]()
,它将默认初始化每个元素。请查看我的答案,即使使用此修复程序,您的代码也不能“安全”在任何地方工作。@Raptrex,这是因为newint[N]
不会用零填充数组。数组的所有元素都有不确定的初始值memset
会将它们全部设置为0
,或者您可以使用new int[N](0)或new int[N]()
来做同样的事情。在一个语句中更简单的方法是new int[count]()
,这将默认初始化每个元素。请看我的答案,您的代码不“安全”即使使用此修复程序,也可以在任何地方工作。@Raptrex,这是因为newint[N]
不会用零填充数组。数组的所有元素都有不确定的初始值memset
会将它们全部设置为0
,或者您可以使用newint[N](0)或new int[N]()
来执行相同的操作。这是一种非常低效的数组初始化方法。请改用memset
,或者在new[]
中使用显式初始值设定项。请查看在发布版本中为此循环生成的代码。您仍应使用memset
、std::fill
,或者最好的new[](
)。这些函数是标准的,比手写循环更容易阅读。这是一种非常低效的数组初始化方法。请改用memset
,或者在new[]
中使用显式初始值设定项。请查看在发布版本中为此循环生成的代码。您仍应使用memset
、std::fill
,或者最好的new[](
)。这些函数是标准的,比手写循环更容易阅读。
temp.coefficient = new int [count]();