2016-05-20 4 views
0

Ich arbeite an einem Logiksimulator in C++. Es ist ein Projekt eines Computertechnikkurses. Dieser Simulator empfängt zwei Eingabedateien, die Schaltungsbeschreibung und Eingabemuster. Die Schaltungsbeschreibung enthält die Anzahl von Eingang und Ausgang und die Gatter; Beispiel: AND2 I1, I2, N1 // ist ein UND-Gatter mit zwei Eingängen und einem Knoten N1 als Ausgang. Ich denke, es mit Struktur oder Liste zu implementieren, aber ich weiß nicht, wie alle Knoten verbunden werden und wie eine Funktion geschrieben wird, die die Ausgabe (oder Ausgaben) auswertet.Logiksimulator C++ mit Listenimplementierung

+1

Graph-Theorie scheint wie ein gutes Thema zu lesen. –

+0

zeigen Sie uns, was Sie bisher getan haben –

+0

@JoachimPileborg Wir haben nur Liste in der Theorie, so dass ich glaube nicht, dass in diesem Projekt kann ich Graph-Theorie verwenden. – user46

Antwort

0

Sie könnten die Gatter als Klassen modellieren, die Eingänge haben und eine Ausgabe erzeugen. Zum Beispiel:

class Gate 
{ 
public: 
    virtual ~Gate() {} 
    virtual bool read() = 0; 
}; 

class AndGate : public Gate 
{ 
private: 
    Gate *m_Input1; 
    Gate *m_Input2; 

public: 
    AndGate(Gate *input1, Gate *input2) : m_Input1(input1), m_Input2(input2) 
    { 
    } 

    bool read() override 
    { 
     return m_Input1->read() & m_Input2->read(); 
    } 
}; 

class OrGate : public Gate 
{ 
private: 
    Gate *m_Input1; 
    Gate *m_Input2; 

public: 
    OrGate(Gate *input1, Gate *input2) : m_Input1(input1), m_Input2(input2) 
    { 
    } 

    bool read() override 
    { 
     return m_Input1->read() | m_Input2->read(); 
    } 
}; 


class NotGate : public Gate 
{ 
private: 
    Gate *m_Input; 

public: 
    NotGate(Gate *input) : m_Input(input) 
    { 
    } 

    bool read() override 
    { 
     return !m_Input->read(); 
    } 
}; 

class ConstantLine : public Gate 
{ 
private: 
    bool m_State; 

public: 
    ConstantLine(bool state) : m_State(state) 
    { 
    } 

    bool read() override 
    { 
     return m_State; 
    } 
}; 

Dies gibt Ihnen im Grunde ein Diagramm Netzwerk. Sie können jetzt die Tore zusammenstecken. Zum Beispiel ((X | Y) & !Z) berechnen würden Sie tun:

ConstantLine x(true); 
ConstantLine y(false); 
ConstantLine z(true); 

NotGate notGate(&z); 
OrGate orGate(&x, &y); 
AndGate andGate(&orGate, &notGate); 

bool result = andGate.read(); 

In Ihrer Lösung werden Sie dynamisch die Tore zu schaffen, so stattdessen rohen Zeiger zu verwenden, sollten Sie einen Smart-Pointer, wie std::shared_pointer<Gate> verwenden, um die Eingänge zu dem verwalten Tor.

+0

Danke für die Antwort. Mit dieser Lösung kann ich ein Modell der Schaltung erstellen und nach dem Lesen der Datei der Eingabe und laden Sie den Wert? Da die Eingabedatei sehr groß sein kann, kann ich keinen Vektor von constantLine verwenden (in diesem Fall), um sie zu speichern. – user46

+0

@ user46 - eine Menge wird davon abhängen, wie die Datei die Tore spezifiziert. Es kann sein, dass Sie keinen Vektor oder eine Liste benötigen, um die Gatter zu speichern, da die Grafik der Gatter, die Sie zusammensetzen, ausreichend sein kann. – Sean

+0

Ok. Vielen Dank – user46