1

ユーザーが仮想論理ゲートからデジタル回路を構築できるようにするプログラムに取り組んでいます。すべてのゲートは、特定のゲート タイプを表すクラスのインスタンスになります。たとえば、AND クラスは次のようになります。

public class andgate
{
    public andgate()
    {
        inputs = new bool[7];
        for (int i = 0; i < 7; i++) inputs[i] = true;
        output = (inputs[0] && inputs[1] && inputs[2] && inputs[3] && inputs[4] && inputs[5] && inputs[6]);
    }
    public bool[] inputs;
    public bool output;
}

すべてのゲートには 7 つの入力がありますが、すべてを使用する必要はありません (つまり、3 つの入力を持つゲートの場合、残りの 4 つは AND の中立要素である「1」になります)。各入力は、別のゲートの出力または bool 配列 (入力ベクトルを格納する) の要素への参照であるため、1 つのゲートによって生成された信号は自動的に次のゲートに送信されます。問題は、信号をゲート内で動的に送信する必要があることです。つまり、AND ゲートの入力信号の 1 つが 0 に設定されている場合、出力の値は自動的に 0 になります。したがって、回路の入力にバイナリ ベクトルを供給すると、回路の出力の値が変更されます。それとも、個々のゲートから回路を構築するよりも回路をシミュレートする簡単な方法があるでしょうか? テストパターンの生成に必要です。

4

3 に答える 3

4

プロパティoutputを読み取り専用にします。

public bool output
{
    get
    {
        return inputs.All(i => i);
    }
}

すべての入力をANDする代わりに、偽の入力があるかどうかを確認してください。

もちろんoutput、コンストラクターでへの割り当てを削除する必要があります。これにより、outputプロパティが「動的」になります。

値が信号がないことを示すbool?[]ように、代わりに入力を に変更することもできます。null次に、入力配列の初期化をすべて true に削除し、出力の戻り値を次のように変更する必要があります。

return inputs.All(i => i.GetValueOrDefault(true));

コメント内のTim Sの提案で編集

于 2012-11-23T00:55:15.833 に答える
0

状態が変化したときに依存オブジェクトに通知できるように、イベントをゲートに追加する必要があるようです。このようなもの:

public class AndGate
{

    private bool[] inputs;
    private bool output;

    public bool[] Inputs 
    {
        get
        {
            return this.inputs;
        }
        set
        {
            this.inputs = value; 
            UpdateOutput();     
        }
    }
    public bool Output
    {
        get
        {
            return this.output;
        }
    }

    public AndGate()
    {
        inputs = new bool[7];
        for (int i = 0; i < 7; i++) inputs[i] = true;
        UpdateOutput();
    }

    private void UpdateOutput()
    {
        bool original = output;
        output = true;
        for(int i=0; i<inputs.Length; i++)
        {
            output = output && inputs[i];
        }
        if (original != output)
        {
            OnChanged(EventArgs.Empty);
        }
    }

    public event GateStateChangedEventHandler StateChanged;  
    protected virtual void OnChanged(EventArgs e) 
    {
        if (StateChanged != null) 
        {
            StateChanged(this, e);
        }
    }

}
于 2012-11-23T01:03:46.880 に答える
0

このためには、プロパティで追加の計算を実行できるため、プロパティを使用して入力を設定/取得する必要があります。保持している状態変数は非公開にする必要があります。

public bool[] Inputs {
    set {
        inputs = value;
    }
}

public bool Output {
    get {
        return inputs[0] && inputs[1] ...
    }
}

配列を公開することは、クラスが物を格納する方法に関する情報を実際に公開することになるため、適切な OOP のために可能な限り避ける必要があるため、Inputs プロパティに対してこれを行うことは避けます。たとえば、ReadOnlyCollection の方が適している場合があります。

ただし、一般的な設計を再考し、任意の数の入力を避けるようにします.7.その値はどこから思いついたのですか?

より単純なアプローチは、ゲートが A と B の 2 つの値を取り、コンストラクターまたは個々のプロパティで値を設定できると仮定することです。

次に、バイナリ論理ゲートの操作が連想的であるという事実を利用するため、a、b、c を取る AND ゲートは、a、b を取るものと同等であり、その出力を別の c を取るものに供給します。とにかく、これは実際に回路を構築する方法です。ただし、考慮する必要がある問題は、ゲートのレイテンシです。

于 2012-11-23T01:00:37.833 に答える