我正在埃菲尔为一所学校实验室编程,其中一项任务是找到给定算法中的错误。该算法返回第一个重复的字符。
该算法的工作原理如下:
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
我花了最后几个小时试图找到这个中的错误,但它总是通过所有测试。
非常感谢任何帮助。感谢。
答案 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所做的那样)。