The function of Decoder is converting binary number input to decimal number output.
The decoder works only when "enable" is true.
Please finish the class "Decoder4_16" according to the given classes.
"Decoder4_16" should be composed of "Decoder2_4".
You could add any function if you need.
- Decoder4_16() :create entities for class members.
- Decoder4_16(bool) : set the value of "enable" when declare a Decoder4_16 and create entities for class members.
- setEnable(bool) : set the value of "enable"
- setEnable(Gate *) : set the value of "enable"
- setValue(bool, int) : set the value to the assigned "input". For example, a.setValue(false, 1) means that the "input[1]" of a is setting to false.
- setValue(Gate *, int) : set the value to the assigned "input". For example, a.setValue(b, 1) means that the "input[1]" of a is b.
- operator[ ](int) : return the the wanted output gate according to the parameter. For the example below, "dec[3]" is true, so the returned gate's output is true, assuming that dec is Decode4_16.
- operator<<(ostream, Decoder4_16) : return all the value of the decoder. For the example below, "cout << dec" returns "0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ",assuming that dec is Decode4_16.
- output() : return the corresponding decimal value(0~15). For the example below, "output()" is 3.
- ////////////////////////////////////////////
- /*
- Decoder的作用是將輸入的二進制數轉換為十進制數輸出。
- 解碼器僅在“enable”為真時工作。
- 請根據給定的課程完成“Decoder4_16”課程。
- “Decoder4_16”應該由“Decoder2_4”組成。
- 如果需要,您可以添加任何功能。
- Decoder4_16() :為類成員創建實體。
- Decoder4_16(bool) :在聲明 Decoder4_16 並為類成員創建實體時設置“enable”的值。
- setEnable(bool) :設置“enable”的值
- setEnable(Gate *) : 設置“enable”的值
- setValue(bool, int) :將值設置為指定的“輸入”。例如,a.setValue(false, 1) 表示 a 的“input[1]”設置為 false。
- setValue(Gate *, int) :將值設置為分配的“輸入”。例如a.setValue(b, 1)表示a的“input[1]”為b。
- operator[ ](int) :根據參數返回想要的輸出門。對於下面的示例,“dec[3]”為真,因此返回的門的輸出為真,假設 dec 是 Decode4_16。
- operator<<(ostream, Decoder4_16) :返回解碼器的所有值。對於下面的示例,“cout << dec”返回“0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0”,假設 dec 是 Decode4_16。
- output() : 返回對應的十進制值(0~15)。對於下面的示例,“output()”為 3。
- */
- class Gate
- {
- public :
- Gate *input[2] ;
- virtual bool output() = 0 ;
- virtual void setValue(Gate *, int) = 0 ;
- virtual void setValue(bool, int) = 0 ;
- } ;
- class TRUE : public Gate
- {
- public :
- bool output() { return 1 ; }
- virtual void setValue(Gate *, int) {}
- virtual void setValue(bool, int) {}
- } ;
- class FALSE : public Gate
- {
- public :
- bool output() { return 0 ; }
- virtual void setValue(Gate *, int) {}
- virtual void setValue(bool, int) {}
- } ;
- TRUE t ;
- FALSE f ;
- class NOT : public Gate
- {
- public :
- bool output() { return !(this -> input[0] -> output()) ; }
- virtual void setValue(bool val, int pin = 0)
- {
- if(val) this -> input[0] = &t ;
- else this -> input[0] = &f ;
- }
- virtual void setValue(Gate* gate, int pin = 0) { this -> input[0] = gate ; }
- } ;
- class NAND : public Gate
- {
- public :
- bool output() { return !(this -> input[0] -> output()) || !(this -> input[1] -> output()) ; }
- virtual void setValue(Gate *gate, int pin) { this -> input[pin] = gate ; }
- virtual void setValue(bool val, int pin)
- {
- if(val) setValue(&t, pin) ;
- else setValue(&f, pin) ;
- }
- } ;
- class NOR : public Gate
- {
- public :
- bool output() { return !(this -> input[0] -> output()) && !(this -> input[1] -> output()) ; }
- virtual void setValue(Gate *gate, int pin) { this -> input[pin] = gate ; }
- virtual void setValue(bool val, int pin)
- {
- if(val) setValue(&t, pin) ;
- else setValue(&f, pin) ;
- }
- } ;
- //“AND”必須由“NOT”和“NAND”組成。
- class AND : public Gate
- {
- public :
- AND() : Gate()
- {
- component[0] = new NOT ;
- component[1] = new NAND ;
- }
- virtual bool output()
- {
- component[1] -> input[0] = this -> input[0] ;
- component[1] -> input[1] = this -> input[1] ;
- component[0] -> input[0] = component[1] ;
- return component[0] -> output() ;
- }
- private :
- Gate *component[2] ;
- } ;
- //“OR”必須由“NOT”和“NOR”組成。
- class OR : public Gate
- {
- public :
- OR() : Gate()
- {
- component[0] = new NOT ;
- component[1] = new NOR ;
- }
- virtual bool output()
- {
- component[1] -> input[0] = this -> input[0] ;
- component[1] -> input[1] = this -> input[1] ;
- component[0] -> input[0] = component[1] ;
- return component[0] -> output() ;
- }
- private :
- Gate *component[2] ;
- } ;
- //“XOR” 可以由任何門組成(包括內置閘和自己實現的上面閘)。
- class XOR : public Gate
- {
- public :
- XOR() : Gate()
- {
- }
- virtual bool output() { return (this -> input[0] -> output()) ^ (this -> input[1] -> output()) ; }
- private :
- } ;
- class Decoder
- {
- public :
- virtual void setValue(bool, int) = 0 ;
- virtual void setValue(Gate *, int) = 0 ;
- virtual void setEnable(bool) = 0 ;
- virtual void setEnable(Gate *) = 0 ;
- virtual int output() = 0 ;
- virtual Gate *operator[](int) = 0 ;
- protected :
- Gate *enable ;
- } ;
- class Decoder2_4 : public Decoder
- {
- public :
- Decoder2_4() : Decoder2_4(0) {}
- Decoder2_4(bool val)
- {
- if(val) this -> enable = &t ;
- else this -> enable = &f ;
- for(int i = 0 ; i < 2 ; i++)
- component[i] = new NOT ;
- for(int i = 2 ; i < 6 ; i++)
- component[i] = new AND ;
- for(int i = 0 ; i < 4 ; i++)
- enables[i] = new AND ;
- }
- virtual void setEnable(bool val)
- {
- if(val) this -> enable = &t ;
- else this -> enable = &f ;
- }
- virtual void setEnable(Gate *gate) { this -> enable = gate ; }
- virtual void setValue(Gate *gate, int i) { component[i % 2] -> input[0] = gate ; }
- virtual void setValue(bool val, int i)
- {
- if(val) component[i % 2] -> input[0] = &t ;
- else component[i % 2] -> input[0] = &f ;
- }
- virtual Gate *operator[](int n)
- {
- _out() ;
- switch(n)
- {
- case 0 : return enables[0] ;
- case 1 : return enables[1] ;
- case 2 : return enables[2] ;
- case 3 : return enables[3] ;
- default : return nullptr ;
- }
- }
- friend ostream &operator<<(ostream &out, Decoder2_4 dec)
- {
- for(int i = 3 ; i >= 0 ; i--)
- out << dec[i] -> output() << " " ;
- return out ;
- }
- virtual int output()
- {
- for(int i = 0 ; i < 4 ; i++)
- if(enables[i] -> output()) return i ;
- }
- private :
- Gate *component[6] ;
- Gate *enables[4] ;
- void _out()
- {
- component[2] -> input[0] = component[0] ;
- component[2] -> input[1] = component[1] ;
- component[3] -> input[0] = component[0] -> input[0] ;
- component[3] -> input[1] = component[1] ;
- component[4] -> input[0] = component[0] ;
- component[4] -> input[1] = component[1] -> input[0] ;
- component[5] -> input[0] = component[0] -> input[0] ;
- component[5] -> input[1] = component[1] -> input[0] ;
- for(int i = 0 ; i < 4 ; i++)
- {
- enables[i] -> input[0] = this -> enable ;
- enables[i] -> input[1] = component[i + 2] ;
- }
- }
- } ;
- class Decoder4_16 : public Decoder
- {
- public :
- Decoder4_16() : Decoder4_16(0) {} {}
- // set the value of "enable" when declare a Decoder4_16 and create entities for class members.
- Decoder4_16(bool val) {
- for(int i = 0 ; i < 5 ; i++)
- dec2_4[i] = new Decoder ;
- if(val) dec2_4[0] -> enable = &t ;
- else dec2_4[0] -> enable = &f ;
- }
- virtual void setEnable(bool val) {
- dec2_4[0]->setEnable(val);
- }
- virtual void setEnable(Gate *gate) {
- dec2_4[0]->setEnable(gate);
- }
- virtual void setValue(bool val, int pin) {
- if (pin==0) { for(int i=1;i<5;i++) dec2_4[i]->setValue(val, 0); }
- else if (pin==1) { for(int i=1;i<5;i++) dec2_4[i]->setValue(val, 1); }
- else if (pin==2) { dec2_4[0]->setValue(val, 0); }
- else if (pin==3) { dec2_4[0]->setValue(val, 1);}
- _Decode();
- }
- virtual void setValue(Gate *gate, int pin) {
- if (pin==0) { for(int i=1;i<5;i++) dec2_4[i]->setValue(gate, 0); }
- else if (pin==1) { for(int i=1;i<5;i++) dec2_4[i]->setValue(gate, 1); }
- else if (pin==2) { dec2_4[0]->setValue(gate, 0); }
- else if (pin==3) { dec2_4[0]->setValue(gate, 1);}
- _Decode();
- }
- virtual Gate *operator[](int n) {
- switch(n)
- {
- case 0 : return dec2_4[0] ;
- case 1 : return dec2_4[1] ;
- case 2 : return dec2_4[2] ;
- case 3 : return dec2_4[3] ;
- case 4 : return dec2_4[4] ;
- default : return nullptr ;
- }
- }
- friend ostream &operator<<(ostream &out, Decoder4_16 dec) {
- for(int i = 4 ; i >= 1 ; i--)
- for(int j = 3 ; j >= 0 ; i--)
- out << dec.ec2_4[i][j] -> output() << " " ;
- return out ;
- }
- // output() : 返回對應的十進制值(0~15)。
- int output() {
- int i,j;
- i=dec2_4[1]->output() ;
- j:= dec2_4[2]-> output(); if (j>0) i=i+4+j;
- j:= dec2_4[3]-> output(); if (j>0) i=i+8+j;
- j:= dec2_4[4]-> output(); if (j>0) i=i+12+j;
- return i;
- }
- private :
- Decoder *dec2_4[5] ;
- void _Decode()
- {
- Decoder *dec=dec2_4[0];
- dec2_4[1]->setEnable(dec[0]);
- dec2_4[2]->setEnable(dec[1]);
- dec2_4[3]->setEnable(dec[2]);
- dec2_4[4]->setEnable(dec[3]);
- }
- } ;
沒有留言:
張貼留言