Session 6 |
Home assignment
Please prepare for the first test! Go through the material of the first six sessions!
- it is not enough to read the material or watch the videos in hope that there will be enough time during the test to learn something new!
- please go through the examples; try to change the programs!
- solve the in-class tasks if some are not solved yet!
- the test is a perfect opportunity to show your own skills and knowledge! Prepare them before the test!
Task 1. A nice day in the amusement park (study the code)
The director of the amusement park has signed a contract with you to develop a piece of software for his park. The software has to check the children's age. In the amusement park, only 12+ years old teenagers can take a ride. To check the age, teenagers have to show a document. Usually, teenagers bring ID cards or students cards with them. To speed up the control process, the documents are checked in bulk.
public class IdCard { private String idNumber; public IdCard(String idNumber) { this.idNumber = idNumber; } public boolean isAtLeast12YearsOld() { int currentYear = LocalDate.now().getYear(); return birthYear() <= currentYear - 12; } private int birthYear() { int firstDigit = Integer.parseInt(idNumber.substring(0, 1)); int bYear = Integer.parseInt(idNumber.substring(1, 3)); if (firstDigit <= 2) return 1800 + bYear; if (firstDigit <= 4) return 1900 + bYear; if (firstDigit <= 6) return 2000 + bYear; return 2100 + bYear; } }
public class StudentCard { private int birthYear; public StudentCard(int birthYear) { this.birthYear = birthYear; } public boolean isAtLeast12YearsOld() { return birthYear + 12 <= LocalDate.now().getYear(); } }
public class RussianMountains { public boolean ageControlOK(IdCard[] idCards, StudentCard[] studentCards) { for (IdCard id : idCards) { if (!id.isAtLeast12YearsOld()) return false; } for (StudentCard card : studentCards) { if (!card.isAtLeast12YearsOld()) return false; } return true; } }
Read about the LocalDate
class here and here.
In a week, the director of the amusement park contacts you again and says that some people bring driving license with them. Therefore, some changes must be done in the program.
If we have a look at the ageControlOK
method, then it is easy to change so that it would take in all instances if it has an instance method isAtLeast12YearsOld
. Let us create an interface for this method:
public interface Document { boolean isAtLeast12YearsOld(); }
Change the RussianMountains
class as follows:
public class RussianMountains { public boolean ageControlOK(Document[] documents) { for (Document doc : documents) { if (!doc.isAtLeast12YearsOld()) return false; } return true; } }
Furthermore, the classes IdCard
and StudentCard
have to implement the interface:
public class IdCard implements Document { // the rest code is not changed } public class StudentCard implements Document { // the rest code is not changed } public class Test { public static void main(String[] args) { RussianMountains mountain1 = new RussianMountains(); Document[] documents = { new IdCard("39108071234"), new StudentCard(1991) }; System.out.println("is age OK?: " + mountain1.ageControlOK(documents)); } }
Task 2. Return the documents (update the previous code)
If a person has not passed the age control, the document has to be returned to the person. In the RussianMountain
class, create a method called ageControlFail
. The method takes in an array of documents and returns the documents that fail the age control. The return type of the method is List<Document>
.
In the main method, print all the documents that failed the age control. Make sure that the output is readable (add a method called toString
into the classes IdCard
and StudentCard
).
Submit Test.java into the Moodle.
Hint 1: List
is an interface. That means it is not possible to create an instance of it. ArrayList
implements all the methods of List
and we can create instances of the class. Do not forget about the data type: ArrayList<Document>
.
Task 3. Ferris wheel
The amusement park has decided to open a new ride - Ferris wheel. The age restriction is 14 on this ride (the ride might be dangerous to small kids :). In the Document
interface, delete the isAtLeast12YearsOld
method and replace it with a new method - isAtLeastXYearsOld
. The latter method should check if the person is at least x years old (x is a parameter).
Change the classes IdCard
and StudentCard
so that they would implement the changes in the interface.
The RussinMontain
class must become more general. Therefore, rename the class to AmusementRide
(in IntelliJ: Refactor -> Rename). In the class, add private instance fields for the ride name (String
) and the minimum age when a person is allowed to take a ride on it (int
). Also add a constructor and the toString
method.
Create a new test class called Test2
. In its main method, create at least two amusement rides (one has at least 14 years old restriction, and the other one has at least 12 years old restriction). Also create an array with at least two documents (a student card whose holder is 13 years old and ID card whose holder is 15 years old). Print out the information about each person if they can take a ride on each amusement ride.
Task 4. Fortune's wheel
The sales manager of the amusement park has decided to raffle off some special gifts among the most active visitors of the park. Write a program which returns a list of the most active visitors and chooses the winner out of them. In the final raffle off, only three visitors participate.
First of all, create Visitor
class which has a private instance field for visitor's name (String
) and a private instance field which keeps the number of rides (int
). Add a constructor which instantiates all the instance fields. Also add the get
methods and the toString
method. The latter has to show visitor's name.
Create a class called FortuneWheel
. The class has an instance method addVisitor
which registers the visitors of the park (Hint: create a private instance field which would hold a list of visitors in an appropriate data structure). Using the overloading create two versions of the method: 1. the method takes in an instance of the class Visitor
as a parameter; 2. the method takes in two parameters: the name of the visitor and the number of times the visitor has visited the park.
In the class, also add the theMostActive(int n)
method. The method has to return n the most active visitors out of the list (or the whole list if n is larger than the size of the list). The most easier way to do that is to sort the list by the number of visits. We can use the method sort
of the java.util.Collections
class. However, the sort
method needs some help from us. In the Visitor
class, we have to explain Java what and how exactly we want to compare (check the example at the end of the page). Also pay attention to the fact that the parameter of the Collections.sort
method is the List
interface. Since ArrayList
implements the interface, we can use it as a parameter.
The method winnerOfLottery
has to return one out of the three the most active visitors (Hint: use the method random
).
Create a test class Test3
. In its main method create a Fortune's wheel and at least 5 visitors. Register the visitors to the lottery, test the fortune's wheel methods and print the winner.
Some useful links: List and Comparable
Submit at least the following files (preferably zipped) into the Moodle:
- RussianMountain.java
- AmusementRide.java
- Document.java
- IdCart.java
- StudentCard.java
- Visitor.java
- FortuneWheel.java
- Test.java
- Test2.java
- Test3.java