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 + -
显示快捷键?