我在埃菲尔铁塔中这样定义以交换值。我们不能使用在c ++中定义的方式。
swap(x,y):INTEGER
do
x;y := y;x
end
如何在Eiffel中定义函数? 我想定义堆排序,但是它显示了一些错误,有人可以帮助我清除对函数的怀疑。
heapsort(array,N):INTEGER -- heap_sort
do
heap_size : INTEGER
heap_size := N
build(array,N)
from i := N until i >=2 loop
swap(array(1), array(i))
heap_size := heap_size-1
heapify(array,1,heap_size-1)
end
end
答案 0 :(得分:0)
Eiffel中的所有变量都按值传递,因此无法传递两个变量或表达式并交换它们的值。结果,swap
应该看起来像
swap (i, j: INTEGER; data: ARRAY [...]) -- Here and below `...` stands for the type of elements.
-- Swap items of `data` at indexes `i` and `j`.
require
valid_i: data.valid_index (i)
valid_j: data.valid_index (j)
local
value: ...
do
value := data [i]
data [i] := data [j]
data [j] := value
ensure
new_at_i: data [i] = old data [j]
new_at_j: data [j] = old data [i]
end
然后,在您的示例中对该过程的调用看起来像
swap (1, i, array)
旁注。
尚不清楚为什么功能heap_sort
返回整数。另外,它应指定类似
heap_sort (array: ARRAY [...]; N: INTEGER)
您真的需要N
吗?可以使用array.lower
和array.upper
检索数组的上下边界。
埃菲尔铁塔中的代码和声明被拆分,因此您可以编写
local
heap_side: INTEGER
do
heap_size := N
until
之后的表达式指定循环终止的条件。在当前条件i >= 2
下,该循环将永远不会执行,因为i >= 2
从一开始就是正确的。