0

私が知っている大学の新入生は、コンピュータサイエンスのクラスの紹介を受けて、宿題の1つについて助けを求めてきました。私は何度か読み通しましたが、彼らが何を求めているのかわからないことを認めるのは恥ずかしいです。ここに質問があります:

以下にループの概要を示します。プログラムを終了して、x値とy値を読み取り、それらを検証し(正しい値を入力するまでユーザーにプロンプ​​トを表示し続けることにより)、指定されたアサーションが常にtrueになるように実行します。プログラムの真でなければならない4つのポイントにループ不変アサーションを含めます。指定されたassert(...)ステートメントを除いて、乗算演算子を使用することはできません。

assert(x>0 && y>0);
while(...)
{
    assert(sum == i*(x+1));
    ...
    ...
}
assert(sum == y*(x+1));

ループ不変条件が何であるかわからなかったので、グーグルでウィキペディアの記事を読みました。それから、最初のassertステートメントは、ループの期間中、xとyが負になることを許可してはならないことを示しています。正直なところ、私はこの時点で立ち往生しています。誰かが私がここで何を求めているのか理解するのを手伝ってもらえますか?

4

1 に答える 1

1

宿題の説明は、ほとんど意味がないほど不完全です。

ただし、これは、ユーザーに 2 つの正の整数を入力させ、乗算演算子を使用せずに積を合計として計算することであると推測できます。

一般に、正の整数の積は次のように合計として定義できます。

2 回 b = b + b
(a + 1) 回 b = b + (a 回 b)

オペランド 1 と 0 の場合は、一般的な規則を保持する必要があることによって推論されます。

あなたが示す主張に対する最後の方程式の類似性は、おそらく偶然ではありません。

とにかく、ループ不変条件としてうまく機能します。ループ変数を増やしても、ループの不変条件は引き続き保持され、優れた製品が確実に得られます。そのため、ループが終了すると、その積に対するループ不変条件の制約と、この時点でのループ変数の値により、x*y である積が得られます。

于 2012-09-28T04:41:38.337 に答える