CMPT 212 Assignment 3 Fall 1997 ------------ Due date: Start of class, Wednesday, November 12, 1997. 1. Goal - To become familiar with C++ class inheritance, abstract classes, and virtual functions. 2. Overview - This program extends Assignment 2 to include class inheritance. - A class hierarchy will be defined to model different kinds of persons. - As a result, the program will support more than kind of person. - From a user's perspective, the program will appear to be very much like the Assignment 2 program, except that it will have different kinds of persons. 3. Description 3.1 General - The program will be a text-based, menu-driven program. - The program will maintain two lists of people. For each person, certan information will be kept, depending on the kind of person. - The program will have four functions: a. Add a person to the end of a list. b. Display a list. c. Empty a list. d. Copy the first list to the second list. - The function are the same as in Assignment 2, except that "Add Person" will ask the user for the kind of person to add. 3.2 Main Menu - The menu will look exactly like this: 1. Add person 2. Print list 3. Empty list 4. Copy list 1 to list 2 5. Quit > _ (The "_" is the cursor, waiting for the user's input.) - When the user enters a choice, the program will carry out the operation selected by the user. - After the operation has been carried out, the program will display the Main Menu and wait for the user to enter another choice. (If the user selects "Quit", the program will quit instead of displaying the Main Menu.) 3.3 "Add Person" Operation - This operation is the same as in Assignment 2, except that the program asks for the kind of person and the information read in will depend on the kind of person. - When the user presses "1" at the Main Menu, the program will ask the user the kind of person to add, then read in the information about the person. The kinds of persons are student, instructor, or programmer. Here is the information which is read in for each kind of person: student: name, department instructor: name, department, salary programmer: name, company, salary Note that only one name is stored for the person, not first and last names. - The user will also be asked which list (1 or 2) to add to. - This information about the person will be added to the end of the chosen list. 3.4 "Print List" Operation - This operation is the same as in Assignment 2, except that the information displayed for each person will depend on the kind of person. - When the user presses "2" at the Main Menu, the program will display the contents of a list on the screen. - The user will be asked which list (1 or 2) to display. - For each person in the chosen list, the information about that person will be displayed. - After the list has been displayed (whether the list is empty or not), this message will be displayed: "There are X people in the list." where X is the number of people in the list. 3.5 "Empty List" Operation - This operation is the same as in Assignment 2. - When the user presses "3" at the Main Menu, the program will remove every person from a list. - The user will be asked which list (1 or 2) to empty. 3.5 "Copy List" Operation - This operation is the same as in Assignment 2. - When the user presses "4" at the Main Menu, the program will empty list 2, then copy every person from list 1 into list 2. 3.6 "Quit" Operation - This operation is the same as in Assignment 2. - When the user presses "5" at the Main Menu, the program will exit. 4. Design of the Program 4.1 Modules - The program will consist of three modules: a "Person" module, a "Person List" module, and "Main" module. 4.2 The Person Module - This module defines a class hierarchy for the different kinds of persons. - See section 4.5 for a description of the classes in the hierarchy. - The source files for this module will be called "person.h" and "person.cpp". 4.3 The Person-List Module - This module defines a class called "plist" which models a list of people. - The source files for this module will be called "plist.h" and "plist.cpp". - The "plist" class must have these member functions: - a default constructor plist(); - a copy constructor plist(const plist&); - a destructor ~plist(); - an assignment operator const plist& operator=(const plist&); - an "addToEnd" function void addToEnd(person *); // Note changed parameter. - a "getFirst" function person * getFirst(); // Note changed parameter. - a "getNext" function person * getNext(); // Note changed parameter. - an "atEnd" function bool atEnd() const; - a "clearList" function void clearList(); - The output (<<) operator must be overloaded so that instances of the "plist" class can be outputted. You do not need an input operator for "plist". ostream& operator<<(ostream&, const plist&); - Each element in the list must not contain the person data, but must contain a pointer to an instance of either a "student" instance, an "instructor" instance, or a "programmer" instance. These instances should be allocated dynamically. 4.4 The Main Module - The source file for this module will be called "asgn2.cpp". - This modules contains the main function of the program. 4.5 Person Class Hierarchy 4.5.1 Person Class - This class models a person. - This must be an abstract class. - Data members: char name[20]; - Function members: default constructor person(); copy constructor person(const person&); "clone" function (virtual function) This function dynamically allocates a copy of the instance, and returns a pointer to it. person * clone() const = 0; read function (virtual function) void read() = 0; display function (virtual function) void display() = 0; read name function void readName(); display name function void displayName(); 4.5.2 Academic Class - This class models an object that belongs to a school. - Data members: department name char dept[4]; - Function members: default constructor academic(); copy constructor academic(const academic&); read department function void readDept(); display department function void displayDept(); 4.5.3 Industry Class - This class models an object that belongs to a company. - Data members: company name char company[4]; - Function members: default constructor industry(); copy constructor industry(const industry&); read company name function void readCompany(); display department function void displayCompany(); 4.5.4 Employee Class - This class models an employee. - The "employee" class is derived from the "person" class. - Addition data members: salary int salary; - Additional or overridden function members: default constructor employee(); copy constructor employee(const employee&); read salary function void readSalary(); display salary function void displaySalary(); 4.5.5 Student Class - This class models a student. - The "student" class is derived from the "person" class and the "academic" class. - Additional data members: (none) - Additional or overridden function members: default constructor student(); copy constructor student(const student&); "clone" function person * clone() const; read function void read(); display function void display(); 4.5.6 Instructor Class - This class models an instructor. - The "instructor" class is derived from the "employee" class and the "academic" class. - Additional data members: (none) - Additional or overridden function members: default constructor instructor(); copy constructor instructor(const instructor&); "clone" function person * clone() const; read function void read(); display function void display(); 4.5.7 Programmer Class - This class models a programmer. - The "programmer" class is derived from the "employee" class and the "industry" class. - Additional data members: (none) - Additional or overridden function members: default constructor programmer(); copy constructor programmer(const programmer&); "clone" function person * clone() const; read function void read(); display function void display(); 5. Design Features 5.1 Error Checking - Very little error checking needs to be done. - The program does not have to check for out-of-memory errors or input errors. 5.2 Given Code - No code is given to you. - This program is based on Assignment 2. If you prefer, you may base your program on my solution to Assignment 2, rather than on your solution to Assignment 2. 5.3 List Implementation - The elements in the list must be allocated using the memory allocation operator "new", and must be released using the memory release operator "delete". - Each element in the list must not contain the person data, but must contain a pointer to an instance of either a "student" instance, an "instructor" instance, or a "programmer" instance. These instances should be allocated dynamically. 5.4 Constants - The maximum length of a person's name (20), the maximum length of a department's name (4), and the maximum length of a company's name (15) must be defined as constants in the program. Each of these constants must be defined in one location so that it can be changed easily. 5.5 Bool Type - If you are using a compiler which does not support the "bool" type, you must define the "bool" type yourself in a header file called "bool.h". Your program must be able to compile without errors under the Borland C++ in the Assignment Lab. 5.6 I/O - When inputting any person (or an instance of a class derived from person), use the "read" virtual function instead of the ">>" operator. Similarly, use the "display" virtual function for outputting instead of the "<<" operator. - You do not need to write the "<<" or ">>" operators for the "person" class or any class derived from the "person" class. - When outputting a list of people, you must use the "<<" operator for the "plist" class. 5.7 Miscellaneous - Use "const" wherever possible. - Use referenes ("&") when appropriate. - Use the smallest scope and lifetime for every variable, constant, and function. 6. Source Code Comments - Your source code must be fully commented. - An example of good commenting style is shown in my solution to Assignment 2. 7. Test Runs - Run this test of the program: Print list 1 Print list 2 Add one student to list 1 Print list 1 Print list 2 Add one instructor to list 1 Print list 1 Print list 2 Add one programmer to list 2 Print list 1 Print list 2 Copy list 1 to list 2 Print list 1 Print list 2 Empty list 1 Print list 1 Print list 2 Copy list 1 to list 2 Print list 1 Print list 2 Add one programmer to list 2 Print list 1 Print list 2 8. What to Hand In - Title page containing: a. Course number b. Assignment number c. Student name d. Student number e. Student email address - Listing of the source code in this order: a. asgn2.cpp b. person.h c. person.cpp d. plist.h e. plist.cpp f. bool.h (if written -- see Section 5.5 above) - Script of the test run (see Section 7 above). 9. Marking - Besides the usual reasons for deducting marks (such as not handing in all of your code, or your program doesn't work completely), marks may be deducted for these reasons: - bad coding style - inconsistent coding style - bad commenting style - code which is difficult to understand - poor variable/constant/function names - failing to meet the requirements described here 10. Ammendments to this Assignment - Ammendments to this assignment may be emailed or posted on the web page. Ammendments may be made to correct errors here or to clarify points. Check your email regularly. 11. Sample Output - Here is a sample run of my program, to give you an idea of what it should look like. 1. Add person 2. Print list 3. Empty list 4. Copy list 1 to list 2 5. Quit > 1 1) student, 2) instructor, or 3) programmer? 1 Enter the person's name (up to 20 characters): Elmer Enter the department (up to 4 characters): CMPT Which list (1 or 2): 1 1. Add person 2. Print list 3. Empty list 4. Copy list 1 to list 2 5. Quit > 1 1) student, 2) instructor, or 3) programmer? 2 Enter the person's name (up to 20 characters): Suzanne Enter the salary (integer): 32000 Enter the department (up to 4 characters): HIST Which list (1 or 2): 1 1. Add person 2. Print list 3. Empty list 4. Copy list 1 to list 2 5. Quit > 1 1) student, 2) instructor, or 3) programmer? 3 Enter the person's name (up to 20 characters): Dave Enter the salary (integer): 100 Enter the company name (up to 15 characters): McPrograms Which list (1 or 2): 1 1. Add person 2. Print list 3. Empty list 4. Copy list 1 to list 2 5. Quit > 2 Which list (1 or 2): 1 STUDENT Name: Elmer Department: CMPT INSTRUCTOR Name: Suzanne Salary: 32000 Department: HIST PROGRAMMER Name: Dave Salary: 100 Company: McPrograms There are 3 people in the list. 1. Add person 2. Print list 3. Empty list 4. Copy list 1 to list 2 5. Quit > 5 (end of assignment)