|
//file : p019_p15.cpp //author: AOU //date : 07/28/2004 /* Project #15 07/28/2004 bool operator ==(const CArray &a2) const; bool operator !=(const CArray &a2) const; CArray(const CArray &a2); CArray operator =(const CArray &a2); bool deleteAtHead(void); bool deleteAtTail(void); Project #14 07/27/2004 bool has(int x) const; bool hasDistinctValues(void) const void shuffle(void); CArray(char ch); //when ch=='s' ch='d' void test_constructor_s(void); void test_has(void); void test_constructor_d(void); void test_hasDistinctValues(void); void test_shuffle(void); Project #13 07/26/2004 void sortBubble(void); bool isSorted(void) const; int deleteAll(void); ~CArray(void); Project #12 07/23/2004 void populate(void); CArray(int m); CArray(char ch); //when ch=='r' friend ostream & operator << (ostream &bob , const CArray &a); Project #11 07/22/2004 CArray operator -(const CArray &a2) const; friend bool isEmpty(const CArray ta); Project #10 07/21/2004 bool operator <= (const CArray &a2) const; CArray operator ||(const CArray &a2) const; CArray operator &&(const CArray &a2) const; Project #9 07/20/2004 CArray operator +(const CArray &a2) const; friend ostream & operator << (ostream &bob , const CArray &a) Project #8 07/19/2004 bool deleteAtPos(int index); int purgeDupes(void); Project #7 07/15/2004 bool isEqualTo(const CArray &a2) const; bool operator ==(const CArray &a2) const; bool operator !=(const CArray &a2) const; Project #6 07/14/2004 friend bool isEqualTo(const CArray &a1, const CArray &a2); CArray(const CArray &second); and identify contstant functions Project #5 07/13/2004 void shuffle(void); friend void shuffle(CArray &a1); Project #4 07/12/2004 bool has(int x); bool hasDistinctValues(void); */ ///////////////////////////////////////////////// // include files ///////////////////////////////////////////////// #include <iostream.h> #include <stdlib.h> #include <time.h> ///////////////////////////////////////////////// // constants ///////////////////////////////////////////////// const int ARRAY_SIZE = 10; const int MIN_VALUE = 0; const int MAX_VALUE = 60; const int TEST_COUNT = 10; ///////////////////////////////////////////////// // test functions prototypes ///////////////////////////////////////////////// void testAll(void); void test_populate(void); void test_constructor_m(void); void test_constructor_r(void); void test_operator_output(void); void test_sortBubble(void); void test_isSorted(void); void test_deleteAll(void); void test_destructor(void); void test_constructor_s(void); void test_has(void); void test_constructor_d(void); void test_hasDistinctValues(void); void test_shuffle(void); void test_isEqualTo_operator(void); void test_isNotEqualTo_operator(void); void test_constructor_copy(void); void test_assign_operator(void); void test_deleteAtHead(void); void test_deleteAtTail(void); void test_deleteAtPos(void); void test_purgeDupes(void); void test_shuffle_friend(void); void test_isEqualTo_friend(void); void test_isEqualTo_member(void); void test_operator_plus(void); void test_operator_subset(void); void test_operator_intersection(void); void test_operator_union(void); void test_operator_minus(void); ///////////////////////////////////////////////// // class CNode ///////////////////////////////////////////////// class CNode { private: int info; CNode *next; public: CNode(void); CNode(int x); friend class CArray; friend ostream & operator << (ostream &bob , const CArray &a); }; ///////////////////////////////////////////////// // class CArray ///////////////////////////////////////////////// class CArray { private: int n; CNode *head; CNode *tail; void initialize(void) { this->n = 0; this->head = NULL; this->tail = NULL; }; public: CArray(void); bool insertAtTail(int x); void display(void); void populate(void); CArray(int m); CArray(char ch); friend ostream & operator << (ostream &bob , const CArray &a); void displayDetails(void); void sortBubble(void); bool isSorted(void) const; int deleteAll(void); ~CArray(void); bool has(int x) const; bool hasDistinctValues(void) const; void shuffle(void); bool operator ==(const CArray &a2) const; bool operator !=(const CArray &a2) const; CArray(const CArray &a2); CArray operator =(const CArray &a2); bool deleteAtHead(void); bool deleteAtTail(void); }; ///////////////////////////////////////////////// // void main(void) ///////////////////////////////////////////////// void main(void) { srand(time(NULL)); //test_populate(); //test_constructor_m(); //test_constructor_r(); //test_operator_output(); //test_sortBubble(); //test_isSorted(); //test_deleteAll(); //test_destructor(); //test_constructor_s(); //test_has(); //test_constructor_d(); //test_hasDistinctValues(); //test_shuffle(); //test_isEqualTo_operator(); //test_isNotEqualTo_operator(); //test_constructor_copy(); //test_assign_operator(); //test_deleteAtHead(); //test_deleteAtTail(); } ///////////////////////////////////////////////// // bool CArray::deleteAtTail(void) ///////////////////////////////////////////////// /* Algorithm if n=0 then return false else if n=1 then kill the one at tail head=tail=null n=0 return true else p = head while next of p <> tail advance p kill tail n-- tail = p set next of tail to null return true; */ bool CArray::deleteAtTail(void) { // Code missing return true; } ///////////////////////////////////////////////// // void test_deleteAtTail(void) ///////////////////////////////////////////////// void test_deleteAtTail(void) { cout << "+++++++++++++++++\n"; cout << "test_deleteAtTail\n"; cout << "+++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); bool success; do { a1.display(); success = a1.deleteAtTail(); cout << "After a1.deleteAtTail();\n"; } while (success); cout << "----------------\n"; } } ///////////////////////////////////////////////// // bool CArray::deleteAtHead(void) ///////////////////////////////////////////////// /* Algorithm if n=0 then return false else if n=1 then kill the one at head head=tail=null n=0 return true else p = head advance head kill p n-- return true; */ bool CArray::deleteAtHead(void) { // Code missing return true; } ///////////////////////////////////////////////// // void test_deleteAtHead(void) ///////////////////////////////////////////////// void test_deleteAtHead(void) { cout << "+++++++++++++++++\n"; cout << "test_deleteAtHead\n"; cout << "+++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); bool success; do { a1.display(); success = a1.deleteAtHead(); cout << "After a1.deleteAtHead();\n"; } while (success); cout << "----------------\n"; } } ///////////////////////////////////////////////// // CArray CArray::operator =(const CArray &a2) ///////////////////////////////////////////////// CArray CArray::operator =(const CArray &a2) { //cout << "Copy constructor CArray(CArray &second) was called\n"; // Code missing return *this; } ///////////////////////////////////////////////// // test_assign_operator ///////////////////////////////////////////////// void test_assign_operator(void) { cout << "++++++++++++++++++++\n"; cout << "test_assign_operator\n"; cout << "++++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'), a2('r'), a3('r'); cout << "a1="; a1.display(); cout << "a2="; a2.display(); cout << "a3="; a3.display(); a2 = a1; cout << "After a2 = a1;\n"; cout << "a1="; a1.display(); cout << "a2="; a2.display(); cout << "a3="; a3.display(); a2 = a1 = a3; cout << "After a2 = a1 = a3;\n"; cout << "a1="; a1.display(); cout << "a2="; a2.display(); cout << "a3="; a3.display(); cout << "----------------\n"; } } ///////////////////////////////////////////////// // CArray::CArray(const CArray &a2) ///////////////////////////////////////////////// CArray::CArray(const CArray &a2) { //cout << "Copy constructor CArray(CArray &second) was called\n"; // Code missing } ///////////////////////////////////////////////// // test_constructor_copy ///////////////////////////////////////////////// void test_constructor_copy(void) { cout << "+++++++++++++++++++++\n"; cout << "test_constructor_copy\n"; cout << "+++++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); cout << "a1="; a1.display(); CArray a2(a1); cout << "After CArray a2(a1);\n"; cout << "a2="; a2.display(); cout << "a1="; a1.display(); cout << "----------------\n"; } } ///////////////////////////////////////////////// // bool CArray::operator !=(const CArray &a2) const ///////////////////////////////////////////////// bool CArray::operator !=(const CArray &a2) const { // Code missing return true; } ///////////////////////////////////////////////// // test_isNotEqualTo_operator ///////////////////////////////////////////////// void test_isNotEqualTo_operator(void) { cout << "++++++++++++++++++++++++++\n"; cout << "test_isNotEqualTo_operator\n"; cout << "++++++++++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'), a2('r'); cout << "a1="; a1.display(); cout << "a2="; a2.display(); if (a1 != a2) cout << "a1 is NOT equal to a2\n"; else cout << "a1 is equal to a2\n"; if (a1 != a1) cout << "a1 is NOT equal to a1\n"; else cout << "a1 is equal to a1\n"; /* a1 = a2; //??? assigning a2 to a1 cout << "After a1 = a2;\n"; cout << "a1="; a1.display(); cout << "a2="; a2.display(); if (a1 != a2) cout << "a1 is NOT equal to a2\n"; else cout << "a1 is equal to a2\n"; */ cout << "----------------\n"; } } ///////////////////////////////////////////////// // bool CArray::operator ==(const CArray &a2) const ///////////////////////////////////////////////// bool CArray::operator ==(const CArray &a2) const { // Code missing return true; } ///////////////////////////////////////////////// // test_isEqualTo_operator ///////////////////////////////////////////////// void test_isEqualTo_operator(void) { cout << "+++++++++++++++++++++++\n"; cout << "test_isEqualTo_operator\n"; cout << "+++++++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'), a2('r'); cout << "a1="; a1.display(); cout << "a2="; a2.display(); if (a1 == a2) //if (a1.operator ==(a2)) cout << "a1 is equal to a2\n"; else cout << "a1 is NOT equal to a2\n"; if (a1 == a1) cout << "a1 is equal to a1\n"; else cout << "a1 is NOT equal to a1\n"; /* a1 = a2; //??? assigning a2 to a1 cout << "After a1 = a2;\n"; cout << "a1="; a1.display(); cout << "a2="; a2.display(); if (a1 == a2) cout << "a1 is equal to a2\n"; else cout << "a1 is NOT equal to a2\n"; */ cout << "----------------\n"; } } ///////////////////////////////////////////////// // void CArray::shuffle(void) ///////////////////////////////////////////////// /* do the following n*n times swap a random value with the first value */ void CArray::shuffle(void) { for (int i=1; i<=n*n*n; i++) { int k47 = rand()%n; int temp = head->info; CNode *p; p = head; while(k47-- > 0) p = p->next; head->info = p->info; p->info = temp; } } ///////////////////////////////////////////////// // void test_shuffle(void) ///////////////////////////////////////////////// void test_shuffle(void) { cout << "++++++++++++\n"; cout << "test_shuffle\n"; cout << "++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('s'); a1.display(); a1.shuffle(); cout << "After shuffle\n"; a1.display(); cout << "----------------\n"; } } ///////////////////////////////////////////////// // bool CArray::hasDistinctValues(void) const ///////////////////////////////////////////////// bool CArray::hasDistinctValues(void) const { if (n<2) return true; CNode *left, *right; for (left = head; left->next!=NULL; left=left->next) for (right=left->next; right!=NULL; right=right->next) if(left->info == right->info) return false; return true; } ///////////////////////////////////////////////// // void test_hasDistinctValues(void) ///////////////////////////////////////////////// void test_hasDistinctValues(void) { cout << "++++++++++++++++++++++\n"; cout << "test_hasDistinctValues\n"; cout << "++++++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); a1.display(); if (a1.hasDistinctValues()) cout << "list has distinct values\n"; else cout << "list does NOT have distinct values\n"; CArray a2('d'); a2.display(); if (a2.hasDistinctValues()) cout << "list has distinct values\n"; else cout << "list does NOT have distinct values\n"; CArray *pa; pa = new CArray('d'); pa->display(); if (pa->hasDistinctValues()) cout << "list has distinct values\n"; else cout << "list does NOT have distinct values\n"; cout << " sizeof(pa)=" << sizeof(pa) << endl; cout << "sizeof(*pa)=" << sizeof(*pa) << endl; cout << "pa = " << pa << endl; pa++; cout << "After pa++;\n"; cout << "pa = " << pa << endl; pa--; delete pa; cout << "----------------\n"; } } ///////////////////////////////////////////////// // bool CArray::has(int x) const ///////////////////////////////////////////////// bool CArray::has(int x) const { if (0==n) return false; else { for (CNode *p=head; p!=NULL; p=p->next) if (x==p->info) return true; return false; } } ///////////////////////////////////////////////// // void test_has(void) ///////////////////////////////////////////////// void test_has(void) { cout << "++++++++\n"; cout << "test_has\n"; cout << "++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); a1.display(); int x = MIN_VALUE + rand()%(MAX_VALUE-MIN_VALUE+1); cout << "Searching for " << x << endl; if (a1.has(x)) cout << x << " is in the list\n"; else cout << x << " is in NOT the list\n"; cout << "----------------\n"; } } ///////////////////////////////////////////////// // void test_destructor(void) ///////////////////////////////////////////////// void test_destructor(void) { cout << "++++++++++++++\n"; cout << "test_destructor\n"; cout << "++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray *p; p = new CArray('r'); cout << "*p = " << *p; delete p; cout << "----------------\n"; } for (i=1; i<=TEST_COUNT; i++) { CArray ta('r'); cout << "ta = " << ta; cout << "----------------\n"; } } ///////////////////////////////////////////////// // CArray::~CArray(void) ///////////////////////////////////////////////// CArray::~CArray(void) { cout << "Destructor called\n"; this->deleteAll(); } ///////////////////////////////////////////////// // int CArray::deleteAll(void); ///////////////////////////////////////////////// /* p = head c = 0 while p <> NULL q = p>next kill p c++ p = q head = tail = null n = 0 return c */ int CArray::deleteAll(void) { /* CNode *p, *q; int count = 0; p = this->head; while (p!=NULL) { q = p->next; delete p; count++; p = q; } this->head = this->tail = NULL; n = 0 return count; */ int count = 0; while (this->head != NULL) { this->tail = this->head; this->head = this->head->next; delete this->tail; count++; } this->tail = NULL; this->n = 0; return count; } ///////////////////////////////////////////////// // void test_deleteAll(void) ///////////////////////////////////////////////// void test_deleteAll(void) { cout << "++++++++++++++\n"; cout << "test_deleteAll\n"; cout << "++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); cout << "a1 = " << a1; int d = a1.deleteAll(); cout << "After a1.deleteAll();\n"; cout << "and deleteing " << d << " nodes\n"; cout << "a1 = " << a1; cout << "----------------\n"; } } ///////////////////////////////////////////////// // bool CArray::isSorted(void) const ///////////////////////////////////////////////// bool CArray::isSorted(void) const { /* for (int i=0; i<=n-2; i++) if (a[i] > a[i+1]) return false; return true; */ if (this->n <=1) return true; CNode *p; p = this->head; while (p->next != NULL) { if (p->info > p->next->info) return false; p = p->next; } return true; } ///////////////////////////////////////////////// // void test_isSorted(void) ///////////////////////////////////////////////// void test_isSorted(void) { cout << "+++++++++++++\n"; cout << "test_isSorted\n"; cout << "+++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); cout << "a1 = " << a1; a1.sortBubble(); cout << "After sortBubble()\n"; cout << "a1 = " << a1; if (a1.isSorted()) cout << "SORT successful\n"; else cout << "SORT NOT successful\n"; cout << "----------------\n"; } } ///////////////////////////////////////////////// // void CArray::sortBubble(void) ///////////////////////////////////////////////// void CArray::sortBubble(void) { if (this->n <= 1) return; int swapCount; do { swapCount = 0; //for (int i=0; i<=n-2; i++) for (CNode *p=this->head; p->next != NULL; p=p->next) { //if (a[i] > a[i+1]) if (p->info > p->next->info) { //int temp = a[i]; int temp = p->info; //a[i]=a[i+1]; p->info = p->next->info; //a[i+1] = temp; p->next->info = temp; swapCount++; } } } while (swapCount>0); } ///////////////////////////////////////////////// // void test_sortBubble(void) ///////////////////////////////////////////////// void test_sortBubble(void) { cout << "+++++++++++++++\n"; cout << "test_sortBubble\n"; cout << "+++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); cout << "a1 = " << a1; a1.sortBubble(); cout << "After sortBubble()\n"; cout << "a1 = " << a1; cout << "----------------\n"; } } ///////////////////////////////////////////////// // ostream & operator << (ostream &bob , const CArray &ta) ///////////////////////////////////////////////// ostream & operator << (ostream &bob, const CArray &ta) { bob << "CArray[" << ta.n << "] = "; CNode * p; p = ta.head; while (p != NULL) { bob << p->info << ' '; p = p->next; } bob << endl; return bob; } ///////////////////////////////////////////////// // void test_operator_output(void) ///////////////////////////////////////////////// void test_operator_output(void) { cout << "++++++++++++++++++++\n"; cout << "test_operator_output\n"; cout << "++++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); a1.display(); cout << a1; a1.displayDetails(); cout << "----------------\n"; } } ///////////////////////////////////////////////// // CArray::CArray(char ch) ///////////////////////////////////////////////// CArray::CArray(char ch) { this->initialize(); //cout << "Constructor CArray(char ch) was called\n"; if ('r' == ch || 'R' == ch) this->populate(); else if ('s' == ch || 'S' == ch) { this->populate(); this->sortBubble(); } else if ('d' == ch || 'D' == ch) { int times = rand()%(ARRAY_SIZE+1); for (int i=1; i<=times; i++) { int x = MIN_VALUE + rand()%(MAX_VALUE-MIN_VALUE+1); if (!this->has(x)) this->insertAtTail(x); } } } ///////////////////////////////////////////////// // void test_constructor_r(void) ///////////////////////////////////////////////// void test_constructor_r(void) { cout << "++++++++++++++++++\n"; cout << "test_constructor_r\n"; cout << "++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('r'); cout << "After CArray a1('r');\n"; a1.display(); cout << "----------------\n"; } } ///////////////////////////////////////////////// // void test_constructor_s(void) ///////////////////////////////////////////////// void test_constructor_s(void) { cout << "++++++++++++++++++\n"; cout << "test_constructor_s\n"; cout << "++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('s'); cout << "After CArray a1('s');\n"; a1.display(); cout << "----------------\n"; } } ///////////////////////////////////////////////// // void test_constructor_d(void) ///////////////////////////////////////////////// void test_constructor_d(void) { cout << "++++++++++++++++++\n"; cout << "test_constructor_d\n"; cout << "++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1('d'); cout << "After CArray a1('d');\n"; a1.display(); cout << "----------------\n"; } } ///////////////////////////////////////////////// // CArray::CArray(int m) ///////////////////////////////////////////////// CArray::CArray(int m) { //cout << "Constructor CArray(int n) was called\n"; if (m > ARRAY_SIZE) m = ARRAY_SIZE; this->initialize(); for (int i=1; i<=m; i++) { int x = MIN_VALUE + rand()%(MAX_VALUE-MIN_VALUE+1); this->insertAtTail(x); } } ///////////////////////////////////////////////// // void test_constructor_m(void) ///////////////////////////////////////////////// void test_constructor_m(void) { cout << "++++++++++++++++++\n"; cout << "test_constructor_m\n"; cout << "++++++++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { int n = rand()%(ARRAY_SIZE*2); CArray a1(n); cout << "After CArray a1(" << n << ");\n"; a1.display(); cout << "----------------\n"; } } ///////////////////////////////////////////////// // void CArray::populate(void) ///////////////////////////////////////////////// void CArray::populate(void) { int m = rand()%(ARRAY_SIZE+1); for (int i=1; i<=m; i++) { int x = MIN_VALUE + rand()%(MAX_VALUE-MIN_VALUE+1); this->insertAtTail(x); } } ///////////////////////////////////////////////// // void test_populate(void) ///////////////////////////////////////////////// void test_populate(void) { cout << "+++++++++++++\n"; cout << "test_populate\n"; cout << "+++++++++++++\n"; for (int i=1; i<=TEST_COUNT; i++) { CArray a1; a1.display(); a1.populate(); cout << "After a1.populate();\n"; a1.display(); cout << "----------------\n"; } } ///////////////////////////////////////////////// // void CArray::display(void) ///////////////////////////////////////////////// void CArray::display(void) { cout << "CArray[" << this->n << "] = "; CNode * p; p = this->head; while (p != NULL) { cout << p->info << ' '; p = p->next; } cout << endl; } ///////////////////////////////////////////////// // void CArray::displayDetails(void) ///////////////////////////////////////////////// void CArray::displayDetails(void) { cout << "head = " << this->head << endl; cout << "tail = " << this->tail << endl; cout << " n = " << this->n << endl; cout << "NULL = " << NULL << endl; CNode * p; cout << "sizeof p = " << sizeof(p) << endl; cout << "sizeof NULL = " << sizeof(NULL) << endl; cout << "sizeof n = " << sizeof(n) << endl; cout << "sizeof head = " << sizeof(head) << endl; cout << "sizeof tail = " << sizeof(tail) << endl; cout << "sizeof this = " << sizeof(this) << endl; cout << "sizeof *this = " << sizeof(*this) << endl; cout << "sizeof CNode = " << sizeof(CNode) << endl; cout << "sizeof 4 = " << sizeof(4) << endl; cout << "sizeof int = " << sizeof(int) << endl; p = this->head; cout << " p = " << p << endl; p++; cout << " p++ p = " << p << endl; p = this->head; while (p != NULL) { cout << "address=" << p << ' '; cout << "info=" << p->info << ' '; cout << "next=" << p->next << endl; p = p->next; } cout << endl; } ///////////////////////////////////////////////// // bool CArray::insertAtTail(int x) ///////////////////////////////////////////////// bool CArray::insertAtTail(int x) { CNode *p; p = new CNode; if (NULL == p) //2004.07.23 return false; p->info = x; p->next = NULL; if (NULL == this->head) this->head = this->tail = p; else { this->tail->next = p; this->tail = p; } this->n++; return true; } ///////////////////////////////////////////////// // CArray::CArray(void) ///////////////////////////////////////////////// CArray::CArray(void) { this->initialize(); } ///////////////////////////////////////////////// // CNode::CNode(void) ///////////////////////////////////////////////// CNode::CNode(void) { this->info = 0; this->next = NULL; } ///////////////////////////////////////////////// // CNode::CNode(int x) ///////////////////////////////////////////////// CNode::CNode(int x) { this->info = x; this->next = NULL; } /* */ |