import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
// Base Passenger class
abstract class Passenger {
private String name;
private int seatRow;
private int seatCol;
private int age;
protected double ticketPrice;
public Passenger(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
public String getName() {
return name;
}
public int getSeatRow() {
return seatRow;
}
public void setSeatRow(int seatRow) {
this.seatRow = seatRow;
}
public int getSeatCol() {
return seatCol;
}
public void setSeatCol(int seatCol) {
this.seatCol = seatCol;
}
public int getAge() {
return age;
}
public double getTicketPrice() {
return ticketPrice;
}
public abstract void calculateFinalPrice(double basePrice); // Abstract method to calculate price
public void getPassengerDetails() {
System.out.println("Passenger Name: " + name);
System.out.println("Age: " + age);
System.out.println("Seat: " + seatRow + "," + seatCol);
System.out.println("Ticket Price: $" + ticketPrice);
}
}
// RegularPassenger class (inherits from Passenger)
class RegularPassenger extends Passenger {
public RegularPassenger(String name, int age) {
super(name, age);
}
@Override
public void calculateFinalPrice(double basePrice) {
super.ticketPrice = basePrice; // Regular passengers pay the base price
}
}
// VIPPassenger class (inherits from Passenger)
class VIPPassenger extends Passenger {
private double vipSurcharge = 100; // VIP passengers have a surcharge
public VIPPassenger(String name, int age) {
super(name, age);
}
@Override
public void calculateFinalPrice(double basePrice) {
super.ticketPrice = basePrice + vipSurcharge; // Add VIP surcharge to the base price
}
@Override
public void getPassengerDetails() {
super.getPassengerDetails();
System.out.println("VIP Surcharge: $" + vipSurcharge);
}
}
// Seat Availability Class (Encapsulated for seat handling)
class SeatAvailability {
private char[][] seats;
public SeatAvailability(int rows, int cols) {
seats = new char[rows][cols];
initializeSeats();
}
private void initializeSeats() {
for (int i = 0; i < seats.length; i++) {
Arrays.fill(seats[i], 'O'); // 'O' for available
}
}
public boolean isSeatAvailable(int row, int col) {
return seats[row][col] == 'O';
}
public boolean bookSeat(int row, int col) {
if (isSeatAvailable(row, col)) {
seats[row][col] = 'X'; // Mark seat as booked
return true;
}
return false;
}
public boolean cancelSeat(int row, int col) {
if (seats[row][col] == 'X') {
seats[row][col] = 'O'; // Mark seat as available
return true;
}
return false;
}
public void displaySeats() {
System.out.println("Seat Map:");
for (char[] row : seats) {
System.out.println(Arrays.toString(row));
}
}
}
// Pricing Class (Encapsulated for pricing)
class Pricing {
private double basePrice;
public Pricing(double basePrice) {
this.basePrice = basePrice;
}
public double getBasePrice() {
return basePrice;
}
public void setBasePrice(double basePrice) {
this.basePrice = basePrice;
}
}
// Reservation System Class
class ReservationSystem {
private SeatAvailability seatAvailability;
private Pricing pricing;
private Scanner scanner;
private List<Passenger> passengers;
public ReservationSystem(SeatAvailability seatAvailability, Pricing pricing) {
this.seatAvailability = seatAvailability;
this.pricing = pricing;
this.scanner = new Scanner(System.in);
this.passengers = new ArrayList<>();
}
public void displaySeatMap() {
seatAvailability.displaySeats();
}
public void handleBooking() {
System.out.print("Enter passenger name: ");
String name = scanner.nextLine();
System.out.print("Enter passenger age: ");
int age = scanner.nextInt();
System.out.print("Choose passenger type (1: Regular, 2: VIP): ");
int typeChoice = scanner.nextInt();
Passenger passenger;
if (typeChoice == 2) {
passenger = new VIPPassenger(name, age);
} else {
passenger = new RegularPassenger(name, age);
}
boolean bookingSuccessful = false;
while (!bookingSuccessful) {
// Display seat map before booking
displaySeatMap();
System.out.print("Enter seat row (0-3): ");
int row = scanner.nextInt();
System.out.print("Enter seat column (0-3): ");
int col = scanner.nextInt();
// Check for valid seat input
if (row < 0 || row >= 4 || col < 0 || col >= 4) {
System.out.println("Seat number is invalid. Please enter a seat number between 0 and 3.");
continue; // Ask for input again
}
// Check if seat is available
if (seatAvailability.bookSeat(row, col)) {
passenger.setSeatRow(row);
passenger.setSeatCol(col);
passenger.calculateFinalPrice(pricing.getBasePrice());
passengers.add(passenger);
System.out.println("Seat booked successfully!");
bookingSuccessful = true; // Exit loop on successful booking
// Display the seat map after the booking
displaySeatMap();
passenger.getPassengerDetails();
} else {
System.out.println("Seat is already booked. Please choose another seat.");
}
}
scanner.nextLine(); // Clear buffer
}
public void handleCancellation() {
System.out.print("Enter passenger name to cancel: ");
String name = scanner.nextLine();
boolean found = false;
for (Passenger p : passengers) {
if (p.getName().equalsIgnoreCase(name)) {
int row = p.getSeatRow();
int col = p.getSeatCol();
seatAvailability.cancelSeat(row, col);
passengers.remove(p);
found = true;
System.out.println("Booking canceled for " + name);
break;
}
}
if (!found) {
System.out.println("No booking found for passenger: " + name);
}
}
public void handleSearch() {
System.out.print("Enter passenger name to search: ");
String name = scanner.nextLine();
boolean found = false;
for (Passenger p : passengers) {
if (p.getName().equalsIgnoreCase(name)) {
p.getPassengerDetails();
found = true;
break;
}
}
if (!found) {
System.out.println("No passenger found with name: " + name);
}
}
public void showMenu() {
while (true) {
System.out.println("\nMenu:");
System.out.println("1. Book a seat");
System.out.println("2. Cancel a booking");
System.out.println("3. Search for a passenger");
System.out.println("4. Display seat map");
System.out.println("5. Exit");
System.out.print("Choose an option: ");
int choice = scanner.nextInt();
scanner.nextLine(); // Clear buffer
switch (choice) {
case 1:
handleBooking();
break;
case 2:
handleCancellation();
break;
case 3:
handleSearch();
break;
case 4:
displaySeatMap();
break;
case 5:
System.out.println("Exiting the system. Thank you!");
return;
default:
System.out.println("Invalid choice. Please try again.");
}
}
}
}
// Main Class
public class AirlineReservationSystem {
public static void main(String[] args) {
SeatAvailability seatAvailability = new SeatAvailability(4, 4); // 4x4 seats
Pricing pricing = new Pricing(500); // Base price $500
ReservationSystem reservationSystem = new ReservationSystem(seatAvailability, pricing);
reservationSystem.showMenu();
}
}