📄 2018-HL-HotelPoints
IB CS HL Paper 2 Option D — Hotel Loyalty Points
Points
public class Points { private String memberId; private int totalPoints; private int bonusPoints; private String statusNow; private String statusNextYear; private Visits[] allVisits = new Visits[366]; int y; // number of visits this year // Constructor for new member public Points(String id) { memberId = id; bonusPoints = 0; y = 0; statusNow = "Bronze"; } // Constructor for new member with bonus points public Points(String id, int bp) { memberId = id; bonusPoints = bp; y = 0; statusNow = "Bronze"; } // Accessor methods public String getMemberId() { return memberId; } public int getBonusPoints() { return bonusPoints; } public String getStatusNow() { return statusNow; } public Visits getAllVisits(int v) { return allVisits[v]; } public void addVisit(Visits v) { allVisits[y] = v; y = y + 1; } // Q15(e): isGold() — returns true if current status is "Gold" public boolean isGold() { return statusNow.equals("Gold"); } // Q16(c): calculateTotalPoints() // Each day = 1000 points, plus any bonus points public int calculateTotalPoints() { int total = bonusPoints; for (int i = 0; i < y; i++) { total += allVisits[i].getDays() * 1000; } return total; } // Q16(d): daysMissing() // Returns extra days needed to keep same status next year // Bronze: < 10000 | Silver: 10000-49999 | Gold: >= 50000 public int daysMissing() { int total = calculateTotalPoints(); int pointsNeeded = 0; if (statusNow.equals("Gold")) { if (total >= 50000) return 0; pointsNeeded = 50000 - total; } else if (statusNow.equals("Silver")) { if (total >= 10000) return 0; pointsNeeded = 10000 - total; } else { // Bronze return 0; // Can always stay Bronze (no lower tier) } // Convert points to days (rounding up) return (pointsNeeded + 999) / 1000; } }
Visits
public class Visits { private String hotelCode; private int days; public Visits(String h, int d) { hotelCode = h; days = d; } public int getDays() { return days; } }
Customer
import java.util.ArrayList; public class Customer { private String memberId; private String email; public Customer(String a, String b) { memberId = a; email = b; } public String getMemberId() { return memberId; } public String getEmail() { return email; } }
+ Add Class
⚡ Java Execution Console
Save HTML
▶ Run All
Clear
import java.util.ArrayList; import java.util.LinkedList; public class Main { public static void main(String[] args) { System.out.println("===== Hotel Points Demo ====="); // === Create Points objects === Points[] allPoints = new Points[10000]; allPoints[0] = new Points("m100"); allPoints[1] = new Points("m101", 5000); allPoints[2] = new Points("m102", 2000); System.out.println("Created Points array with 3 members."); // === Create Visits and add to Points === Visits v1 = new Visits("h003", 3); Visits v2 = new Visits("h013", 1); Visits v3 = new Visits("h013", 2); Visits v4 = new Visits("h005", 6); allPoints[0].addVisit(v1); allPoints[0].addVisit(v2); allPoints[0].addVisit(v3); allPoints[0].addVisit(v4); allPoints[1].addVisit(v1); allPoints[1].addVisit(new Visits("h004", 6)); allPoints[0].addVisit(new Visits("h001", 2)); allPoints[1].addVisit(new Visits("h002", 4)); allPoints[2].addVisit(new Visits("h003", 3)); allPoints[2].addVisit(new Visits("h005", 8)); // === Q16(b)(i): Trace outputs === System.out.println("\n--- Q16(b): Trace outputs ---"); System.out.println("Q16(b)(i) allPoints[2].getMemberId(): " + allPoints[2].getMemberId()); System.out.println("Q16(b)(ii) allPoints[0].getBonusPoints(): " + allPoints[0].getBonusPoints()); Visits v = allPoints[1].getAllVisits(1); System.out.println("Q16(b)(iii) allPoints[1].getAllVisits(1).getDays(): " + (v != null ? v.getDays() : "null")); // === Q15(e): isGold() === System.out.println("\n--- Q15(e): isGold() ---"); System.out.println("m100 is Gold? " + allPoints[0].isGold()); // === Q16(c): calculateTotalPoints() === System.out.println("\n--- Q16(c): calculateTotalPoints() ---"); System.out.println("m100 total points: " + allPoints[0].calculateTotalPoints() + " (bonus=" + allPoints[0].getBonusPoints() + ", visits=" + allPoints[0].y + ")"); System.out.println("m101 total points: " + allPoints[1].calculateTotalPoints() + " (bonus=" + allPoints[1].getBonusPoints() + ", visits=" + allPoints[1].y + ")"); System.out.println("m102 total points: " + allPoints[2].calculateTotalPoints() + " (bonus=" + allPoints[2].getBonusPoints() + ", visits=" + allPoints[2].y + ")"); // === Q15(c): Tim's status level === System.out.println("\n--- Q15(c): Tim's status (bonus=1000, stays=2+1+6=9 days) ---"); Points tim = new Points("tim01", 1000); tim.addVisit(new Visits("h001", 2)); tim.addVisit(new Visits("h002", 1)); tim.addVisit(new Visits("h003", 6)); System.out.println("Tim's total points: " + tim.calculateTotalPoints() + " → needs >=50000 for Gold, >=10000 for Silver"); // 1000(bonus) + 9*1000 = 10000 → Silver // === Q16(d): daysMissing() === System.out.println("\n--- Q16(d): daysMissing() ---"); Points silverMember = new Points("silver01"); silverMember.addVisit(new Visits("h001", 5)); // 5000 points System.out.println("silver01 (5000pts, status=" + silverMember.getStatusNow() + "): need " + silverMember.daysMissing() + " more days for Silver"); Points goldMember = new Points("gold01"); goldMember.addVisit(new Visits("h001", 20)); // 20000 points System.out.println("gold01 (20000pts, status=" + goldMember.getStatusNow() + "): need " + goldMember.daysMissing() + " days (but needs 50000 for Gold)"); // === Q18(b): goldMails() demo === System.out.println("\n--- Q18(b): goldMails() demo ---"); LinkedList<Customer> allCustomers = new LinkedList<>(); allCustomers.add(new Customer("m100", "m100@hotel.com")); allCustomers.add(new Customer("m101", "m101@hotel.com")); allCustomers.add(new Customer("m102", "m102@hotel.com")); ArrayList<String> goldList = goldMails(allCustomers, allPoints); System.out.println("Gold members' emails: " + goldList.size() + " found"); System.out.println("\n=== Demo Complete ==="); } // Q18(b): goldMails() — returns emails of all current Gold members public static ArrayList<String> goldMails( LinkedList<Customer> allCustomers, Points[] allPoints) { ArrayList<String> result = new ArrayList<>(); for (Customer c : allCustomers) { for (int i = 0; i < allPoints.length; i++) { if (allPoints[i] != null && allPoints[i].getMemberId().equals(c.getMemberId()) && allPoints[i].isGold()) { result.add(c.getEmail()); } } } return result; } }
▶ Run All to execute.