Skip to main content

1-во Примерно Контролно - Java ООП

Задача 1:

Тема: Онлайн книжарница.

  1. Създайте клас Book, който има title, author, releaseYear, totalCopies, pricePerCopy. Освен това, добавете конструктор с параметри и абстрактен метод boolean sellBook(int num) throws OutOfStockException, който при определен брой книги намалява наличните копия и връща true, а ако копията са свършили, хвърля изключение.

  2. Създайте два подкласа на Book - FictionBook и NonFictionBook. Първият има допълнителна променлива genre, докато вторият - subject.

Задача 2:

Тема: Театрални представления.

  1. Създайте интерфейс Ticketable, който има дефиниция boolean book(int num), която хвърля грешка от типа NoMoreSeatsException

  2. Създайте клас Performance, който имплементира Ticketable, с променливи title, director, date, totalSeats и pricePerSeat.

  3. Създайте два подкласа на Performance - Drama и Comedy. Първият има допълнителна променлива mainActor, докато вторият - leadComedian.

Задача 3:

Тема: Музикални албуми.

  1. Създайте клас Album, който има albumName, artist, releaseYear, totalTracks, pricePerAlbum. Добавете метод boolean buyAlbum(int num) throws OutOfStockException, който при определен брой албуми намалява наличните копия.

  2. Създайте два подкласа на Album - RockAlbum и PopAlbum. Първият има допълнителна променлива bandName, докато вторият - producer.

Задача 4:

Тема: Художествени изложби.

  1. Създайте интерфейс Purchasable, който има метод purchase, който приема брой, връща boolean и хвърля изключение от типа SoldOutException.

  2. Създайте клас Exhibition, който имплементира Purchasable интерфейса и с променливи title, artist, startDate, totalArtworks и ticketPrice. При закупуване на билет намалява броя на свободните билети.

  3. Създайте два подкласа на Exhibition - ModernArt и ClassicArt. Първият има допълнителна променлива mainTheme, докато вторият - eraRepresented.

Задача 5:

Тема: Кафенета.

  1. Създайте клас CoffeeShop, който има shopName, location, foundingYear, totalTables, pricePerCoffee. Добавете метод boolean reserveTable(int num) throws NoMoreTablesException, който при резервация на определен брой маси намалява свободните места.

  2. Създайте два подкласа на CoffeeShop - TraditionalCafe и ModernCafe. Първият има допълнителна променлива mainDessert, докато вторият - `signature

Drink`.

Задача 6:

Тема: Спортни събития.

  1. Създайте интерфейс Attendable, който има метод boolean attend(int num), който приема брой, връща boolean и хвърля изключение от типа SoldOutException.

  2. Създайте клас SportEvent, който имплементира Attendable, с променливи eventName, sportType, date, totalTickets и ticketPrice. При закупуване на билет намалява свободните билети.

  3. Създайте два подкласа на SportEvent - TeamMatch и IndividualMatch. Първият има допълнителна променлива competingTeams, докато вторият - mainAthlete.

Анализ на задание

Задача 1

  1. Създайте клас Event, който да има place; date; startHour; numberOFTickets,priceOfTicket както и конструктор с параметри и абстрактен метод boolean sellTicket(int num)throws NoMoreTicketException, който по подаден брой билети отнема от общия брой толкова, колкото са подадени и връща true, а ако билетите са свършили, хвърля изключението. Член променливите оставете с такъв модификатор за достъп, че да може да се виждат само в рамките на текущия пакет и в наследниците(за да спестите време). Създайте две имплементации на Event – неабстрактните класове Concert и VolleyBallMatch. Първият има член променлива starName, а вторият – firstTeam и secondTeam. Член променливите са с модификатор за достъп както тези в Event. И за двата класа напишете конструктор с параметри. Създайте ваши изключения NoMoreTicketException и UnrecognisedRowException, като предефинирате конструктурите им, приемащи стринг, и методите им getMessage().

Разяснение на задачата

  1. Създаване на основен клас Event:

    • Член-променливи:
      • place (местоположение на събитието)
      • date (дата на събитието)
      • startHour (час на начало)
      • numberOfTickets (брой налични билети)
      • priceOfTicket (цена на един билет)
    • Конструктор с параметри, който приема всички член-променливи.
    • Абстрактен метод:
      • sellTicket(int num):
        • Намалява броя на numberOfTickets с num
        • Ако има достатъчно билети, връща true
        • Ако билетите са свършили, хвърля изключение NoMoreTicketException
    • Модификатор за достъп на член-променливите трябва да бъде такъв, че да са видими само в рамките на текущия пакет и при наследяване.

    Когато задачата казва: "Модификатор за достъп на член-променливите трябва да бъде такъв, че да са видими само в рамките на текущия пакет и при наследяване", тя има предвид модификатора protected в Java.

  2. Създаване на две имплементации на Event:

    • Клас Concert:
      • Член-променлива starName (името на изпълнителя или групата)
      • Конструктор с параметри, който приема всички член-променливи от Event и starName.
    • Клас VolleyBallMatch:
      • Член-променливи firstTeam и secondTeam (имената на състезаващите се отбори)
      • Конструктор с параметри, който приема всички член-променливи от Event и имената на двата отбора.
    • Модификатор за достъп на член-променливите в двата класа трябва да бъде същият като този в Event.
  3. Създаване на две изключения:

    • NoMoreTicketException:
      • Конструктор, който приема String
      • Предефиниран метод getMessage()
    • UnrecognisedRowException:
      • Конструктор, който приема String
      • Предефиниран метод getMessage()

Решение на задачата

Event.java

public abstract class Event {
protected String place;
protected String date;
protected String startHour;
protected int numberOfTickets;
protected double priceOfTicket;

public Event(String place, String date, String startHour, int numberOfTickets, double priceOfTicket) {
this.place = place;
this.date = date;
this.startHour = startHour;
this.numberOfTickets = numberOfTickets;
this.priceOfTicket = priceOfTicket;
}

public abstract boolean sellTicket(int num) throws NoMoreTicketException;
}

Concert.java

public class Concert extends Event {
protected String starName;

public Concert(String place, String date, String startHour, int numberOfTickets, double priceOfTicket, String starName) {
super(place, date, startHour, numberOfTickets, priceOfTicket);
this.starName = starName;
}

@Override
public boolean sellTicket(int num) throws NoMoreTicketException {
if (this.numberOfTickets >= num) {
this.numberOfTickets -= num;
return true;
} else {
throw new NoMoreTicketException("Insufficient tickets!");
}
}
}

VolleyBallMatch.java

public class VolleyBallMatch extends Event {
protected String firstTeam;
protected String secondTeam;

public VolleyBallMatch(String place, String date, String startHour, int numberOfTickets, double priceOfTicket, String firstTeam, String secondTeam) {
super(place, date, startHour, numberOfTickets, priceOfTicket);
this.firstTeam = firstTeam;
this.secondTeam = secondTeam;
}

@Override
public boolean sellTicket(int num) throws NoMoreTicketException {
if (this.numberOfTickets >= num) {
this.numberOfTickets -= num;
return true;
} else {
throw new NoMoreTicketException("Insufficient tickets!");
}
}
}

NoMoreTicketException.java

public class NoMoreTicketException extends Exception {
public NoMoreTicketException(String message) {
super(message);
}
}

UnrecognisedRowException.java

public class UnrecognisedRowException extends Exception {
public UnrecognisedRowException(String message) {
super(message);
}

@Override
public String getMessage() {
return "Unrecognised row: " + super.getMessage();
}
}

Примерен main метод

public class EventDemo {
public static void main(String[] args) {
// Създаване на концерт и волейболен мач
Concert concert = new Concert("Arena Armeec", "15.11.2023", "20:00", 20000, 50.0, "John Smith");
VolleyBallMatch match = new VolleyBallMatch("Arena Armeec", "16.09.2023", "22:00", 2000, 25.0, "Levski", "CSK");

// Опит за продажба на билети
try {
concert.sellTicket(100);
System.out.println("100 tickets sold for John Smith concert!");
} catch (NoMoreTicketException e) {
System.out.println(e.getMessage());
}

try {
match.sellTicket(500);
System.out.println("500 tickets sold for Levski vs CSK match!");
} catch (NoMoreTicketException e) {
System.out.println(e.getMessage());
}

// Опит за продажба на прекалено много билети
try {
concert.sellTicket(25000);
System.out.println("25000 tickets sold for John Smith concert!");
} catch (NoMoreTicketException e) {
System.out.println(e.getMessage());
}
}
}