|
//Project18.cpp //Date 10/12/2001 //Author: Us //////////////////////////////////////////////////// //includes //////////////////////////////////////////////////// #include <iostream.h> #include <string.h> #include <stdlib.h> #include <time.h> //////////////////////////////////////////////////// // constants //////////////////////////////////////////////////// const int MAX_LEN = 20; const char *testNames[] = { "Chair", "Table", "Spoon", "Book", "Pen", "Eraser", "TV", "Stereo", "VCR", "DVD Player", "XBox", "Microwave", "Toaster", "Car", "Phone", "Couch", "Calculator", "Cookies" }; const int MAX_NAMES = sizeof(testNames)/sizeof(testNames[0]); const int MAX_ITEMS = 10; //////////////////////////////////////////////////// // test functions //////////////////////////////////////////////////// void testInput(void); void testSetName(void); void testSetWeight(void); void testConstructor(void); void testConstructorCh(void); void testConstructorCopy(void); void testSet(void); void testOperatorEqual(void); void testGetName(void); void testGetWeight(void); void testOperatorLessThan(void); void testOperatorAssign(void); void testOperatorInsertion(void); void testOperatorExtraction(void); void testConstructorCInventory(void); void testConstructor2CInventory(void); void testConstructor3CInventory(void); void testSortBubbleCInventory(void); void testIsSortedCInventory(void); void testShuffleCInventory(void); void testOperatorAssignCInventory(void); //////////////////////////////////////////////////// // CItem class //////////////////////////////////////////////////// class CItem { private: char m_name[MAX_LEN+1]; int m_weight; public: CItem(void); CItem(char name[], int weight); CItem(char ch); CItem(const CItem &item); void input(void); void display(void) const; void set(char name[], int weight); void setName(char name[]); void setWeight(int weight); char * getName(void); int getWeight(void); bool operator < (const CItem &i2); CItem & operator = (const CItem &i2); friend bool operator ==(const CItem &i1, const CItem &i2); friend ostream & operator << (ostream &bob, const CItem &item); friend istream & operator >> (istream &joe, CItem &item); }; //////////////////////////////////////////////////// // CInventory class //////////////////////////////////////////////////// class CInventory { private: int count; CItem items[MAX_ITEMS]; void swap(CItem &i1, CItem &i2); public: CInventory(void); CInventory(int n); CInventory(char ch); void sortBubble(void); bool isSorted(void); void shuffle(void); void sortInsertion(void); CInventory & operator = (const CInventory &inv2); bool operator == (const CInventory &inv2); bool operator != (const CInventory &inv2); friend ostream & operator << (ostream &bob, const CInventory &inv); friend istream & operator >> (istream &joe, CInventory &inv); }; //////////////////////////////////////////////////// // main function //////////////////////////////////////////////////// void main(void) { srand( (unsigned)time( NULL ) ); //testInput(); //testConstructor(); //testConstructorCh(); //testConstructorCopy(); //testSetName(); //testSetWeight(); //testSet(); //testOperatorEqual(); //testGetName(); //testGetWeight(); //testOperatorLessThan(); //testOperatorAssign(); //testOperatorInsertion(); //testOperatorExtraction(); //mainProject03(); //testConstructorCInventory(); //testConstructor2CInventory(); //testConstructor3CInventory(); //testSortBubbleCInventory(); //testIsSortedCInventory(); testShuffleCInventory(); //testOperatorAssignCInventory(); } //////////////////////////////////////////////////// // operator = //////////////////////////////////////////////////// CInventory & CInventory::operator = (const CInventory &inv2) { this->count = inv2.count; for (int i=0; i<this->count; i++) this->items[i] = inv2.items[i]; return *this; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testOperatorAssignCInventory //++++++++++++++++++++++++++++++++++++++++++++++++++ void testOperatorAssignCInventory(void) { cout << "testOperatorAssignCInventory\n"; cout << "============================\n"; for (int i=1; i<=5; i++) { CInventory yourInv('r'); CInventory myInv('R'); CInventory hisInv('r'); cout << "yourInv = " << yourInv << endl; cout << "myInv = " << myInv << endl; cout << "hisInv = " << hisInv << endl; yourInv = myInv = hisInv; cout << "After yourInv = myInv = hisInv;\n"; cout << "yourInv = " << yourInv << endl; cout << "myInv = " << myInv << endl; cout << "hisInv = " << hisInv << endl; cout << "----------------------\n"; } } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testShuffleCInventory //++++++++++++++++++++++++++++++++++++++++++++++++++ void testShuffleCInventory(void) { cout << "testShuffleCInventory\n"; cout << "=====================\n"; for (int i=0; i<=5; i++) { CInventory yourInv('r'); cout << yourInv; if (yourInv.isSorted()) cout << "SORTED\n"; else cout << "NOT SORTED NOT SORTED\n"; cout << "After sortBubble\n"; yourInv.sortBubble(); cout << yourInv; if (yourInv.isSorted()) cout << "SORTED\n"; else cout << "NOT SORTED NOT SORTED\n"; cout << "After shuffle\n"; yourInv.shuffle(); cout << yourInv; if (yourInv.isSorted()) cout << "SORTED\n"; else cout << "NOT SORTED NOT SORTED\n"; cout << "-------------------\n"; } } //////////////////////////////////////////////////// // shuffle function //////////////////////////////////////////////////// void CInventory::shuffle(void) { if (this->count <= 1) return; CItem tempItem; int pick1, pick2; for (int i=1; i<=2*this->count; i++) { pick1 = rand()%this->count; pick2 = rand()%this->count; tempItem = items[pick1]; items[pick1] = items[pick2]; items[pick2] = tempItem; } } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testIsSortedCInventory //++++++++++++++++++++++++++++++++++++++++++++++++++ void testIsSortedCInventory(void) { cout << "testIsSortedCInventory\n"; cout << "======================\n"; for (int i=0; i<=5; i++) { CInventory yourInv('r'); cout << yourInv; if (yourInv.isSorted()) cout << "SORTED\n"; else cout << "NOT SORTED NOT SORTED\n"; cout << "After sortBubble\n"; yourInv.sortBubble(); cout << yourInv; if (yourInv.isSorted()) cout << "SORTED\n"; else cout << "NOT SORTED NOT SORTED\n"; cout << "-------------------\n"; } } //////////////////////////////////////////////////// // isSorted function //////////////////////////////////////////////////// bool CInventory::isSorted(void) { for (int i=0; i<=count-2; i++) if (items[i+1] < items[i]) return false; return true; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testSortBubbleCInventory //++++++++++++++++++++++++++++++++++++++++++++++++++ void testSortBubbleCInventory(void) { cout << "testSortBubbleCInventory\n"; cout << "========================\n"; for (int i=0; i<=5; i++) { CInventory yourInv('r'); cout << yourInv; cout << "After sortBubble\n"; yourInv.sortBubble(); cout << yourInv; cout << "-------------------\n"; } } //////////////////////////////////////////////////// // sortBubble function //////////////////////////////////////////////////// void CInventory::sortBubble(void) { bool sorted; int i; CItem tempItem; do { sorted = true; for (i=0; i<=count-2; i++) { if (items[i+1] < items[i]) { tempItem = items[i]; items[i] = items[i+1]; items[i+1] = tempItem; sorted = false; } } } while (!sorted); } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testConstructor3CInventory //++++++++++++++++++++++++++++++++++++++++++++++++++ void testConstructor3CInventory(void) { cout << "testConstructor3CInventory\n"; cout << "=========================\n"; for (int i=1; i<=5; i++) { CInventory yourInv('r'); CInventory myInv('R'); CInventory hisInv('s'); cout << yourInv; cout << endl; cout << myInv; cout << endl; cout << hisInv; cout << "-------------------\n"; } } //////////////////////////////////////////////////// // construct inventory of random random items //////////////////////////////////////////////////// CInventory::CInventory(char ch) { if (('r' == ch) || ('R' == ch)) { this->count = rand()%MAX_ITEMS; for (int i=0; i<=this->count-1; i++) { CItem item('r'); this->items[i] = item; } } else this->count =0; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testConstructor2CInventory //++++++++++++++++++++++++++++++++++++++++++++++++++ void testConstructor2CInventory(void) { cout << "testConstructor2CInventory\n"; cout << "=========================\n"; for (int i=-1; i<=5; i++) { CInventory yourInv(i); cout << yourInv; cout << "-------------------\n"; } } //////////////////////////////////////////////////// // construct inventory of n random items //////////////////////////////////////////////////// CInventory::CInventory(int n) { if (n < 0) n = -n; this->count = n; for (int i=0; i<=n-1; i++) { CItem item('r'); this->items[i] = item; } } //////////////////////////////////////////////////// // operator << overloaded for CInventory //////////////////////////////////////////////////// ostream & operator << (ostream &bob, const CInventory &inv) { bob << "inventory(" << inv.count << ")=\n"; for (int i=0; i<=inv.count-1; i++) bob << inv.items[i]; return bob; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testConstructorCInventory //++++++++++++++++++++++++++++++++++++++++++++++++++ void testConstructorCInventory(void) { cout << "testConstructorCInventory\n"; cout << "=========================\n"; for (int i=1; i<=5; i++) { CInventory yourInv; cout << yourInv; cout << "-------------------\n"; } } //////////////////////////////////////////////////// // default constructor for CInventory //////////////////////////////////////////////////// CInventory::CInventory(void) { count = 0; } //////////////////////////////////////////////////// //overload >> for CItem //////////////////////////////////////////////////// istream & operator >> (istream &joe, CItem &item) { cout << "item m_name: "; joe >> item.m_name; cout << "item m_weight: "; joe >> item.m_weight; return joe; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // test operator >> //++++++++++++++++++++++++++++++++++++++++++++++++++ void testOperatorExtraction(void) { cout << "Test operator >>\n"; cout << "=================\n"; for (int i=1; i<=5; i++) { CItem item1; cin >> item1; cout << item1; cout << "---------------------------\n"; } } //////////////////////////////////////////////////// //overload << for CItem //////////////////////////////////////////////////// ostream & operator << (ostream &bob, const CItem &item) { bob << '[' << item.m_name << ", "; bob << item.m_weight << ']' << endl; return bob; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // test operator << //++++++++++++++++++++++++++++++++++++++++++++++++++ void testOperatorInsertion(void) { cout << "Test operator <<\n"; cout << "=================\n"; for (int i=1; i<=5; i++) { CItem item1('r'); cout << "item1 = "; item1.display(); cout << "item1 = " << item1 << endl; cout << item1 << item1; cout << "---------------------------\n"; } } //////////////////////////////////////////////////// // operator = overloaded //////////////////////////////////////////////////// CItem & CItem::operator = (const CItem &i2) { strcpy(m_name, i2.m_name); this->m_weight = i2.m_weight; return *this; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testOperatorAssign //++++++++++++++++++++++++++++++++++++++++++++++++++ void testOperatorAssign(void) { cout << "Test operator =\n"; cout << "===============\n"; for (int i=1; i<=5; i++) { CItem item1('r'), item2('r'), item3('r'); cout << "item1 = "; item1.display(); cout << "item2 = "; item2.display(); cout << "item3 = "; item3.display(); item1 = item2 = item3; //item1.operator= (item2.operator= item3); //item1.operator = (item2.operator = (item3)); item2.operator = (item3); item1.operator = (item2); cout << "After item1 = item2 = item3;\n"; cout << "item1 = "; item1.display(); cout << "item2 = "; item2.display(); cout << "item3 = "; item3.display(); cout << "---------------------------\n"; } } //////////////////////////////////////////////////// // operator < overloaded for CItem class objects // returns true if weight of i1 is less than that of i2 // else returns false //////////////////////////////////////////////////// bool CItem::operator < (const CItem &i2) { if (this->m_weight < i2.m_weight) return true; else return false; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testOperatorLessThan //++++++++++++++++++++++++++++++++++++++++++++++++++ void testOperatorLessThan(void) { cout << "Test operator <\n"; cout << "===============\n"; for (int i=1; i<=5; i++) { CItem item1('r'), item2('r'), item3('r'); cout << "item1 = "; item1.display(); cout << "item2 = "; item2.display(); cout << "item3 = "; item3.display(); if (item1 < item2) cout << "item1 is lighter than item2\n"; else cout << "item1 is not lighter than item2\n"; if (item1 < item3) cout << "item1 is lighter than item3\n"; else cout << "item1 is not lighter than item3\n"; cout << "---------------------------\n"; } } //////////////////////////////////////////////////// // getWeight // returns the weight //////////////////////////////////////////////////// int CItem::getWeight(void) { return m_weight; }; //++++++++++++++++++++++++++++++++++++++++++++++++++ // testGetWeight //++++++++++++++++++++++++++++++++++++++++++++++++++ void testGetWeight(void) { cout << "test getWeight\n"; for (int i=1; i<=5; i++) { CItem i('r'); cout << "item = "; i.display(); cout << "weight = " << i.getWeight() << endl; cout << "-----------------------------\n"; } } //////////////////////////////////////////////////// // getName // returns the name //////////////////////////////////////////////////// char * CItem::getName(void) { return m_name; }; //++++++++++++++++++++++++++++++++++++++++++++++++++ // testGetName //++++++++++++++++++++++++++++++++++++++++++++++++++ void testGetName(void) { cout << "test getName\n"; for (int i=1; i<=5; i++) { CItem i('r'); cout << "item = "; i.display(); cout << "name = " << i.getName() << endl; cout << "-----------------------------\n"; } } //////////////////////////////////////////////////// // operator == // compares two items for equality //////////////////////////////////////////////////// bool operator ==(const CItem &i1, const CItem &i2) { if (i1.m_weight != i2.m_weight) return false; if (strcmp(i1.m_name, i2.m_name) != 0) return false; return true; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testOperatorEqual //++++++++++++++++++++++++++++++++++++++++++++++++++ void testOperatorEqual(void) { cout << "Test operator equal\n"; cout << "===================\n"; for (int i=1; i<=5; i++) { CItem item1('r'), item2('r'), item3(item1); cout << "item1 = "; item1.display(); cout << "item2 = "; item2.display(); cout << "item3 = "; item3.display(); if (item1 == item2) cout << "item1 is equal to item2\n"; else cout << "item1 is not equal to item2\n"; if (item1 == item3) cout << "item1 is equal to item3\n"; else cout << "item1 is not equal to item3\n"; cout << "---------------------------\n"; } } //////////////////////////////////////////////////// // setWeight(int weight) // sets the m_weight data member to weight //////////////////////////////////////////////////// void CItem::setWeight(int weight) { m_weight = weight; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testSetWeight //++++++++++++++++++++++++++++++++++++++++++++++++++ void testSetWeight(void) { cout << "Test setWeight(weight)\n"; for (int i=1; i<=5; i++) { CItem item('r'); item.display(); int tWeight = rand()%100; cout << "tWeight = " << tWeight << endl; item.setWeight(tWeight); cout << "After item1.setWeight(tWeight);\n"; item.display(); cout << "---------------------------\n"; } } //////////////////////////////////////////////////// // setName(char name) // sets the m_name data member to name //////////////////////////////////////////////////// void CItem::setName(char name[]) { strcpy(m_name, name); } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testSetName //++++++++++++++++++++++++++++++++++++++++++++++++++ void testSetName(void) { cout << "Test setName(name)\n"; for (int i=1; i<=5; i++) { CItem item('r'); item.display(); int i = rand()%MAX_NAMES; char tName[MAX_LEN+1]; strcpy(tName, testNames[i]); cout << "tName = \"" << tName << "\"" << endl; item.setName(tName); cout << "After item1.setName(tName);\n"; item.display(); cout << "---------------------------\n"; } } //////////////////////////////////////////////////// //CItem (item) copy constructor // constructs an object which is a copy given object //////////////////////////////////////////////////// CItem::CItem(const CItem &item) { strcpy(this->m_name, item.m_name); this->m_weight = item.m_weight; (*this).m_weight = item.m_weight; //cout << "copy constructor called\n"; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testConstructorCopy //++++++++++++++++++++++++++++++++++++++++++++++++++ void testConstructorCopy(void) { cout << "Test copy Constructor\n"; for (int i=1; i<=5; i++) { CItem item1('r'); CItem item2(item1); item1.display(); item2.display(); } } //////////////////////////////////////////////////// //CItem (ch) constructor // constructs an object with random name and weight //////////////////////////////////////////////////// CItem::CItem(char ch) { if ('r' == ch ) { strcpy(m_name, testNames[rand()%MAX_NAMES]); m_weight = rand()%100; } else { strcpy(m_name, ""); m_weight = -99; } } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testConstructorCh //++++++++++++++++++++++++++++++++++++++++++++++++++ void testConstructorCh(void) { cout << "Test ConstructorCh\n"; CItem item1('r'); CItem item2('m'); item1.display(); item2.display(); } //////////////////////////////////////////////////// //CItem (name, weight) constructor // constructs an object with given name and weight //////////////////////////////////////////////////// CItem::CItem(char name[], int weight) { strcpy(m_name, name); m_weight = weight; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testConstructor //++++++++++++++++++++++++++++++++++++++++++++++++++ void testConstructor(void) { cout << "Test Constructor(name, weight)\n"; CItem item("Chair", 150); item.display(); } //////////////////////////////////////////////////// // display //////////////////////////////////////////////////// void CItem::display(void) const { cout << '[' << m_name << ", "; cout << m_weight << ']' << endl; } //////////////////////////////////////////////////// //constructor default //////////////////////////////////////////////////// CItem::CItem(void) { //cout << "Default Constructor called\n"; strcpy(m_name, ""); m_weight = -99; } //////////////////////////////////////////////////// //input function // This is a member function for CItem class // it gets the name and weight from the keyboard // and sets the values of name and weight data members //////////////////////////////////////////////////// void CItem::input(void) { cout << "item m_name: "; cin >> m_name; cout << "item m_weight: "; cin >> m_weight; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testInput //++++++++++++++++++++++++++++++++++++++++++++++++++ void testInput(void) { cout << "test input function\n"; CItem item1; item1.display(); item1.input(); item1.display(); } //////////////////////////////////////////////////// // set(name, weight) //////////////////////////////////////////////////// void CItem::set(char name[], int weight) { strcpy(m_name, name); m_weight = weight; } //++++++++++++++++++++++++++++++++++++++++++++++++++ // testSet //++++++++++++++++++++++++++++++++++++++++++++++++++ void testSet(void) { cout << "Test set(name, weight)\n"; for (int i=1; i<=5; i++) { CItem item('r'); item.display(); int i = rand()%MAX_NAMES; char tName[MAX_LEN+1]; strcpy(tName, testNames[i]); cout << "tName = \"" << tName << "\"" << endl; int tWeight = rand()%100; cout << "tWeight = " << tWeight << endl; item.set(tName, tWeight); cout << "After item.set(tName, tWeight);\n"; item.display(); cout << "------------------------------------\n"; } } |