0

下の図の主な問題は、「check Result end」ステートメントが追加されると、自動的に失敗し、デバッガーに「CHECK_VIOLATION」エラーが表示されることです。

また、HASH_TABLE はそれに与えられたすべてのアイテムを保存するわけではありませんが、現在の HASH_TABLE[INTEGER, G] を使用する代わりに HASH_TABLE[G, INTEGER] を切り替えることで修正しました

私の主な問題は、Check_violation が常にスローされ、「チェック結果の終了」ステートメントが表示されるたびに失敗するのはなぜですか? HAS[...]関数が悪いのでしょうか?

現在、「チェック結果の終了」を含むテストケース機能はすべてfalseになり、CHECK_VILOATIONがスローされます

ここに画像の説明を入力

コード:

class
  MY_BAG[G -> {HASHABLE, COMPARABLE}]
inherit
  ADT_BAG[G]

create
  make_empty, make_from_tupled_array

convert
   make_from_tupled_array ({ARRAY [TUPLE [G, INTEGER]]})

feature{NONE} -- creation

    make_empty
     do
        create table.make(1)
     end

    make_from_tupled_array (a_array: ARRAY [TUPLE [x: G; y: INTEGER]])
     require else
        non_empty: a_array.count >= 0
        nonnegative: is_nonnegative(a_array)
      do

        create table.make(a_array.count)

        across a_array as a
            loop
                 table.force (a.item.y, a.item.x)

            end
      end

feature -- attributes

  table: HASH_TABLE[INTEGER, G]
  counter: INTEGER

テストコード:

  t6: BOOLEAN
    local
        bag: MY_BAG [STRING]
    do
        comment ("t6:repeated elements in contruction")
        bag := <<["foo",4], ["bar",3], ["foo",2], ["bar",0]>> -- test passes
        Result := bag ["foo"] = 5 -- test passes
        check Result end  -- test fails (really weird but as soon as check statement comes it fails)
        Result := bag ["bar"] = 3
        check Result end
        Result := bag ["baz"] = 0


    end
4

1 に答える 1

1

ほとんどの場合、ADT_BAG はマルチセット (バッグとも呼ばれます) の抽象化を表し、アイテムを保持し、指定されたアイテムに等しいアイテムがいくつあるかを伝えることができます (最大で 1 つのアイテムが存在するセットとは異なります)。であればHASH_TABLE [INTEGER, G]収納として使うのが正解です。その場合、そのキーは要素であり、そのアイテムは要素番号です。

したがって、同じ要素を複数回追加すると、その数を増やす必要があります。"foo"初期化行では、 の 4 つの要素、 の 3 つの"bar"要素、 again の 2 つの要素"foo"、および again の 0つの要素を追加"bar"します。その結果、 の 6 つの要素"foo"と の 3 つの要素を含むバッグが必要になり"bar"ます。また、要素はありません"baz"

この分析によると、初期化が正しくない ( の数値が異なる必要がある) か、 の代わりに"foo"の比較を行う必要があります。65

クラスの実装に関しては、機能(または のインターフェースで指定された名前)MY_BAGを持つことが考えられます。addADT_BAG

  1. 指定されたキーを持つアイテムがあるかどうかを確認します。
  2. 存在しない場合は、指定されたカウントで新しい要素を追加します。
  3. それ以外の場合は、現在の要素数を現在の要素数と指定された要素数の合計で置き換えます。

簡単にするために、初期化手順では、アイテムをハッシュ テーブルに直接格納して、繰り返されるアイテムを正しく処理する代わりに、この機能を使用して新しいアイテムを追加します。

于 2016-03-17T07:13:32.173 に答える