这是课程的一部分。该类称为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
答案 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)
具有相同的效果。