GitHunt
SO

Soluvent/CartItem-Second

Лабораторна робота №2

📒 Readme ver 1.0 30.09.2025 12:21

Fallback image description

Лабораторна робота №2 Основи роботи з класами та об'єктами. Конструктор.

ReadMe

IntelliJ IDEA
Java
Version: 1.0

📝 Завдання

1. Створіть клас "Товар" (Item)

  • Клас «Товар» має містити такі поля:
  • Найменування (рядок)
  • Ціна (float).
  • Клас «Товар» повинен містити конструктор, який приймає два параметри:
  • Найменування;
  • Початкову ціну товару.
  • Клас «Товар» повинен мати такі публічні методи:
  • Підвищення ціни на певний відсоток (значення відсотка типу float передається як аргумент методу);
  • Зниження ціни певний відсоток (значення відсотка типу float передається як аргумент методу).
  • У класі має бути реалізована:
  • Перевірка ціни на негативне значення
  • Якщо конструкторі передається негативне значення ціни, чи результаті зниження ціни на >100% ціна стає негативною, вона має бути примусово встановлено 0.

2. Створіть клас «Кошик» (Cart)

  • «Кошик» має реалізовувати структуру даних стек, у якому містяться об'єкти класу «товар». Вважатимемо, що ми додаємо завжди по 1 одиниці товару. Стек «всередині» реалізується традиційним масивом об'єктів Item. Клас повинен містити перевірки, пов'язані з роботою стека - переповнення стека, спроба витягти елемент із порожнього стека і т.д.
  • «Кошик» повинен містити конструктор з 1 параметром – максимальною кількістю елементів у стеку. У цьому архітекторі відбувалася ініціалізація масиву, який реалізує стек.
  • «Кошик» повинен містити такі публічні методи: додавання товару, видалення товару, підрахунок суми цін товарів у кошику (пройтися за елементами масиву та скласти всі значення цін), підвищення та зниження цін усіх товарів у стеку (два окремі методи, значення ціни передається як параметр методу, необхідно пройтись по всіх елементах масиву та передати відповідне повідомлення об'єктам.

3. У методі Main необхідно створити об'єкт класу «Кошик» з деякою максимальною кількістю елементів у стеку.

  • Заповнити кошик об'єктами класу Item;
  • Вивести суму цін товарів усередині кошика;
  • Підняти ціни в кошику на 15%, вивести змінену суму цін на консоль.
  • Знизити ціни в кошику на 30%, вивести змінену суму цін на консоль.

4. Перепишіть клас Cart

  • Використовуючи замість стека чергу без зміни інтерфейсу класу.

🧠 Mindmap

graph LR;
    A[Завдання 1: Клас Item]:::task1 --> B[Створити товар з назвою та ціною]:::step1
    B --> C[Перевірити ціну на негативне значення]:::step1
    C --> D[Реалізувати метод підвищення ціни на відсоток]:::step1
    D --> E[Реалізувати метод зниження ціни на відсоток]:::step1
    E --> F[Захист від негативної ціни після зниження]:::step1
    
    classDef task1 fill:#C8E6C9,stroke:#66BB6A,stroke-width:3px,rx:20,ry:20,color:#1B5E20
    classDef step1 fill:#F1F8F4,stroke:#81C784,stroke-width:2px,rx:16,ry:16,color:#2E7D32
Loading
graph LR;
    A[Завдання 2: Клас Cart - Стек]:::task2 --> B[Ініціалізувати масив заданого розміру]:::step2
    B --> C[Реалізувати метод додавання товару]:::step2
    C --> D[Реалізувати метод видалення товару]:::step2
    D --> E[Реалізувати підрахунок загальної суми]:::step2
    E --> F[Реалізувати зміну цін всіх товарів]:::step2
    F --> G[Додати перевірки на переповнення та порожній стек]:::step2
    
    classDef task2 fill:#B3E5FC,stroke:#4FC3F7,stroke-width:3px,rx:20,ry:20,color:#01579B
    classDef step2 fill:#E1F5FE,stroke:#4DD0E1,stroke-width:2px,rx:16,ry:16,color:#0277BD
Loading
graph LR;
    A[Завдання 3: Демонстрація Main]:::task3 --> B[Створити кошик на 10 товарів]:::step3
    B --> C[Додати 6 товарів у кошик]:::step3
    C --> D[Вивести список товарів та загальну суму]:::step3
    D --> E[Підвищити ціни на 15% та вивести нову суму]:::step3
    E --> F[Знизити ціни на 30% та вивести фінальну суму]:::step3
    
    classDef task3 fill:#A5D6A7,stroke:#4CAF50,stroke-width:3px,rx:20,ry:20,color:#1B5E20
    classDef step3 fill:#F1F8F4,stroke:#66BB6A,stroke-width:2px,rx:16,ry:16,color:#2E7D32
Loading
graph LR;
    A[Завдання 4: Клас Cart - Черга]:::task4 --> B[Реалізувати циклічну чергу на масиві]:::step4
    B --> C[Реалізувати метод додавання товару]:::step4
    C --> D[Реалізувати метод видалення товару]:::step4
    D --> E[Зберегти той самий інтерфейс методів]:::step4
    E --> F[Продемонструвати взаємозамінність структур даних]:::step4
    
    classDef task4 fill:#80DEEA,stroke:#26C6DA,stroke-width:3px,rx:20,ry:20,color:#006064
    classDef step4 fill:#E0F7FA,stroke:#4DD0E1,stroke-width:2px,rx:16,ry:16,color:#00838F
Loading

🛠️ Реалізація коду

Завдання 1: Клас "Товар" (Item)

Note

Створює клас "Товар" з найменуванням та ціною, методами підвищення/зниження ціни на відсоток, перевіркою на негативні значення.

class Item {
    private String name;
    private float price;
    
    // Конструктор приймає назву та ціну
    // Якщо ціна негативна - ставимо 0
    public Item(String name, float price) {
        this.name = name;
        this.price = price < 0 ? 0 : price;
    }
    
    // Підвищуємо ціну на вказаний відсоток
    public void increasePrice(float percent) {
        price += price * (percent / 100);
    }
    
    // Знижуємо ціну на вказаний відсоток
    // Якщо результат негативний - ставимо 0
    public void decreasePrice(float percent) {
        float newPrice = price - price * (percent / 100);
        price = newPrice < 0 ? 0 : newPrice;
    }
    
    public String getName() {
        return name;
    }
    
    public float getPrice() {
        return price;
    }
    
    @Override
    public String toString() {
        return String.format("%s: %.2f грн", name, price);
    }
}

Завдання 2: Клас "Товар" (Item)

Note

Створює клас "Кошик" на основі структури стек з масивом, методами додавання/видалення товарів, підрахунку суми, зміни цін всіх товарів, перевірками на переповнення та порожній стек.

class Cart {
    private Item[] items;    // Масив для зберігання товарів
    private int top;         // Індекс останнього елемента (-1 якщо порожній)
    private int maxSize;     // Максимальний розмір стека
    
    public Cart(int maxSize) {
        this.maxSize = maxSize;
        this.items = new Item[maxSize];
        this.top = -1;
    }
    
    // Додаємо товар у стек
    public void addItem(Item item) {
        if (isFull()) {
            System.out.println("Помилка: Кошик переповнений!");
            return;
        }
        items[++top] = item;  // Збільшуємо top і додаємо елемент
        System.out.println("Додано: " + item);
    }
    
    // Забираємо товар зі стека
    public Item removeItem() {
        if (isEmpty()) {
            System.out.println("Помилка: Кошик порожній!");
            return null;
        }
        Item item = items[top];
        items[top--] = null;  // Видаляємо елемент і зменшуємо top
        System.out.println("Видалено: " + item);
        return item;
    }
    
    // Рахуємо загальну суму всіх товарів
    public float calculateTotal() {
        float total = 0;
        for (int i = 0; i <= top; i++) {
            total += items[i].getPrice();
        }
        return total;
    }
    
    // Підвищуємо ціни всіх товарів на відсоток
    public void increaseAllPrices(float percent) {
        for (int i = 0; i <= top; i++) {
            items[i].increasePrice(percent);
        }
        System.out.println("Ціни підвищено на " + percent + "%");
    }
    
    // Знижуємо ціни всіх товарів на відсоток
    public void decreaseAllPrices(float percent) {
        for (int i = 0; i <= top; i++) {
            items[i].decreasePrice(percent);
        }
        System.out.println("Ціни знижено на " + percent + "%");
    }
    
    private boolean isEmpty() {
        return top == -1;
    }
    
    private boolean isFull() {
        return top == maxSize - 1;
    }
    
    public void displayItems() {
        if (isEmpty()) {
            System.out.println("Кошик порожній");
            return;
        }
        System.out.println("\nТовари в кошику:");
        for (int i = 0; i <= top; i++) {
            System.out.println((i + 1) + ". " + items[i]);
        }
    }
}

Завдання 3: Клас "Товар" (Item)

Note

Демонструє роботу: створює кошик, додає 6 товарів, виводить суму, підвищує ціни на 15%, знижує на 30%, виводить результати після кожної операції.

public class Main {
    public static void main(String[] args) {
        // Створюємо кошик на 10 товарів
        Cart cart = new Cart(10);
        
        // Додаємо 6 товарів
        cart.addItem(new Item("Молоко", 35.50f));
        cart.addItem(new Item("Хліб", 20.00f));
        cart.addItem(new Item("Яйця", 45.00f));
        cart.addItem(new Item("Сир", 120.00f));
        cart.addItem(new Item("Масло", 65.50f));
        cart.addItem(new Item("Цукор", 28.00f));
        
        // Виводимо список і суму
        cart.displayItems();
        System.out.println("\nЗагальна сума: " + String.format("%.2f", cart.calculateTotal()) + " грн");
        
        // Підвищуємо ціни на 15%
        cart.increaseAllPrices(15);
        System.out.println("Нова сума: " + String.format("%.2f", cart.calculateTotal()) + " грн");
        
        // Знижуємо ціни на 30%
        cart.decreaseAllPrices(30);
        System.out.println("Нова сума: " + String.format("%.2f", cart.calculateTotal()) + " грн");
    }
}

Завдання 4: Клас "Товар" (Item)

Note

Переписує клас "Кошик" з використанням черги замість стека, зберігаючи той самий інтерфейс методів (демонструє принцип інкапсуляції та взаємозамінності структур даних).

class Cart {
    private Item[] items;    // Масив для зберігання товарів
    private int front;       // Індекс першого елемента
    private int rear;        // Індекс останнього елемента
    private int size;        // Кількість елементів у черзі
    private int maxSize;     // Максимальний розмір черги
    
    public Cart(int maxSize) {
        this.maxSize = maxSize;
        this.items = new Item[maxSize];
        this.front = 0;
        this.rear = -1;
        this.size = 0;
    }
    
    // Додаємо товар у чергу
    public void addItem(Item item) {
        if (isFull()) {
            System.out.println("Помилка: Кошик переповнений!");
            return;
        }
        // Циклічна черга: після останнього індекса повертаємось на початок
        rear = (rear + 1) % maxSize;
        items[rear] = item;
        size++;
        System.out.println("Додано: " + item);
    }
    
    // Забираємо товар з черги
    public Item removeItem() {
        if (isEmpty()) {
            System.out.println("Помилка: Кошик порожній!");
            return null;
        }
        Item item = items[front];
        items[front] = null;
        front = (front + 1) % maxSize;
        size--;
        System.out.println("Видалено: " + item);
        return item;
    }
    
    // Рахуємо суму всіх товарів
    // Потрібно пройтись від front по колу
    public float calculateTotal() {
        float total = 0;
        for (int i = 0; i < size; i++) {
            int index = (front + i) % maxSize;
            total += items[index].getPrice();
        }
        return total;
    }
    
    // Підвищуємо ціни всіх товарів
    public void increaseAllPrices(float percent) {
        for (int i = 0; i < size; i++) {
            int index = (front + i) % maxSize;
            items[index].increasePrice(percent);
        }
        System.out.println("Ціни підвищено на " + percent + "%");
    }
    
    // Знижуємо ціни всіх товарів
    public void decreaseAllPrices(float percent) {
        for (int i = 0; i < size; i++) {
            int index = (front + i) % maxSize;
            items[index].decreasePrice(percent);
        }
        System.out.println("Ціни знижено на " + percent + "%");
    }
    
    private boolean isEmpty() {
        return size == 0;
    }
    
    private boolean isFull() {
        return size == maxSize;
    }
    
    public void displayItems() {
        if (isEmpty()) {
            System.out.println("Кошик порожній");
            return;
        }
        System.out.println("\nТовари в кошику:");
        for (int i = 0; i < size; i++) {
            int index = (front + i) % maxSize;
            System.out.println((i + 1) + ". " + items[index]);
        }
    }
}

Languages

Java100.0%

Contributors

Created September 29, 2025
Updated November 28, 2025