如何在Eiffel编程语言中交换价值?

时间:2019-11-17 10:56:16

标签: eiffel

我在埃菲尔铁塔中这样定义以交换值。我们不能使用在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

1 个答案:

答案 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)

旁注。

  1. 尚不清楚为什么功能heap_sort返回整数。另外,它应指定类似

    的参数类型
    heap_sort (array: ARRAY [...]; N: INTEGER)
    
  2. 您真的需要N吗?可以使用array.lowerarray.upper检索数组的上下边界。

  3. 埃菲尔铁塔中的代码和声明被拆分,因此您可以编写

    local
        heap_side: INTEGER
    do
        heap_size := N
    
  4. until之后的表达式指定循环终止的条件。在当前条件i >= 2下,该循环将永远不会执行,因为i >= 2从一开始就是正确的。