程式作業:The function of Decoder is converting binary number input to decimal number output. (C++)

 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]);
			
        }
		
} ;

沒有留言:

張貼留言