Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++_Polynomial Math - Fatal编程技术网

C++ C++;多项式乘法的重载*

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,然而,加法和减法都能很好地

所以我一直在开发一个多项式类,其中用户输入: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,然而,加法和减法都能很好地工作

我的构造器

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]();