0

我正在埃菲尔为学校实验室编程,其中一项任务是在给定算法中找到错误。该算法返回第一个重复的字符。

该算法的工作原理如下:

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

我认为错误是代码忘记检查是否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 回答
0

虽然尝试通过搜索测试来查找错误是一种合法的方法(并且 Eiffel Studio 包括 AutoTest,它会为您系统地执行此操作),但它是一种蛮力方法。

这是一个更智能的算法,可以在这种情况下找到错误:

检查正在考虑的例程中的每个功能调用。列出它的所有前提条件(加上类不变量)。考虑此例程是否有任何条件无法满足这些先决条件或不变量中的任何一个。如果您找到这样一组条件,那么您可能已经找到了一个错误(如果先决条件过于严格,那么例程可能仍然有效 - 但在这种情况下,您发现了另一个错误)。然后,您可以针对这些特定条件编写测试用例来演示错误(并验证您的推理)。

使用此算法,您将在这种情况下找到错误(就像 Jocelyn 所做的那样)。

于 2016-01-08T07:51:32.707 回答