http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h
Chapter 9 // Exercise 8
Create a Patron class for the library. The class will have a user's name, library card number, and library fees (if owed). have functions that access this data, as well as a function to set the fee of the user. Have a helper function that returns a Boolean (bool) depending on whether or not the user owes a fee.
bookclass.h
bookclass.cpp
bookclass.h
//bookclass.h #ifndef _BOOKCLASS_H_ #define _BOOKCLASS_H_ #include "std_lib_facilities.h" //enum for genres enum class Genre { default = 1, fiction, nonfiction, periodical, biography, children }; //class Book class Book { public: Book(); ~Book(); Genre getGenre() const { return m_genre; } string getISBN() const { return m_isbn; } string getTitle() const { return m_title; } string getAuthor() const { return m_author; } int getDate() const { return m_date; } bool getStatus() const { return m_checkedOut; } void setGenre(Genre genre) { m_genre = genre; } void setISBN(string num1, string num2, string num3, string char1); void setTitle(string title) { m_title = title; } void setAuthor(string author) { m_author = author; } void setDate(string year); void checkBookOut() { m_checkedOut = true; }; void checkBookIn() { m_checkedOut = false; }; private: //m_ prefix to denote member variable Genre m_genre; string m_isbn, m_title, m_author; int m_date; bool m_checkedOut; }; //overloads bool operator==(const Book& a, const Book& b); bool operator!=(const Book& a, const Book& b); ostream& operator<<(ostream& os, const Book& book); #endif // !_BOOKCLASS_H_
bookclass.cpp
//bookclass.cpp #include "bookclass.h" //--OVERLOAD OPERATORS--// //compare ISBN numbers bool operator==(const Book& a, const Book& b) { return a.getISBN() == b.getISBN(); } bool operator!=(const Book& a, const Book& b) { return a.getISBN() != b.getISBN(); } //print out book ostream& operator<<(ostream& os, const Book& book) { string genre; switch (book.getGenre()) { case Genre::fiction: genre = "Fiction"; break; case Genre::nonfiction: genre = "Non-Fiction"; break; case Genre::periodical: genre = "Periodical"; break; case Genre::biography: genre = "Biography"; break; case Genre::children: genre = "Children"; break; default: genre = "Default"; break; } return os << "Title: " << book.getTitle() << endl << "Author: " << book.getAuthor() << endl << "Genre: " << genre << endl << "Copyright: " << book.getDate() << endl << "ISBN: " << book.getISBN() << endl << "Checked out:" << book.getStatus() << endl << endl; } //constructor Book::Book() { m_genre = Genre::default; m_isbn = m_title = m_author = ""; m_date = 0; m_checkedOut = false; } //deconstructor Book::~Book() {} //set the ISBN void Book::setISBN(string num1, string num2, string num3, string char1) { size_t check; //check first number check = num1.find_first_not_of("0123456789"); while (check != string::npos) { cout << "Not a valid ISBN number, try again: "; cin >> num1; check = num1.find_first_not_of("0123456789"); } //check second number check = num2.find_first_not_of("0123456789"); while (check != string::npos) { cout << "Not a valid ISBN number, try again: "; cin >> num2; check = num2.find_first_not_of("0123456789"); } //check third number check = num3.find_first_not_of("0123456789"); while (check != string::npos) { cout << "Not a valid ISBN number, try again: "; cin >> num3; check = num3.find_first_not_of("0123456789"); } //check last character check = char1.find_first_not_of("0123456789ABCDEFGHIJKLMNOPQRSTUVWXY"); while (check != string::npos) { cout << "Not a valid ISBN digit or letter, try again: "; cin >> char1; check = char1.find_first_not_of("0123456789ABCDEFGHIJKLMNOPQRSTUVWXY"); } //set isbn m_isbn = ""; m_isbn.append(num1); m_isbn.append("-"); m_isbn.append(num2); m_isbn.append("-"); m_isbn.append(num3); m_isbn.append("-"); m_isbn.append(char1); } //set and check the year of copyright void Book::setDate(string year) { size_t check; check = year.find_first_not_of("0123456789"); while (check != string::npos || year.size() != 4) { cout << "Not a valid year try again: "; cin >> year; check = year.find_first_not_of("0123456789"); } m_date = stoi(year); }
patronclass.h
patronclass.cpp
//patronclass.h #ifndef _PATRONCLASS_H_ #define _PATRONCLASS_H_ #include "std_lib_facilities.h" //class patron class Patron { public: Patron(); ~Patron(); string getName() const { return m_name; } int getCardNum() const { return m_cardNum; } float getLibFees() const { return m_libFees; } bool isFeeOwed() const { return m_feeOwed; } void setName(string name) { m_name = name; } void setCardNum(int num) { m_cardNum = num; } void setFees(float fee); private: string m_name; int m_cardNum; float m_libFees; bool m_feeOwed; }; //helper functions ostream& operator<<(ostream& os, const Patron& patron); #endif // !_PATRONCLASS_H_
patronclass.cpp
//patronclass.cpp #include "patronclass.h" //constructor Patron::Patron() { m_name = ""; m_cardNum = 0; m_libFees = 0.00f; m_feeOwed = false; } //deconstructor Patron::~Patron() {} //set fee void Patron::setFees(float fee) { m_libFees = fee; if (m_libFees <= 0) m_feeOwed = false; else m_feeOwed = true; } //print out patron ostream& operator<<(ostream& os, const Patron& patron) { string owed; if (patron.isFeeOwed()) owed = "Yes"; else owed = "No"; return os << "Name: " << patron.getName() << endl << "Card Number: " << patron.getCardNum() << endl << "Fees Owed?: " << owed << endl << "Fee Amount: " << patron.getLibFees() << endl << endl; }
main.cpp
//main #include "bookclass.h" #include "patronclass.h" int main() { Book lotr; Patron user1; lotr.setTitle("Lord Of The Rings"); lotr.setAuthor("J.R.R Tolkien"); lotr.setGenre(Genre::fiction); lotr.setDate("1954"); lotr.setISBN("1111", "1111", "1111", "J"); cout << lotr; lotr.setISBN("123", "0", "4444", "6"); lotr.checkBookOut(); cout << lotr; user1.setName("Gandalph The Grey"); user1.setCardNum(123456789); user1.setFees(1.23); cout << user1; user1.setFees(0.00f); cout << user1; keep_window_open(); return 0; }
For this exercise I separated everything into their own files just to clean the code up a little bit. It also means I'll only be posting files that are updated in the following exercises.
No comments:
Post a Comment