// library.cpp // ---------------------------------------------------------------------- // Do not modify this file. // // CSE 143 // Homework 2 // http://www.cs.washington.edu/education/courses/143/00su/homework/hw2/ // 25 Jun 2000; updated on 28 Jun 2000, 02 Jul 2000 #include #include #include #include #include "library.h" const int MAX_LINE_LENGTH = 120; // when reading from a file ////////////////////////////////////////////////////////////////////// // misc. utility functions void waitForChar(void) { char junkchar; cout << endl << "Type a character and ENTER to continue... "; cin >> junkchar; } ////////////////////////////////////////////////////////////////////// // finances int computeFine(int daysOverdue) { assert(daysOverdue > 0); return (FIXED_FINE + PER_DAY_FINE * daysOverdue); } ////////////////////////////////////////////////////////////////////// // I/O void readBookFile(char fileName[], LibraryBook bookList[], int maxBookCount, int &bookCount) { assert(maxBookCount > 0); assert(strlen(fileName) > 0); // counts number of book records read so far bookCount = 0; // Mac and UNIX users: omit ios::nocreate argument ifstream inFile(fileName, ios::nocreate); if (!inFile) { cerr << endl << "unable to open file: " << fileName << endl; bookCount = -1; return; } while (inFile && (bookCount < maxBookCount)) { char title[MAX_TITLE_LENGTH], author[MAX_AUTHOR_LENGTH]; int ID; inFile >> ID; // need to skip the trailing whitespace after ID, // i.e. trailing characters, including endline (\n) char line[MAX_LINE_LENGTH]; inFile.getline(line, MAX_LINE_LENGTH); inFile.getline(title, MAX_TITLE_LENGTH); if (strlen(title) == 0) { // stop at first blank line break; } inFile.getline(author, MAX_AUTHOR_LENGTH); LibraryBook newBook(ID, title, author); bookList[bookCount] = newBook; bookCount++; } } // end readBookFile void processTransactionsFile(char fileName[], LibraryBook bookList[], int bookCount) { assert(bookCount > 0); assert(strlen(fileName) > 0); // Mac and UNIX users: omit ios::nocreate argument ifstream inFile(fileName, ios::nocreate ); if (!inFile) { cerr << endl << "unable to open file: " << fileName << endl; return; } int transactionCount = 0; while (inFile) { int month, day, year, userID, bookID; char transactionCode; transactionCount++; if (transactionCount % ENTRIES_PER_SCREEN == 0) { waitForChar(); } // dec is not a local variable, but a manipulator that forces cin // to read values in decimal (base 10) format inFile >> dec >> month >> day >> year >> userID >> transactionCode >> bookID; // need to skip the trailing whitespace after bookID, // i.e. extract trailing characters, including \n char line[MAX_LINE_LENGTH]; inFile.getline(line, MAX_LINE_LENGTH); Date transactionDate(month, day, year); if (!transactionDate.isValid()) { cerr << "invalid transaction date" << endl; return; } if (userID <= 0 || !(transactionCode == 'i' || transactionCode == 'o')) { cerr << "invalid transaction ID or code" << endl; return; } int i = findBookByID(bookList, bookCount, bookID); char bookTitle [MAX_TITLE_LENGTH]; bookList[i].getTitle (bookTitle); cout << endl << "transaction date: "; transactionDate.printDate(); cout << "\tbook ID: " << bookID << endl; cout << "title: " << bookTitle << endl; cout << "check "; if (transactionCode == 'o') { cout << "out"; } else { cout << "in"; } cout << " by user " << userID << endl; if (transactionCode == 'o') { // check out book // verify book is not checked out if (bookList[i].isCheckedOut()) { cerr << "transaction invalid; cannot check out a book " << "which is already checked out" << endl; return; } bookList[i].checkOut(transactionDate, userID, LOAN_DURATION); } else { // check in (return) book // verify book is checked out if (!bookList[i].isCheckedOut()) { cerr << "transaction invalid; cannot check in a book " << "which is not checked out" << endl; return; } cout << "due "; (bookList[i].getDueDate()).printDate(); if (bookList[i].isOverdue(transactionDate)) { int daysPastDue = bookList[i].daysOverdue(transactionDate); cout << ", overdue by " << daysPastDue << " days, "; cout << "overdue fine: " << computeFine(daysPastDue) << " cents" << endl; } //end overdue book bookList[i].checkIn(); } // end check-in } // end loop over lines in file } // end readTransactionsFile int findBookByID(LibraryBook bookList[], int bookCount, int searchID) { for (int i = 0; i < bookCount; i++) { if (bookList[i].getID() == searchID) { return i; } } return -1; } // end findBookByID void printBookList(LibraryBook bookList[], int bookCount) { for (int i = 0; i < bookCount; i++) { bookList[i].printRecord(); cout << endl; if ((i + 1) % ENTRIES_PER_SCREEN == 0) { waitForChar(); } } cout << bookCount << " total books listed" << endl << endl; } // end printBookList