代做Project Requirements代做R编程
- 首页 >> Java编程Project Requirements
question 1
In this project you need to write software for UIC's finance office. The finance office deals with the finances of different kinds of people at UIC: students who pay money for their tuitions, employees who receive money for their salaries, etc. All these people pay or receive a certain amount of money, expressed in yuans.
Write a Payer interface for people who pay money to the finance office, with the following UML specification:
and a Person class that implements Payer and has the following UML specification:
The name instance variable indicates the name of the Person. The debt instance variable indicates the amount of money that the person must pay to UIC (to simplify the assignment we will assume that money is always expressed as an integer number of yuans).
The setDebt method changes the amount of debt that a person has. The setDebt method is protected, not public. This means that only subclasses of the Person class can use the setDebt method. All the other classes in the software cannot use the setDebt method, so they cannot change the amount of debt a person has, which is good for security.
The purpose of the pay method is to decrease or increase the amount of debt a person has (depending on what kind of person it is) by the amount given as argument to the method. The pay method of the Person class is abstract, since we do not know what kind of person the person is (a person paying money or a person receiving money).
Add a class Student that extends Person. The constructor of the Student class takes as arguments a name and the amount of UIC debt that the student has (because the student needs to pay tuition or pay for the dormitory, for example). The Student class does not have any instance variable.
The pay method of the Student class makes the student pay money to UIC, which decreases the amount of debt that the student has by the amount of money given as argument to the method. A student can have a negative debt (meaning that the student paid too much to UIC, which always makes UIC happy).
question 3
Add a class Employee that extends Person. The constructor of the Employee class takes as arguments the name of the employee and the salary that UIC must pay to the employee. If the salary given as argument is strictly less than zero then the constructor must throw a NegativeSalaryException with the message "An employee cannot have a negative salary!" The Employee class does not have any instance variable.
Warning: the constructor of the Employee class takes as argument the salary of the employee (the amount of money that UIC must pay to the employee) but the debt instance variable of the Person class indicates how much money the person must pay to UIC. Therefore a positive salary is the same as a negative debt.
The pay method of the Employee class makes UIC pay money to the employee, which decreases the current salary of the employee by the amount of money given as argument to the method (so the debt of the employee becomes less negative!) For example, if an employee currently has a salary of 10000 yuans (-10000 yuans of debt) and pay(2000) is called then the employee's salary becomes 8000 yuans (-8000 yuans of debt, meaning that UIC still needs to pay an extra 8000 yuans to the employee after paying the 2000 yuans). It is fine for the pay method to be given a negative value as argument, which means the employee then just receives a salary increase. For example, if an employee currently has a salary of 10000 yuans and pay(-2000) is called then the employee's salary becomes 12000 yuans. An employee cannot be overpaid money by UIC though, so the current salary of the employee must always be positive or zero, never negative (the debt of the employee cannot be positive). If the argument given to the pay method is too positive and would change the employee's salary to become negative, then instead the current salary of the employee must not change and the pay method must throw a NegativeSalaryException with the message "An employee cannot be overpaid by XXX yuans!", where XXX is replaced with the amount of the overpayment. For example, if an employee currently has a salary of 10000 yuans and pay(12000) is called then the employee still has a salary of 10000 yuans and the method throws a NegativeSalaryException with the message "An employee cannot be overpaid by 2000 yuans!"
Note: to simplify the project, do not worry about the setDebt method.
Change other classes and interfaces as necessary.
question 4
Add a class FacultyMember that extends Employee. The constructor of the FacultyMember class takes as arguments the name of the faculty member and the salary that UIC must pay to the faculty member. The FacultyMember class does not have any instance variable.
The pay method of the FacultyMember class makes UIC pay money to the faculty member, which decreases the current salary of the faculty member by the amount of money given as argument to the method (so the debt of the faculty member becomes less negative!) In addition to the normal salary, a faculty member might also temporarily borrow extra money from UIC that the faculty member will need to reimburse later, so the salary of a faculty member might then become negative (the debt becomes positive) without throwing any exception: a negative salary (positive debt) then just means that the faculty member has temporarily borrowed some money.
Change other classes and interfaces as necessary.
question 5
Add a FinanceOffice class with the following UML specification:
When a finance office is created, it has an arraylist of payers but the arraylist is empty (the arraylist does not contain any payer).
The addPayer method takes a payer as argument and adds the payer to the arraylist of payers for the finance office.
The totalDebt method returns as result the total amount of debt of all the payers of the finance office (if the result is positive then it means that the finance office will receive more money from all the students (and the faculty members with debts) than it needs money to pay all the salaries of the employees and UIC will then make a profit; if the result is negative then it means that the finance office will not get enough money from the students and will need to borrow extra money from a bank to be able to pay all the employees, otherwise UIC will go bankrupt; if the result is zero then it means that the money paid by all the students will exactly cover the salaries of the employees).
The getDebt method takes as argument the name of a payer and returns as result the current amount of debt for this payer. If the finance office does not have a payer with the correct name then the getDebt method must throw an UnknownPayerException with the message "Payer XXX unknown", where XXX is replaced with the name of the payer. Do not worry about multiple payers having the same name.
The pay method takes as argument the name of a payer and an amount of money and uses the pay method of that payer to pay that amount of money to that payer. If the finance office does not have a payer with the correct name then the pay method must throw an UnknownPayerException with the message "Payer XXX unknown", where XXX is replaced with the name of the payer. Do not worry about multiple payers having the same name.
Note: the pay method does not catch any exception, it only throws exceptions.
question 6
In this question and the next one we want to create a command line interface (CLI) for our finance office software.
Add aCLI class with amain method. Your code then has two classes with amain method: the Test class that you can use to run all your tests for all your classes, and the CLI class that you will now use to run the interactive text-based interface of your program.
The CLI class does not have any testCLI method because this class is only used to allow users to use the software interactively.
Add to the CLI class a private static input instance variable which is a Scanner object that reads input from the standard input stream System.in:
private static Scanner input = new Scanner(System.in);
Always use this input scanner object when you need to read input. (Never close this scanner object, because this would also close the standard input stream System.in, and then the next time you tried to read something from the standard input stream you would get a NoSuchElementException!)
In addition to the main method and the input instance variable, the CLI class has two methods called readLine and readPosInt.
The readLine method is static and private, it takes a string as argument, and returns another string as result. The readPosInt method is static and private, it takes a string as argument, and returns a positive integer as result.
The readLine method uses System.out.print (not println) to print its string argument on the screen (later when we use the readLine method, the string argument of the method will be a message telling the user to type some text). Then the readLine method uses the input scanner object to read a whole line of text from the user of the program and returns the text as result.
The readPosInt method uses System.out.print (not println)to print its string argument on the screen (later when we use the readPosInt method, the string argument of the method will be a message telling the user to type some integer). Then the readPosInt method uses the input scanner object to read an integer from the user of the program.
After reading the integer, the readPosInt method must also use the scanner's nextLine method to read the single newline character that comes from the user pressing the Enter key on the keyboard after typing the integer (if you do not read this newline character using the nextLine method inside the readPosInt method, then the newline character will remain in the input stream, and, the next time you use the readLine method described above, the readLine method will just immediately read only the newline character from the input stream and return an empty string as result, without waiting for the user to type anything!)
If the user types something which is not an integer, then the nextInt method of the scanner will throw an InputMismatchException. In that case the code of your readPosInt method must catch the exception, use System.out.println to print the error message "You must type an integer!" to the user (use System.out.println for this, not System.err.println, otherwise you might hit a bug in Eclipse...), use the scanner's nextLine method to read (and ignore) the wrong input typed by the user of the program (if you do not do this, the wrong input typed by the user will remain in the input stream, and the next time you call the nextInt method again, you will get an InputMismatchException again!), and then do the whole thing again (including printing again the string argument of the readPosInt method) to try to read an integer again (hint: put the whole code of the method inside a while loop).
After reading the integer and the newline character (which is just ignored), the readPosInt method tests the integer. If the integer is bigger than or equal to zero, then the readPosInt method returns the integer as result. If the integer is strictly less than zero, then the readPosInt method uses System.out.println to print the error message "Positive integers only!" to the user (use System.out.println for this, not System.err.println, otherwise you might hit a bug in Eclipse...), and then does the whole thing again (including printing again the string argument of the readPosInt method) to try to read an integer again (hint: just print the error message, and then the while loop you already have around the whole code will automatically do the whole thing again...)
For example, if you want to check that your two methods readLine and readPosInt work correctly, put the following code in the main method of your CLI class:
public static void main(String[] args) {
String str1 = readLine("Type some text: ");
System.out.println("Text read is: " + str1);
int i = readPosInt("Type an integer: ");
System.out.println("Integer read is: " + i);
String str2 = readLine("Type some text again: ");
System.out.println("Text read is: " + str2);
}
then running the main method of the CLI class should look like this (where aaaa bbbb, cccc, dddd eeee, -100, -200, 1234, and ffff gggg are inputs typed by the user on the keyboard):
Type some text: aaaa bbbb
Text read is: aaaa bbbb
Type an integer: cccc
You must type an integer!
Type an integer: dddd eeee
You must type an integer!
Type an integer: -100
Positive integers only!
Type an integer: -200
Positive integers only!
Type an integer: 1234
Integer read is: 1234
Type some text again: ffff gggg
Text read is: ffff gggg
question 7
Once you have checked that your methods readLine and readPosInt work correctly, remove all the code inside the main method of the CLI class so that the main method is empty again.
In the rest of this question, use the readLine and readPosInt methods every time your program needs to read a string or an integer from the user.
In the empty main method of the CLI class, create a single FinanceOffice object with the name "UIC FO". The main method of the CLI class must then print a menu that allows the user of your software to do six different actions that involve the finance office object, and your program must then read an integer from the user that indicates which action must be performed by the program (see below for the details of each action). Use the readPosInt method to print the menu (give the string for the menu as the argument of readPosInt) and to read the integer typed by the user.
For example, the menu should look like this:
Type an action (total:1 add:2 get:3 give:4 take:5 quit:6):
The user then types an integer between 1 and 6 to select the action.
For example (where 3 is an input from the user):
Type an action (total:1 add:2 get:3 give:4 take:5 quit:6): 3
and your program then performs the selected action.
After an action has been performed by your program, your program must again print the menu and ask again the user of the program for the next action to perform (hint: put the whole code of the main method inside a while loop, except for the one line of code that creates the single finance office object).
If the user types an integer which is not between 1 and 6, then your program must print an error message "Unknown action!" to the user (hint: when testing the integer for the action, use the default case of a switch statement) and then print the menu again (by just going back to the beginning of the while loop).
For example (where 7 is an input from the user):
Type an action (total:1 add:2 get:3 give:4 take:5 quit:6): 7
Unknown action!
Type an action (total:1 add:2 get:3 give:4 take:5 quit:6):
If the user types something which is not an integer, the readPosInt method that you implemented in the previous question will automatically repeat the menu and ask the user to type an integer again until the user actually types an integer, so you do not have to worry about this in the code of the main method of your CLI class.
For example (where aaaa and bbbb cccc are inputs from the user):
Type an action (total:1 add:2 get:3 give:4 take:5 quit:6): aaaa
You must type an integer!
Type an action (total:1 add:2 get:3 give:4 take:5 quit:6): bbbb cccc
You must type an integer!
Type an action (total:1 add:2 get:3 give:4 take:5 quit:6):
Here are the detailed explanations for each action.