|
//p04books01 //author //date 07/19/2001 ////////////////////////////////////////////////////////////////////// //include files ////////////////////////////////////////////////////////////////////// #include <iostream.h> #include <string.h> #include <stdlib.h> #include <time.h> ////////////////////////////////////////////////////////////////////// //constants ////////////////////////////////////////////////////////////////////// const int TITLE_LEN = 30; const int AUTHOR_LEN = 30; const int MAX_BOOKS = 15; ////////////////////////////////////////////////////////////////////// //test values ////////////////////////////////////////////////////////////////////// const char *testTitles[] = { "C++ with Pizza Flavor", "Java Learn Now", "COBOL How To Forget", "FORTRAN 77", "DB2: An Introduction", "XML In 24 Hours", "UNIX" }; const int MAX_TITLES = sizeof(testTitles)/sizeof(testTitles[0]); const char *testAuthors[] = { "John", "Adam", "Sumeer", "Natalie", "David", "Rustin" }; const int MAX_AUTHORS = sizeof(testAuthors)/sizeof(testAuthors[0]); const int testYears[] = {1977, 1988, 1989, 1991, 2000, 2001}; const int MAX_YEARS = sizeof(testYears)/sizeof(testYears[0]); void testSortByYear(void); void testAdd(void); ////////////////////////////////////////////////////////////////////// //BookType class definition ////////////////////////////////////////////////////////////////////// class CBook { private: char title[TITLE_LEN+1]; char author[AUTHOR_LEN+1]; int year; CBook *next; public: CBook(void); CBook(char t[], char a[], int y); CBook(char ch); CBook(const CBook &b); //CBook b2; CBook b1(b2); void display(void) const; void copy(const CBook &b2); void swap(CBook &b2); friend class CBooks; ~CBook(void); bool operator == (const CBook &b2) const; bool operator != (const CBook &b2) const; CBook & operator = (const CBook &b2); friend ostream & operator << (ostream & john, const CBook &b); friend void swapYear(CBook &b1, CBook &b2); friend ostream & operator << (ostream & john, const CBooks &bc); }; ////////////////////////////////////////////////////////////////////// //class CBooks ////////////////////////////////////////////////////////////////////// class CBooks { private: int count; CBook *head; CBook *tail; public: CBooks(void); CBooks(int n); CBooks(const CBooks &bc); void display(void) const; void displayRev(void) const; void sortBubbleByYear(void); bool isSortedByYear(void) const; int add(char t[], char a[], int y); int remove(int loc); // Project #4 ~CBooks(void); bool isEqualTo(const CBooks &bc2) const; bool operator ==(const CBooks &bc2) const; bool operator !=(const CBooks &bc2) const; friend ostream & operator << (ostream & john, const CBooks &bc); CBooks(char ch); void sortSelectionByYear(void); void sortBubbleByTitle(void); bool isSortedByTitle(void) const; void sortInsertionByYear(void); void removeAll(void); int add(const CBook &b); }; void testOperatorInsertionCBooks(void); void testAdd(void); void main(void) { testOperatorInsertionCBooks(); testAdd(); } /* void CBooks::sortInsertionByYear(void) { int i, k; CBook temp; for (i=1; i<=count-1; i++) { if (books[i-1].year <= books[i].year) continue; temp = books[i]; k = i; while (true) { books[k] = books[k-1]; k--; if ((0 == k) || (books[k-1].year <= temp.year)) { books[k] = temp; break; } } } } ////////////////////////////////////////////////////////////////////// //test function for sortSelectionByYear ////////////////////////////////////////////////////////////////////// void testSortInsertionByYear(void) { int n = rand()% (MAX_BOOKS + 1); CBooks bc(n); cout << "Original\n"; bc.display(); if (bc.isSortedByYear()) cout << "SORTED\n"; else cout << "NOT SORTED\n"; bc.sortInsertionByYear(); cout << "After sort\n"; bc.display(); if (bc.isSortedByYear()) cout << "SORTED\n"; else cout << "NOT SORTED\n"; } */ /* ////////////////////////////////////////////////////////////////////// //sortBubbleByTitle() ////////////////////////////////////////////////////////////////////// void CBooks::sortBubbleByTitle(void) { bool sorted; int i; do { sorted = true; for (i=0; i<=count-2; i++) { if (strcmp(books[i].title, books[i+1].title) > 0) { books[i].swap(books[i+1]); sorted = false; } } } while (!sorted); } ////////////////////////////////////////////////////////////////////// //test function for sortByTitle ////////////////////////////////////////////////////////////////////// void testSortByTitle(void) { int n = rand()% (MAX_BOOKS + 1); CBooks bc(n); cout << "Original\n"; bc.display(); if (bc.isSortedByTitle()) cout << "SORTED\n"; else cout << "NOT SORTED\n"; bc.sortBubbleByTitle(); cout << "Sorted\n"; bc.display(); if (bc.isSortedByYear()) cout << "SORTED\n"; else cout << "NOT SORTED\n"; } ////////////////////////////////////////////////////////////////////// //checks if sorted by title ////////////////////////////////////////////////////////////////////// bool CBooks::isSortedByTitle(void) const { if (count <= 1) return true; for (int i=0; i<=count-2; i++) { if (strcmp(books[i].title, books[i+1].title) > 0) return false; } return true; } */ /* void CBooks::sortSelectionByYear(void) { int n = count; int iMax, vMax, i; while (n > 1) { iMax = 0; vMax = books[iMax].year; for (i=1; i<=n-1; i++) { if (books[i].year > vMax) { iMax = i; vMax = books[i].year; } } books[iMax].swap(books[n-1]); n--; } } ////////////////////////////////////////////////////////////////////// //test function for sortSelectionByYear ////////////////////////////////////////////////////////////////////// void testSortSelectionByYear(void) { int n = rand()% (MAX_BOOKS + 1); CBooks bc(n); cout << "Original\n"; bc.display(); if (bc.isSortedByYear()) cout << "SORTED\n"; else cout << "NOT SORTED\n"; bc.sortSelectionByYear(); cout << "Sorted\n"; bc.display(); if (bc.isSortedByYear()) cout << "SORTED\n"; else cout << "NOT SORTED\n"; } */ ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// CBooks::CBooks(char ch) { if (('r' == ch) || ('R' == ch)) { count = rand()%(MAX_BOOKS+1); for (int i=0; i<count; i++) this->add(CBook('r')); } else count = 0; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// void testConstructorRandCBooks(void) { CBooks bc1('r'), bc2('s'); cout << bc1 << endl; cout << endl; cout << bc2 << endl; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ostream & operator << (ostream & john, const CBooks &bc) { john << "Book Collection[" << bc.count << "]= \n"; /* CBook *p; p = bc.head; while (p != NULL) { john << *p; p = p->next; } john << endl; */ for (CBook *p = bc.head; p != NULL; p = p->next) john << *p; return john; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// void testOperatorInsertionCBooks(void) { //CBooks bc1(5), bc2(5); CBooks bc1, bc2; cout << bc1 << bc2 << endl; } /* ////////////////////////////////////////////////////////////////////// //compares for equality CBooks objects ////////////////////////////////////////////////////////////////////// bool CBooks::operator ==(const CBooks &bc2) const { if (count != bc2.count) return false; // if != overloaded for CBook for (int i=0; i<=count-1; i++) if (this->books[i] != bc2.books[i]) return false; return true; } ////////////////////////////////////////////////////////////////////// //test operator equal ////////////////////////////////////////////////////////////////////// void testOperatorEqual(void) { CBooks bc1(5), bc2(5); if (bc1 == bc2) cout << "EQUAL\n"; else cout << "NOT Equal\n"; CBooks bc3(bc1); if (bc1 == bc3) cout << "EQUAL\n"; else cout << "NOT Equal\n"; } */ /* ////////////////////////////////////////////////////////////////////// //compares for inequality CBooks objects ////////////////////////////////////////////////////////////////////// bool CBooks::operator !=(const CBooks &bc2) const { return !((*this) == bc2); } ////////////////////////////////////////////////////////////////////// //test operator not equal to ////////////////////////////////////////////////////////////////////// void testOperatorNotEqual(void) { { CBooks bc1(5), bc2(5); if (bc1 != bc2) cout << "Not EQUAL\n"; else cout << "Equal\n"; CBooks bc3(bc1); if (bc1 != bc3) cout << "NOT EQUAL\n"; else cout << "Equal\n"; } { CBooks bc1, bc2; if (bc1 != bc2) cout << "Not EQUAL\n"; else cout << "Equal\n"; CBooks bc3(bc1); if (bc1 != bc3) cout << "NOT EQUAL\n"; else cout << "Equal\n"; } } */ void CBooks::removeAll(void) { } ////////////////////////////////////////////////////////////////////// //Cooks destructor ////////////////////////////////////////////////////////////////////// CBooks::~CBooks(void) { removeAll(); } ////////////////////////////////////////////////////////////////////// //add function ////////////////////////////////////////////////////////////////////// int CBooks::add(const CBook &b) { CBook *p; p = new CBook; if (NULL == p) return -1; strcpy(p->title, b.title); strcpy(p->author, b.author); p->year = b.year; p->next = NULL; if (NULL == head) head = tail = p; else { tail->next = p; tail = p; } count++; return count-1; } ////////////////////////////////////////////////////////////////////// //add function ////////////////////////////////////////////////////////////////////// int CBooks::add(char t[], char a[], int y) { CBook *p; p = new CBook; if (NULL == p) return -1; strcpy(p->title, t); strcpy(p->author, a); p->year = y; p->next = NULL; if (NULL == head) head = tail = p; else { tail->next = p; tail = p; } count++; return count-1; } ////////////////////////////////////////////////////////////////////// //test add ////////////////////////////////////////////////////////////////////// void testAdd(void) { CBooks bc; cout << bc; for (int i=1; i<=5; i++) { cout << "+++++++++++++++++++++++++++\n"; cout << bc.add("Title", "Author", i) << endl; cout << bc; } CBooks bc2; cout << bc2; for (int j=1; j<=5; j++) { cout << "+++++++++++++++++++++++++++\n"; cout << bc2.add(CBook('r')) << endl; cout << bc2; } } ////////////////////////////////////////////////////////////////////// //constructor CBooks() ////////////////////////////////////////////////////////////////////// CBooks::CBooks(void) { count = 0; head = tail = NULL; } /* ////////////////////////////////////////////////////////////////////// //constructor CBooks(n) ////////////////////////////////////////////////////////////////////// CBooks::CBooks(int n) { if (n < 0) n = 0; if (n > MAX_BOOKS) n = MAX_BOOKS; count = n; for (int i=0; i<n; i++) { //get a random title strcpy(books[i].title, testTitles[rand()%MAX_TITLES]); //get a random author strcpy(books[i].author, testAuthors[rand()%MAX_AUTHORS]); //get a random year books[i].year = testYears[rand()%MAX_YEARS]; } } ////////////////////////////////////////////////////////////////////// //constructor CBooks(CBooks bc) ////////////////////////////////////////////////////////////////////// CBooks::CBooks(const CBooks &bc) { count = bc.count; for (int i=0; i<count; i++) { //get a random title strcpy(books[i].title, bc.books[i].title); //get a random author strcpy(books[i].author, bc.books[i].author); //get a random year books[i].year = bc.books[i].year; } } */ ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ostream & operator << (ostream & john, const CBook &b) { john << b.title ; john << ", " << b.author; john << ", " << b.year << endl; return john; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// void testOperatorInsertionCBook(void) { CBook b1('r'), b2('r'); cout << b1 << b2 << endl; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// CBook & CBook::operator = (const CBook &b2) { strcpy(title, b2.title); strcpy(author, b2.author); year = b2.year; return *this; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// void testOperatorAssignCBook(void) { CBook b1('r'), b2('r'), b3('R'); cout << b1; cout << b2; cout << b3; b1 = b2 = b3; cout << b1; cout << b2; cout << b3; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// bool CBook::operator != (const CBook &b2) const { return !(*this == b2); } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// void testOperatorNotEqualCBook(void) { CBook b1('r'), b2('r'); cout << b1; cout << b2; if (b1 != b2) cout << "NOT EQUAL\n"; else cout << "EQUAL\n"; b2 = b1; cout << b1; cout << b2; if (b1 != b2) cout << "NOT EQUAL\n"; else cout << "EQUAL\n"; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// bool CBook::operator == (const CBook &b2) const { if (strcmp(this->title, b2.title) != 0) return false; if (strcmp(this->author, b2.author) != 0) return false; if (this->year != b2.year) return false; return true; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// void testOperatorEqualCBook(void) { CBook b1('r'), b2('r'); cout << b1; cout << b2; if (b1 == b2) cout << "EQUAL\n"; else cout << "NOT EQUAL\n"; b2 = b1; cout << b1; cout << b2; if (b1 == b2) cout << "EQUAL\n"; else cout << "NOT EQUAL\n"; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// CBook::~CBook(void) { } ////////////////////////////////////////////////////////////////////// //function to initialize the contents of CBook variable ////////////////////////////////////////////////////////////////////// CBook::CBook(char t[], char a[], int y) { strcpy((*this).title, t);//strcpy(title, t); strcpy(this->author, a); //strcpy(author, a); year = y; } ////////////////////////////////////////////////////////////////////// //function to initialize the contents of CBook variable ////////////////////////////////////////////////////////////////////// CBook::CBook(void) { strcpy((*this).title, "-1"); strcpy(this->author, "-1"); year = -1; } ////////////////////////////////////////////////////////////////////// //function to initialize the contents of CBook variable ////////////////////////////////////////////////////////////////////// CBook::CBook(const CBook &b) { strcpy(title, b.title); strcpy(author, b.author); year = b.year; } ////////////////////////////////////////////////////////////////////// //function to input the contents of BookType variable ////////////////////////////////////////////////////////////////////// CBook::CBook(char ch) { if (('i' == ch) || ('I' == ch)) { cout << "Title: "; cin >> title; cout << "Author: "; cin >> author; cout << "Year: "; cin >> year; } else if (('r' == ch) || ('R' == ch)) { strcpy(title, testTitles[rand()%MAX_TITLES]); strcpy(author, testAuthors[rand()%MAX_AUTHORS]); year = testYears[rand()%MAX_YEARS]; } else { strcpy((*this).title, "-1"); strcpy(this->author, "-1"); year = -1; } } |