Eiffel算法:第一个重复字符

时间:2016-01-07 20:52:55

标签: eiffel

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

该算法的工作原理如下:

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

我花了最后几个小时试图找到这个中的错误,但它总是通过所有测试。

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

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