0

私は学校の研究室で Eiffel でプログラミングを行っています。タスクの 1 つは、特定のアルゴリズムのバグを見つけることです。アルゴリズムは、最初の繰り返し文字を返します。

アルゴリズムは次のように機能します。

word: STRING
first_repeated_character: CHARACTER
local
    i: INTEGER
    ch: CHARACTER
    stop: BOOLEAN
do
    from 
        i := 1
        Result := '%U'
    until
        i > word.count or stop
    loop
        ch := word[i]
        if ch = word[i + 1] then
            Result := ch
            stop := true
        end
        i := i + 1
    end
end

このバグを見つけるために最後の数時間を費やしましたが、常にすべてのテストに合格しています。

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

0

テストを検索してバグを見つけようとすることは正当なアプローチですが (Eiffel Studio にはこれを体系的に行う AutoTest が含まれています)、力ずくのアプローチです。

この場合、バグを見つけるよりインテリジェントなアルゴリズムを次に示します。

検討中のルーチン内のすべての機能呼び出しを調べます。すべての前提条件 (およびクラスの不変条件) をリストします。これらの前提条件または不変条件のいずれかを満たさないこのルーチンの条件があるかどうかを検討してください。そのような一連の条件が見つかった場合は、おそらくバグが見つかった可能性があります (前提条件が厳しすぎる場合、ルーチンは問題なく動作する可能性がありますが、その場合は別のバグが見つかりました)。次に、これらの特定の条件のテスト ケースを記述して、バグを実証 (および推論を検証) できます。

このアルゴリズムを使用すると、この場合にバグを見つけることができます (Jocelyn が行ったように)。

于 2016-01-08T07:51:32.707 に答える
0

i + 1バグは、コードが単語の有効なインデックスであるかどうかを確認するのを忘れていることだと思います。

このコードはどうですか?

first_repeated_character (word: STRING): CHARACTER
    -- First repeated character in `word'.
    -- If none, returns the null character '%U'.
  local
    i, n: INTEGER
    ch: CHARACTER
  do
    from 
        i := 1
        n := word.count
    until
        Result /= '%U' or i > n
    loop
        ch := word [i]
        if i + 1 <= n and then ch = word [i + 1] then
            Result := ch
        end
        i := i + 1
    end
  end
于 2016-01-07T21:12:05.880 に答える