circuitbuilder.cpp

来自「C++&datastructure书籍源码,以前外教提供现在与大家共享」· C++ 代码 · 共 206 行

CPP
206
字号
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

#include "gates.h"
#include "wires.h"
#include "simplemap.h"
#include "tvector.h"
#include "prompt.h"

class CircuitBuilder
{
  public:
    CircuitBuilder();
    
    void Build();
    void ShowGates() const;
    
  private:
  
    void DoAdd(istream& in);
    void DoConnect(istream& in);
    void DoIn(istream& in);
    void DoOut(istream& out);
    void DoHelp();
    void DoShow();
    void DoStop();
    void DoTest();
    
    SimpleMap<string,Gate*> myGates;
    SimpleMap<int,int> *    myConnections;
    CompositeGate * myCircuit;
    
};

CircuitBuilder::CircuitBuilder()
  : myConnections(0),
    myCircuit(0)
{
    myGates.insert("and",  new AndGate());
    myGates.insert("or",  new OrGate());
    myGates.insert("inverter", new Inverter());
}

void CircuitBuilder::Build()
{
    myCircuit = new CompositeGate();
    delete myConnections;
    myConnections = new SimpleMap<int,int>();
    string line,command;
    do
    {
       line = PromptlnString("command: ");
       istringstream input(line);
       input >> command;
       
       if (command == "add") 
       {   DoAdd(input);
       }
       else if (command == "connect")
       {   DoConnect(input);
       }
       else if (command == "help")
       {   DoHelp();
       }
       else if (command == "show")
       {   DoShow();
       }
       else if (command == "stop")
       {   DoStop();
       }
       else if (command == "in")
       {   DoIn(input);
       }
       else if (command == "out")
       {   DoOut(input);
       }
       else if (command == "test")
       {   DoTest();
       }
       else
       {   cout << "unrecognized command " << line << endl;
       }
    } while (line != "stop");
}

void CircuitBuilder::DoTest()
{
    GateTester::Test(myCircuit);
}

void CircuitBuilder::DoAdd(istream& in)
{
    string gateName;
    in >> gateName;
    if (gateName == "")
    {    do
         {   gateName = PromptlnString("gate name: ");
             if (gateName == "")
             {   ShowGates();
             }
         } while (gateName == "");
    }
    Gate * g = myGates.getValue(gateName);
    if (g == 0)
    {   cout << "unrecognized gate name " << gateName << endl;
    }
    else
    {   myCircuit->AddGate(g->clone());
    }
}

void CircuitBuilder::DoConnect(istream& in)
{
    int w1= -1, w2=-1;
    in >> w1 >> w2;
    if (w1 == -1 || w2 == -1)
    {   w1 = PromptlnRange("from wire number: ",0,2000);
        w2 = PromptlnRange("to wire number:  ",0,2000);
    }
    Connect(Gate::WireByNumber(w1),Gate::WireByNumber(w2));
    myConnections->insert(w1,w2);
}

void CircuitBuilder::DoIn(istream& in)
{
  int w1 = -1;
  in >> w1;
  if (w1 == -1)
  {   w1 = PromptlnRange("in wire: ",0,2000);
  }
  if (w1 != 0)
  {  myCircuit->AddIn(Gate::WireByNumber(w1));
  }
}

void CircuitBuilder::DoOut(istream& in)
{
  int w1 = -1;
  in >> w1;
  if (w1 == -1)
  {   w1 = PromptlnRange("out wire: ",0,2000);
  }
  if (w1 != 0)
  {  myCircuit->AddOut(Gate::WireByNumber(w1));
  }
}

void CircuitBuilder::DoShow()
{
    cout << "current circuit" << endl;
    cout << myCircuit->deepString() << endl;
    cout << endl << "connections" ;
    SimpleMapIterator<int,int> it(*myConnections);
    bool anyConnections = false;
    for(it.Init(); it.HasMore(); it.Next())
    {   cout << it.Current() << " to " << myConnections->getValue(it.Current()) << endl;
        anyConnections = true;
    }
    if (! anyConnections)
    {   cout << ": none" << endl;
    }
}

void CircuitBuilder:: DoStop()
{
   string name = PromptlnString("name for circuit: ");
   myGates.insert(name,myCircuit);
}

void CircuitBuilder::DoHelp()
{
   string commands[]= {"add", "connect", "help", "show", "stop", "in", "out", "test"}; 
   int count = sizeof(commands)/sizeof(string);
   int k;
   for(k=0; k < count; k++)
   {   cout << commands[k] << endl;
   }
   cout << "-----" << endl;
}

void CircuitBuilder::ShowGates() const
{
    SimpleMapIterator<string,Gate*> smapit(myGates);
    int count=0;
    for(smapit.Init(); smapit.HasMore(); smapit.Next())
    {   string g = smapit.Current();
        cout << count << ".\t" << g << endl;
        count++;
    }
}

int main()
{
    CircuitBuilder builder;
    
    builder.ShowGates();
    
    do
    {
        builder.Build();
    } while (true);
    
    return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?