$24
Overview
In the Before Times, we had a bit of flexibility with room capacity. I mean, not technically-- the fire code is the fire code, after all -- but who among us hasn’t been in an overcrowded lecture hall during the first week of classes, with people sitting in the aisles or leaning against the walls?
All of us, now, apparently. Thanks COVID.
To make sure we can effectively social distance while on campus, you’ve been asked to implement a room reservation system using Object-Oriented design, to make sure we’re effectively tracking how people are utilizing the spaces on campus for learning and studying.
We’ll revisit this design later this semester as we learn data structures, but for now the application will consist of:
• a Person,who has a name and a status (waiting/in-room);
• a Room,which contains an array of Persons;and
• a TrackingApp,which checks Persons in and out of Rooms
In this specification, we will walk you through the creation of these objects and get you started with your test methods.
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
Learning Objectives
The goals of this assignment are:
• Familiarize yourself with the typical setup of Object-Oriented Programming
• Create and use a series of interrelated objects
• Create constructors, accessors, and mutators to set, examine, and modify private data fields
• Familiarize yourself with the difference between (static) class methods and data, and (non-static) instance methods and data
Additional Assignment Requirements and Notes
Keep in mind:
• You are allowed to define any local variables you may need to implement the methods in this specification.
• All methods, public or private, must have their own Javadoc-style method header comments in accordance with the CS 300 Course Style Guide.
• Any source code provided in this specification may be included verbatim in your program without attribution.
• Do NOTinclude any import statements besides java.util.ArrayList and any relevant exceptions.
• Do NOTdefine any additional class or instance fields beyond the ones detailed in this specification.
• You are allowed to define any local variables you may need to implement the methods in this specification.
• You are allowed to define additional private helper methods to help implement the methods in this specification if you like.
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
2
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
CS 300 Assignment Requirements
You are responsible for following the requirements listed on both of these pages on all CS 300 assignments, whether you’ve read them recently or not. Take a moment to review them if it’s been a while:
• Academic Conduct Expectations and Advice,which addresses such questions as:
◦ How much can you talk to your classmates?
◦ How much can you look up on the internet?
◦ What do I do about hardware problems?
◦ and more!
• Course Style Guide,which addresses such questions as:
◦ What should my source code look like?
◦ How much should I comment?
◦ and more!
Getting Started
1. Create a new projectin Eclipse, called something like P03 Room Reservations.
a. Ensure this project uses Java 11. Select “JavaSE-11” under “Use an execution environment JRE” in the New Java Project dialog box.
b. Do NOTcreate a project-specific package; use the default package.
2. Create four (4) Java source files within that project’s src folder:
a. Person.java (does NOT include a main method)
b. Room.java (does NOT include a main method)
c. TrackingApp.java (download it here;includes a main method)
d. OccupancyTester.java (includes a main method)
The methods in the Personand TrackingApp classes will NOTbe static methods; all methods in OccupancyTester should be static; the Roomclass will contain a mix of static and non-static methods.
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
3
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
Implementation Requirements Overview
Your Personclass must contain the following private instance variables:
• name,a String representing the Person’s name
• isWaiting,a boolean which has the value true if and only if the Person is NOTcurrently in a Room
Your Person class must contain the following instance methods:
• public Person(String name)
◦ A one-argument constructor, which initializes the instance variables for the object
◦ Person objects should be assumed to NOT be in a Room at the time of creation
• Accessor methods for both of the object’s instance variables:
◦ public String getName()to get the name.
◦ public boolean isWaiting()to get the waiting status.
• public void toggleWaiting()
◦ Sets isWaiting to true if it is currently false, and to false if it is currently true
• public boolean equals(Object o) {
if (o instanceof Person) {
return this.name.equals(((Person) o).name);
}
return false;
}
Your Room class must contain the following private class variable:
• names,an ArrayList of Strings containing the currently-used name identifiers across all instances of Room objects. This must be initialized to an empty ArrayList when defined(outside of any methods).
Your Room class must contain the following class method:
• public static String[] getNames()
◦ Returns the current list of Room names as an array of Strings
◦ These names MUSTappear in the order they were created!
Your Roomclass must contain the following private instance variables:
• name,a String representing the name of the Room, which must be unique
• occupants,a perfect-sizearray of Persons currently in the Room, with social distancing enforced: Person objects may only occupy elements with even indexes, all odd indexes must always contain null
• currentOccupancy,an int counting the current number of Persons in the Room
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
4
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
Your Roomclass must contain the following instance methods:
• public Room(String name, int capacity)
◦ A two-argument constructor, which initializes the instance variables for the object
◦ Note that capacity is the maximum number of Persons who can occupy the room without social distancing enforced
◦ If the provided capacity is 0 or less, or if the name is already in use by another Room object, this constructor should throw an IllegalArgumentException with a descriptive error message; do not make any changes to the Room.names ArrayList
◦ If the Room is created successfully, add its name to the Room.names ArrayList
• Accessor methods:
◦ public String getName()returns the name of this Room
◦ public int getOccupancy()returns the current number of people in the Room
◦ public int getCOVIDCapacity()returns the number of people allowed in the Room under COVID protocols, defined for our purposes as half of normal capacity
◦ public int getCapacity()returns the number of people allowed in the Room under normal conditions
◦ public boolean contains(Person p)returns true if and only if the provided Person is present in the Room’s occupants array
• Mutator methods:
◦ public boolean checkIn(Person in)returns true if and only if the provided Person was successfully added to the room.
▪ You should add Persons to the array optimally -- that is, to only the first available even-indexedelement.
▪ If the currentOccupancy is equal to the COVID capacity, do NOTcheck the Person into the Room, and return false.
▪ If the Person is added successfully, remember to increment currentOccupancy AND toggle their isWaiting field before you return true.
▪ If the Person passed as input to this method is null OR IS ALREADY IN THE ROOM,throw an IllegalArgumentException with a descriptive error message.
Example of normal (non-error) behavior:
• occupants: {"Hobbes", null, null, null, "Mouna", null, null, null, null}
• currentOccupancy: 2
After checkIn(new Person("Michelle")) is called, the state of the room will be:
◦ occupants: {"Hobbes", null, "Michelle", null, "Mouna", null, null, null, null}
◦ currentOccupancy: 3
• public boolean checkOut(Person out)returns true if and only if the provided Person was successfully removed from the Room.
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
5
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
▪ If the Person is located in the Room, their isWaiting value should be toggled to true, the currentOccupancy of the Room should be decremented, and their index in the occupants array should be set to null before returning true.
▪ If the provided Person was NOT present in the Room, the occupants array and currentOccupancy should NOTchange and the method should return false.
▪ If the Person passed as input to this method is null, throw an IllegalArgumentException with a descriptive error message.
• public String toString()
◦ Returns a String representation of this Room and its occupants
◦ For example, a valid Room named “CS 1240” with a capacity of 9 and a currentOccupancy of 4 might return a String like this, where Persons are represented with their names and empty occupants are represented with a single dash:
CS 1240
===
Mouna
-
Hobbes
-
-
-
Michelle
-
Sulong
The TrackingApp class (download it here) is a basic text-based menu loop built on top of Person and Room, which you can use for interactive testing and Just Messing Around with your code.
Be warned, Hobbes was not feeling particularly charitable when she wrote it, so it breaks easily with careless keyboard input. You’re welcome to make it more robust if you like; we will not be grading this class at all and it is provided solely for your convenience and entertainment.
Your OccupancyTester class must contain boolean test methods for each of your classes (do not write test methods for the TrackingApp class). You must write:
• public static boolean testPerson()to test the constructor, accessors, mutator, and equals method of your Person class
• public static boolean testRoomConstructor()to test the constructor of your
Room class
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
6
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
• public static boolean testRoomAccessors()to test the accessor methods of your
Room class -- this includes both the static ANDinstance accessor methods!
• public static boolean testRoomCheckIn()to test the check-in functionality and its effects on both the Room and the Person being checked in
• public static boolean testRoomCheckOut()to test the check-out functionality and its effects on both the Room and the Person being checked out
• public static boolean testRoomToString()to verify the result of Room’s toString method
If you like, you may break these into further private helper methods as permitted in the Additional Assignment Requirements and Notes at the beginning of this document, but these methods must exist as described in your tester class.
You may add any printed output you wish to these methods, but they MUSTreturn true if the test(s) is/are successful and false otherwise.
Implementation Details and Suggestions
We recommend that you begin your implementation with the Person class, as it’s simple and doesn’t depend on any of the other classes.
Person: Implement and Test
Follow the implementation requirements outlined above, and test your class as follows:
• Create two (or more) instances of the Person object by calling the constructor with different names.
• Use the accessor methods to verify that each object returns different values (and that they’re the ones you expect for that particular instance).
• Verify that the toggleWaiting() method flips the isWaiting value from false to true and back.
• Verify that two Person instances with different names are NOT considered equal, and that two Person instances with the same name ARE considered equal. A Person and any other object (say, a String) should NOT be considered equal.
Room: Implement and Test
Once you have verified that your Person class works as expected, move on to the Room class. Start with the class (static) variable and method. The instance variables and their accessors are very similar to those of the Person class, and the constructor only has its one little uniqueness twist.
STOP:write the tests for these. Create at least two different Rooms,verify that their accessors give you different values. Try creating two Rooms with the same name. Make sure you can’t. Make sure the names array is in the correct order.
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
7
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
Next, write your toString() method, so you can see what’s happening in the Room.
Work on the checkIn() method. Where does the next Person go? How many can you fit? Use the toString() method to monitor the Room as you check more Persons in. (These should be tests in your OccupancyTester class, btw.) Remember to toggle the Person’s isWaiting variable when you check them in.
Finally, implement and test checkOut(). Make sure you flip the checked-out Personback to waiting when they leave the Room!
Assignment Submission
Hooray, you’ve finished this CS 300 programming assignment!
Once you’re satisfied with your work, both in terms of adherence to this specification and the academic conductand style guiderequirements, submit your source code through Gradescope.
For full credit, please submit ONLYthe following files (source code, NOT.class files):
• Person.java
• Room.java
• OccupancyTester.java
Your score for this assignment will be based on the submission marked “active” prior to the deadline. You may select which submission to mark active at any time, but by default this will be yourmost recent submission.
Copyright Notice
This assignment specification is the intellectual property of Mouna Ayari Ben Hadj Kacem, Hobbes LeGault, and the University of Wisconsin–Madison and may not be shared without express, written permission.
Additionally, students are not permitted to share source code for their CS 300 projects on any public site.
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
8
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
Appendix: Sample Output
Here’s some quick sample output from the TrackingApp main method, if you’d like to compare your usage to ours!
TRACKING APP MENU
=================
A) Admin functions
B) Check in/out
C) Quick example setup
D) Quit
• c
TRACKING APP MENU
=================
A) Admin functions
B) Check in/out
C) Quick example setup
D) Quit
• a
ADMIN FUNCTIONS
===============
1) Add new room
2) Check room occupancy
3) Create new person
• 2
1) CS 1240
2) AG 100
Which room: 1 CS 1240
===
Mouna
-
Hobbes
-
Michelle
-
-
TRACKING APP MENU
=================
A) Admin functions B) Check in/out
C) Quick example setup
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
9
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
D) Quit
> b
CHECK IN/OUT MENU
=================
1) Check person in
2) Check person out
3) List all people
4) List all rooms > 2
Which room number? (-1 to see a list of all rooms): 1
Which person? (-1 to see a list of all people): -1
1) Mouna
2) Hobbes
3) Michelle
4) Sulong
Which person? (-1 to see a list of all people): 2
Successfully checked Hobbes out of room CS 1240
TRACKING APP MENU
=================
A) Admin functions
B) Check in/out
C) Quick example setup
D) Quit
• a
ADMIN FUNCTIONS
===============
1) Add new room
2) Check room occupancy
3) Create new person
• 2
1) CS 1240
2) AG 100
Which room: 1 CS 1240
===
Mouna
-
-
-
Michelle
-
-
TRACKING APP MENU
=================
A) Admin functions
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
10
P03 Room Reservations Pair Programming: NOT ALLOWED
CS 300: Programming II – Spring 2021 Due: 11:59 PM CDT on WED 02/24
B) Check in/out
C) Quick example setup
D) Quit
• d
Good-bye!
Note this is very brief and does not explore the functionality of manually adding Person or Room objects, or checking anyone intoa Room.
©2021 Mouna Ayari Ben Hadj Kacem and Hobbes LeGault — University of Wisconsin–Madison
11