0

次のコードがあります。

bool s = true;

for (...; ...; ...) {
    // code that defines A, B, C, D 
    // and w, x, y, z

    if (!(A < w) && s == true) {
        s = false;
    }

    if (!(B < x) && s == true) {
        s = false;
    }

    if (!(C < y) && s == true) {
        s = false;
    }

    if (!(D < z) && s == true) {
        s = false;
    }
}

このコードはうまく機能しています。ただし、いくつかの (重要ではない) 理由により、s = false;if ステートメント内で開始して true に設定できるようにコードを変更したいと考えています。次のことを試しました。

bool s = false;

for (...; ...; ...) {
    // code that defines A, B, C, D 
    // and w, x, y, z

    if (A >= w && s == false) {
        s = true;
    }

    if (B >= x && s == false) {
        s = true;
    }

    if (C >= y && s == false) {
        s = true;
    }

    if (D >= z && s == false) {
        s = true;
    }
}

ただし、上記のコードが機能しているため、これは正しく機能していません。ロジックのどこかが間違っていることはわかっていますが、どこが間違っているのかわかりません。誰にも私のおそらく明らかなエラーが表示されますか?

編集: さらに 3 つの if ステートメントを追加しました。彼らはコメントされていたので見逃しました。

4

4 に答える 4

2

ド・モルガンの法則によると、 にも変更&&する必要があります||

于 2013-11-10T08:48:21.180 に答える
0

設定するループ本体の部分は、sこれと論理的に同等です。

if(A >= w || B >= x || C >= y || D >= z)
    s = false;

条件を抽象化すると、これは次のようになります。

s &= some_function(A, B, C, D, w, x, y, z);

これを次のように変更します。

s |= some_other_function(A, B, C, D, w, x, y, z);

最初のケースでは、ループのすべての反復で false を返すs場合、ループ後に true になります。some_function2 番目の true では、ループの任意の反復でtrue を返すs場合、ループの後にtrue になります。some_other_function

some_other_functionsome_functionいずれかの反復で true を返す場合にのみ、trueを返すことができます。ただしsome_other_function、現在の反復からの値にしかアクセスできません。したがって、有効なsome_other_functionは存在できません。

これはs、どちらの場合もループ後に同じ値を持つ必要があると想定しています。そうしないと、 に関連するすべての場所でtrueとを簡単に入れ替えることができます。falses

于 2013-11-10T12:04:03.627 に答える
0

ウィキペディアのド・モルガンの法則に関するページで答えを見つけました 。私の問題の正しいコードは次のとおりです。

bool s = false;

for (...; ...; ...) {
    // code that defines A, B, C, D 
    // and w, x, y, z

    if (!(A >= w || s == false)) {
        s = true;
    }

    if (!(B >= x || s == false)) {
        s = true;
    }

    if (!(C >= y || s == false)) {
        s = true;
    }

    if (!(D >= z || s == false)) {
        s = true;
    }
}

ヒントをありがとう@EJP!

于 2013-11-10T09:21:23.217 に答える
0

!(A < x)と同じなA >= xので、関数はロジックをまったく逆にしていません。を使用する必要がありますA < x

sおそらく、ループ内の現在の状態を確認する必要はありません。あなたがそれをひっくり返しているか、そうでないかのどちらかです。そして、ループを続行する何らかの理由がない限り、breakおそらくs.

于 2013-11-10T08:53:43.857 に答える