0

2つの多項式を足し合わせる関数を書いています。2つの多項式の最高次数が同じである場合(すべての項を入力する必要はありません)は正常に機能しますが、2つの多項式の次数が異なる場合は機能しません。関数はどういうわけか係数としていくつかの大きな値を格納します

これが機能です

// overload +
Polynomial Polynomial::operator+(const Polynomial &right)
{
    // get the highest exponent value for result
    int highestExp = 0;
    if (maxExp < right.maxExp)
        highestExp = right.maxExp;
    else if (maxExp >= right.maxExp)
        highestExp = maxExp;

    Polynomial res;
    res.setPolynomial(highestExp);

    for (int coeff=0; coeff < highestExp; coeff++)
            res.poly[0][coeff] = poly[0][coeff] + right.poly[0][coeff];

    return res;
}

たとえば、case1:最高の経験値は等しい

The first (original) polynomial is:
 - 4x^0 + x^1 + 4x^3 - 3x^4
The second polynomial is:
 - x^0 - x^3
The result polynomial is:
 - 5x^0 + x^1 + 3x^3 - 3x^4

ケース2:最高の指数が等しくない

The first (original) polynomial is:
 - 4x^0 + x^1 + 4x^3 - 3x^4 (highest exp = 4)
The second polynomial is:
 - x^0 - x^3 (highest exp = 5)
The result polynomial is:
 - 5x^0 + x^1 + 3x^3 - 3x^4 - 33686019x^5 (highest exp = 5)

助けてください!

更新:多項式クラス

class Polynomial
{
private:
    int **poly;
    int maxExp;
    void createPolynomialArray(int);
public:
    Polynomial();
    Polynomial(int); // constructor
    Polynomial(const Polynomial &); // copy constructor
    ~Polynomial(); // destructor

    // setter
    void setCoefficient(int,int);
    void setPolynomial(int);

    // getters
    int getTerm() const; 
    int getCoefficient(int,int) const; 

    // overloading operators
    void operator=(const Polynomial &); // assignment
    Polynomial operator+(const Polynomial &); // addition    
}
4

2 に答える 2

1

私はあなたが欲しいと思います

Polynomial Polynomial::operator+(const Polynomial &right)
{
    Polynomial res;
    if(maxExp < right.maxExp)
    {
        res.setPolynomial(right.maxExp);
        int coeff = 0;
        for (; coeff < maxExp; coeff++)
                res.poly[0][coeff] = poly[0][coeff] + right.poly[0][coeff];
        for (; coeff < right.maxExp; coeff++)
                res.poly[0][coeff] = right.poly[0][coeff];
    }
    else
    {
        res.setPolynomial(maxExp);
        int coeff = 0;
        for (; coeff < right.maxExp; coeff++)
                res.poly[0][coeff] = poly[0][coeff] + right.poly[0][coeff];
        for (; coeff < maxExp; coeff++)
                res.poly[0][coeff] = poly[0][coeff];
    }
    return res;
}

あなたは短い多項式の終わりを過ぎて読んでいます。

于 2013-03-03T04:44:53.823 に答える
0

配列アクセスの境界チェックが欠落しているようです。奇妙な値が表示される理由は、この場合、プログラムが初期化されていないメモリからガベージ値を読み取っている可能性があるためです。しかし、これは未定義の動作であるため、文字通り何が起こる可能性もあります。このようなバグの最悪の部分は、それらがしばしば正常に機能しているように見えることです。

また、std::vector生のポインタの代わりに係数を格納するために使用することをお勧めします。作業がはるかに簡単で、エラーが発生しにくくなります。

PSもう1つの落とし穴は、ifブロックとforブロックの周りに中括弧を使用することをお勧めすることです。含まれているコードが正確に明確になり、中括弧を更新せずに誤って行を追加するリスクが軽減されます。または天国は禁じています、誰かが複数行のマクロを使用します。しかし、これは好みの問題です。

于 2013-03-03T04:42:21.317 に答える