在埃菲尔铁塔

时间:2016-03-19 00:45:51

标签: eiffel

这是课程的一部分。该类称为BAG [G - > {HASHABLE,COMPARABLE}] 它继承自ADT_BAG,它具有延迟功能,如count,extend,remove,remove_all,add_all ... more,以及要重新实现的域。

域返回ARRAY [G],这是G

的排序数组列表

我总是遇到违反条件后的情况" value_semantics"这与对象比较有关,但是我检查了并且没有用于对象比较的代码,这非常奇怪。

我尝试多次重新编写域功能的代码,并且最终会出现条件违规或失败。

当我检查调试器时,数组" a"从域返回的总是有0,但这没有意义,因为我将键从表移动到" a"但是数量仍然是0。

也许我将错误的密钥传输到阵列?

代码:

count: INTEGER
        -- cardinality of the domain
    do
        result := domain.count -- has to be domain.count because loop invariant: consistent: count = domain.count
    end


domain: ARRAY[G]
        -- sorted domain of bag
    local
        tmp: G
        a: ARRAY[G]

    do
        create a.make_empty

        across 1 |..| (a.count) as i  -- MOVING keys from table to array
          loop
                across table as t
                  loop
                       if not a.has (t.key) then
                            a.enter (t.key, i.item)
                            i.forth
                       end
                  end

           end

        across 1 |..| (a.count-1) as i  -- SORTING
          loop
                if a[i.item] > a[i.item+1] then
                    tmp := a[i.item]
                    a[i.item] := a[i.item+1]
                    a[i.item+1] := tmp
                end

           end

    Result := a

    ensure then
        value_semantics: Result.object_comparison -- VIOLATION THROWN HERE
        correct_items: across 1 |..| Result.count as j all
            has(Result[j.item]) end
        sorted: across 1 |..| (Result.count-1) as j all
            Result[j.item] <= Result[j.item+1] end
    end

测试代码:

     t3: BOOLEAN
    local
        sorted_domain: ARRAY[STRING]
    do
        comment("t3:test sorted domain")
        sorted_domain := <<"bolts", "hammers", "nuts">>
        sorted_domain.compare_objects
        Result := bag2.domain ~ sorted_domain -- fails here
        check Result end
    end

1 个答案:

答案 0 :(得分:1)

第一个循环across 1 |..| (a.count) as i不会进行单次迭代,因为a在开头是空的(没有元素)。实际上,它刚刚使用create a.make_empty创建。

此外,由于表中的键是唯一的,因此检查是否已将键添加到结果数组中是没用的:测试not a.has (t.key)将始终成功。

因此,第一个循环应该遍历表的键并将它们添加到结果数组中。在这种情况下,功能{ARRAY}.force可能是有意义的。新元素的添加不应该产生任何&#34;孔&#34;虽然在阵列中。实现此目的的一种方法是在数组的当前上限之后添加一个新元素。

排序循环也不正确。与前一个相比,情况相反:排序不能在单个循环中完成,至少需要两个嵌套循环。该模板似乎使用插入排序,可以找到其算法elsewhere

编辑:原始答案提到{ARRAY}.extend而不是{ARRAY}.force。很遗憾{ARRAY}.extend通常不可用,但a.extend (x)a.force (x, a.upper + 1)具有相同的效果。