0

私は過去 3 時間このコードを見ていて、かなり行き詰まっています。助けていただければ幸いです、ありがとう。

ファイル: UnsortedType.h

#include "ItemType.h"
class UnsortedType{

public:
    UnsortedType();
    void RetireveItem(ItemType& item, bool& found);
    bool InsertItem(ItemType item);
private:
    int length;
    ItemType info[MAX_ITEMS];
};

ファイル: UnsortedType.cpp

#include "UnsortedType.h"
#include <iostream>

UnsortedType::UnsortedType() {
    length = 0;
}

void UnsortedType::RetireveItem(ItemType& item, bool& found) {

    bool moreToSearch = true;
    int location = 0;
    found = false;

    moreToSearch = (location < length);

    while (moreToSearch && !found) {

        switch (item.ComparedTo(info[location])) {
            case LESS:
                location++;
                moreToSearch = (location < length);
                break;
            case GREATER:
                location++;
                moreToSearch = (location < length);
                break;
            case EQUAL:
                found = true;
                break;
        }
    }

    if (found) {
        item = info[location];
        std::cout << "Item " << item.getValue() << " has been retrieved." << std::endl;
    }

    else {
        std::cout << "Item " << item.getValue() << " has NOT found and has NOT been retrieved."
    }
}

bool UnsortedType::InsertItem(ItemType item) {

    if (length == MAX_ITEMS) {
        std::cout << "List is Full!" << std::endl;
        std::cout << "Item " << item.getValue() << " has not been added." << std::endl;
        return false;
    } else {
        std::cout << "Item " << item.getValue() << " added successfully." << std::endl;
        info[length] = item;
        length++;
        return true;
    }
}

ファイル: ItemType.h

const int MAX_ITEMS = 40;
enum RelationType{LESS,GREATER,EQUAL};

class ItemType{

private:
    int value;

public:
    ItemType();
    ItemType(int value);
    RelationType ComparedTo(ItemType otherItem);
    void Initialize(int value);
    void printItem();
    int getValue();
};

ファイル: ItemType.cpp

ItemType::ItemType(){
    this->value=0;    
}

ItemType::ItemType(int value){
    this->value = value;
}

RelationType ItemType::ComparedTo(ItemType otherItem){

    if(value < otherItem.value){
        return LESS;
    }

    if(value == otherItem.value){
        return EQUAL;
    }

    if(value < otherItem.value){
        return GREATER;
    }    

}

void ItemType::Initialize(int value){
    this->value = value;
}

void ItemType::printItem(){
    std::cout << "Item Type: " << this->value <<std::endl;
}

int ItemType::getValue(){
    return this->value;
}

注: 上記のコードでは、関係ないと思われるコードの一部を省略しています。したがって、コードをコピーして貼り付けて実行すると、いくつかの include ステートメント ( iostream など) が必要になる場合があります。

ここに質問があります:

次のようにメインを実行すると:

UnsortedType unsortedType;

bool item3found = false;
ItemType item3(3);
unsortedType.InsertItem(item3);
unsortedType.RetireveItem(item3, item3found);

bool item1found = false;
ItemType item1(1);
unsortedType.InsertItem(item1);
unsortedType.RetireveItem(item1, item1found);

bool item2found = false;
ItemType item2(2);
unsortedType.RetireveItem(item2, item2found);

問題はありません。

出力は次のとおりです。

Item 3 added successfully.
Item 3 has been retrieved.
Item 1 added successfully.
Item 1 has been retrieved.
Item 2 has NOT found and has NOT been retrieved.

ただし、最初に item1 を追加して item1 を取得し、次に item3 を追加して item3 を取得すると、switch ステートメントが突然機能しなくなります。

したがって、これは奇妙な状況でのメイン ファイルです。

UnsortedType unsortedType;

bool item1found = false;
ItemType item1(1);
unsortedType.InsertItem(item1);
unsortedType.RetireveItem(item1, item1found);

bool item3found = false;
ItemType item3(3);
unsortedType.InsertItem(item3);
unsortedType.RetireveItem(item3, item3found);

bool item2found = false;
ItemType item2(2);
unsortedType.RetireveItem(item2, item2found);

プログラムをデバッグしている間、私は自分自身を見つけ続けます: while (moreToSearch && !found) コードはどの switch ステートメントにも行きません。何か案が?

これは、奇妙な状況での出力です。

Item 1 added successfully.
Item 1 has been retrieved.
Item 3 added successfully.

RUN FAILED (exit value 1, total time: 1s)

どんな助けも大いに充当します、私はそれを失いかけています!

4

3 に答える 3

5

問題はComparedToメンバー関数にあるようです。

RelationType ItemType::ComparedTo(ItemType otherItem){

    if(value < otherItem.value){
        return LESS;
    }

    if(value == otherItem.value){
        return EQUAL;
    }

    if(value < otherItem.value){
        return GREATER;
    }    

}

ケースの比較はGREATER正しくないようです。このような関数の場合、値を返さない可能性のあるパスを許可しないことは理にかなっています(つまり、、、を使用しますif)。また、すべてのコンパイラ警告をオンにして、それらをエラーとして扱いたい場合があります。このような問題を回避するのに役立ちます。else ifelse

于 2012-10-29T21:38:58.447 に答える
2

あなたのcomparedToメソッドでは、最後のifステートメントは最初のステートメントと同じです->ではなく持っている必要があり<ます。

実際、コンパイラがその関数の値を返さないコードパスの可能性について文句を言わなかったことに驚いています。その場合は警告レベルを上げることを検討することをお勧めします-そうでない場合は、コンパイラを聞いてください。通常、知る必要のないことは通知されません:-)

GREATER私はその時点で無条件に戻ったでしょう(a)それが少なくも等しくもなければ、それが唯一の残りの可能性だからです。言い換えれば、次のようなものです。

RelationType ItemType::ComparedTo (ItemType otherItem) {
    if (value < otherItem.value)
        return LESS;

    if (value > otherItem.value)
        return GREATER;

    return EQUAL;
}

(a)実際には、おそらく<>および演算子(および必要に応じて他の演算子)をオーバーライドして、。ではなくコードを==記述できるようにします。しかし、それはあなたの教育の次のステップかもしれません:-)if (a < b)if (a.comparedTo(b) == LESS)

于 2012-10-29T21:43:31.347 に答える
1
RelationType ItemType::ComparedTo(ItemType otherItem){
    if(value < otherItem.value){
        return LESS;
    }
    if(value == otherItem.value){
        return EQUAL;
    }
    if(value < otherItem.value){         // !!!!
        return GREATER;
    }    
}

ComparedTo関数が正しくありません。sのいずれvalue > otherItem.valueにも入力さifれず、値を返さずに脱落し、未定義の動作が発生する場合。

于 2012-10-29T21:39:37.047 に答える