3

演算子のオーバーロードを使用して、多項式クラスの基本演算 (+、-、​​、/) を定義しようとしていますが、プログラムを実行するとクラッシュし、コンピューターがフリーズします。

アップデート4

Ok。私は3つの操作を成功させました.残ったのは除算だけです.

これが私が得たものです:

polinom operator*(const polinom& P) const
{
    polinom Result;
    constIter i, j, lastItem = Result.poly.end();
    Iter it1, it2, first, last;
    int nr_matches;

    for (i = poly.begin() ; i != poly.end(); i++) {
         for (j = P.poly.begin(); j != P.poly.end(); j++)
              Result.insert(i->coef * j->coef, i->pow + j->pow);
    }

    Result.poly.sort(SortDescending());

    lastItem--;

    while (true) {
        nr_matches = 0;

        for (it1 = Result.poly.begin(); it1 != lastItem; it1++) {
             first = it1;
             last = it1;
             first++;
             for (it2 = first; it2 != Result.poly.end(); it2++) { 
                  if (it2->pow == it1->pow) {
                      it1->coef += it2->coef;
                      nr_matches++;
                  }
             }

             nr_matches++;
             do {
                last++;
                nr_matches--;
             } while (nr_matches != 0);

             Result.poly.erase(first, last);
        }   
        if (nr_matches == 0)
            break;
    }     

    return Result;
}
4

3 に答える 3

5
while (i != poly.end() || P.i != P.End())

&& が必要になると思います。それ以外の場合、ループは i と pi がそれぞれの最後に同時に到達した場合にのみ終了します。

否定を伴うロジックはトリッキーです。おそらく、これを次のように考える方が簡単です。

while (!(i == poly.end() || j == P.End())) //while neither iterator has reached end

ブール演算によると、これは次と同じです。

while (!(i == poly.end()) && !(j == P.End()))
while (i != poly.end() && j != P.End())

また、両方が等しい場合、イテレータをインクリメントしていないようです (無限ループが無限に多くのメモリ割り当てにつながりますか?)。


スタイルの問題: イテレータをローカル変数として使用する方がよいでしょう。メソッドで使用を開始する前に「初期化」する必要がある場合は、変数をクラス メンバーにしないでください。メソッドが完了すると、変数は役に立たなくなります。

また、引数を const 参照で渡すことを優先し、メンバー関数が現在のオブジェクトを変更しない場合はconstoperator+をマークします (すべきではありません)。

 polinom operator+(const polinom& P) const;

(これにより、ローカルで使用される反復子メンバーを作成する際の問題が明らかになります - インスタンスを変更することになります!)

于 2010-03-11T14:24:53.410 に答える
2

コードには他の設計と正確性の問題がありますが、クラッシュはこの行で発生すると思います

 if (i->pow > P.i->pow) 

i == poly.end() && Pi != P.End() または i != poly.end() && Pi == P.End() の場合。最後の要素の後を指しているときに i を逆参照すると、クラッシュします。

于 2010-03-11T14:14:07.730 に答える
1

多項式を正しく加算する関数を取得するには、次の単純なロジックをお勧めします。

polinom operator+(const polinom& P) const //fixed prototype re. const-correctness
{
    polinom Result;
    std::list<term>::const_iterator //fixed iterator type
        i = poly.begin(), j = P.poly.begin();

    while (i != poly.end() && j != P.poly.end()) {
        //logic while both iterators are valid
    }

    //handle the remaining items in each list
    //note: at least one will be equal to end(), but that loop will simply be skipped

    while (i != poly.end()) {
        Result.insert(i->coef, i->pow);
        ++i;
    }

    while (j != P.poly.end()) {
        Result.insert(j->coef, j->pow);
        ++j;
    }

    return Result;
}

最後の部分はおそらく標準ライブラリ関数に任せることもできます

#include <iterator>
#include <algorithm>

//...
    //handle remaining items in either list (if any)
     std::copy(i, poly.end(), std::back_inserter(Result.poly));
     std::copy(j, P.poly.end(), std::back_inserter(Result.poly));

...しかし、おそらくlist.insertを使用する方が簡単でしょう:

     Result.poly.insert(Result.poly.end(), i, poly.end());
     Result.poly.insert(Result.poly.end(), j, P.poly.end());
于 2010-03-11T16:02:59.820 に答える