Ασκήσεις

Άσκηση 2

  1. Να υλοποιηθούν σε C++ οι κλάσεις andgate, orgate, notgate. Οι κλάσεις αυτές θα προσομοιάζουν τις αντίστοιχες λογικές πύλες. Κάθε κλάση να έχει μεθόδους που να θέτουν τις εισόδους (π.χ. seta, setb) και μέθοδο που να επιστρέφει την τιμή της εξόδου (π.χ. getoutput).
  2. Με τη χρήση των παραπάνω κλάσεων (και μόνο) να υλοποιήσετε μια κλάση που να προσομοιάζει έναν ημιαθροιστή. Η κλάση αυτή να έχει μεθόδους που να θέτουν τις δύο εισόδους και μεθόδους που να επιστρέφουν το άθροισμα και το κρατούμενο.
  3. Να γράψετε ένα πρόγραμμα σε C++ που να τυπώνει τους πίνακες αλήθειας για τις παραπάνω κλάσεις.
  4. (Προαιρετικά) Με τη χρήση των παραπάνω κλάσεων να υλοποιήσετε μια κλάση που να προσομοιάζει έναν πλήρη αθροιστή. Η κλάση αυτή πρέπει να έχει μεθόδους που να θέτουν τις δύο εισόδους και το κρατούμενο εισόδου καθώς και μεθόδους που να επιστρέφουν το άθροισμα και το κρατούμενο εξόδου. Με τη χρήση του πλήρη αθροιστή και τους τελεστές bit της C μπορεί να υλοποιηθεί μια κλάση αθροιστή ακεραίων αριθμών (wordadder) με τον παρακάτω τρόπο:
    /*
     * wordadder.h
     *
     * D. Spinellis, February 2000
     */

    class wordadder {
    private:
            unsigned int a, b;                      // Input values
    public:
            void seta(unsigned int v);              // Set input a
            void setb(unsigned int v);              // Set input b
            unsigned int getsum();                  // Return sum
    };

    /*
     * wordadder.cpp
     *
     * D. Spinellis, February 2000
     */

    #include "wordadder.h"
    #include "fulladder.h"

    void
    wordadder::seta(unsigned int v)
    {
            a = v;
    }

    void
    wordadder::setb(unsigned int v)
    {
            b = v;
    }


    unsigned int
    wordadder::getsum()
    {
            fulladder fa[sizeof(unsigned int) * 8];
            unsigned int i, bit;
            unsigned int result = 0;

            fa[0].setcarryin(false);
            for (i = 0, bit = 1; bit; bit <<= 1, i++) {
                    fa[i].seta(a & bit);
                    fa[i].setb(b & bit);
                    if (bit << 1)           // Do carry-over the last bit
                            fa[i + 1].setcarryin(fa[i].getcarryout());
                    if (fa[i].getsum())
                            result |= bit;
            }
            return (result);
    }
    Ο αθροιστής αυτός μπορεί να χρησιμοποιηθεί ως εξής:
            wordadder add;
            int a, b;

            cin >> a;
            cin >> b;
            add.seta(a);
            add.setb(b);
            cout << a << "+" << b << "=" << add.getsum();
    Δοκιμάστε το!