Mega Code Archive

 
Categories / C++ Tutorial / Data Types
 

A set class for characters

/* Quote from: C++: A Beginner's Guide, Second Edition  # Publisher: McGraw-Hill Osborne Media; 2 edition (December 3, 2003) # Language: English # ISBN-10: 0072232153 # ISBN-13: 978-0072232158 */ #include <iostream>  using namespace std;      const int MaxSize = 100;    class Set {        int len; // number of members     char members[MaxSize]; // this array holds the set          /* The find() function is private because it        is not used outside the Set class. */     int find(char ch); // find an element    public:       // Construct a null set.     Set() { len = 0; }        // Return the number of elements in the set.    int getLength() { return len; }       void showset(); // display the set    bool isMember(char ch);  // check for membership      Set operator +(char ch); // add an element      Set operator -(char ch); // remove an element      Set operator +(Set ob2); // set union    Set operator -(Set ob2); // set difference    };        /* Return the index of the element      specified by ch, or -1 if not found. */  int Set::find(char ch) {     int i;            for(i=0; i < len; i++)       if(members[i] == ch) return i;        return -1;   }     // Show the set.  void Set::showset() {    cout << "{ ";    for(int i=0; i<len; i++)      cout << members[i] << " ";      cout << "}\n";  }     /* Return true if ch is a member of the set.     Return false otherwise. */  bool Set::isMember(char ch) {     if(find(ch) != -1) return true;    return false;  }     // Add a unique element to a set.      Set Set::operator +(char ch) {      Set newset;      if(len == MaxSize) {      cout << "Set is full.\n";      return *this; // return existing set    }      newset = *this; // duplicate the existing set          // see if element already exists     if(find(ch) == -1) { // if not found, then add       // add new element to new set       newset.members[newset.len] = ch;       newset.len++;     }     return newset; // return updated set   }         // Remove an element from the set.      Set Set::operator -(char ch) {      Set newset;    int i = find(ch); // i will be -1 if element not found        // copy and compress the remaining elements     for(int j=0; j < len; j++)       if(j != i) newset = newset + members[j];        return newset;   }         // Set union.   Set Set::operator +(Set ob2) {      Set newset = *this; // copy the first set        // Add unique elements from second set.    for(int i=0; i < ob2.len; i++)        newset = newset + ob2.members[i];        return newset; // return updated set   }      // Set difference.   Set Set::operator -(Set ob2) {      Set newset = *this; // copy the first set        // Subtract elements from second set.     for(int i=0; i < ob2.len; i++)        newset = newset - ob2.members[i];        return newset; // return updated set   }     // Demonstrate the Set class.      int main() {        // construct 10-element empty Set       Set s1;        Set s2;    Set s3;       s1 = s1 + 'A';     s1 = s1 + 'B';     s1 = s1 + 'C';        cout << "s1 after adding A B C: ";      s1.showset();      cout << "\n";      cout << "Testing for membership using isMember().\n";     if(s1.isMember('B'))      cout << "B is a member of s1.\n";    else      cout << "B is not a member of s1.\n";      if(s1.isMember('T'))      cout << "T is a member of s1.\n";    else      cout << "T is not a member of s1.\n";      cout << "\n";      s1 = s1 - 'B';     cout << "s1 after s1 = s1 - 'B': ";      s1.showset();       s1 = s1 - 'A';     cout << "s1 after s1 = s1 - 'A': ";      s1.showset();       s1 = s1 - 'C';     cout << "s1 after a1 = s1 - 'C': ";      s1.showset();      cout << "\n";      s1 = s1 + 'A';     s1 = s1 + 'B';     s1 = s1 + 'C';     cout << "s1 after adding A B C: ";      s1.showset();       cout << "\n";      s2 = s2 + 'A';     s2 = s2 + 'X';     s2 = s2 + 'W';        cout << "s2 after adding A X W: ";      s2.showset();       cout << "\n";      s3 = s1 + s2;     cout << "s3 after s3 = s1 + s2: ";      s3.showset();       s3 = s3 - s1;     cout << "s3 after s3 - s1: ";      s3.showset();       cout << "\n";      cout << "s2 after s2 = s2 - s2: ";      s2 = s2 - s2;  // clear s2     s2.showset();       cout << "\n";      s2 = s2 + 'C'; // add ABC in reverse order     s2 = s2 + 'B';     s2 = s2 + 'A';       cout << "s2 after adding C B A: ";      s2.showset();       return 0;  } s1 after adding A B C: { A B C } Testing for membership using isMember(). B is a member of s1. T is not a member of s1. s1 after s1 = s1 - 'B': { A C } s1 after s1 = s1 - 'A': { C } s1 after a1 = s1 - 'C': { } s1 after adding A B C: { A B C } s2 after adding A X W: { A X W } s3 after s3 = s1 + s2: { A B C X W } s3 after s3 - s1: { X W } s2 after s2 = s2 - s2: { } s2 after adding C B A: { C B A }