Скачиваний:
0
Добавлен:
01.01.2026
Размер:
48.47 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)

Факультет Информационных технологий и программной инженерии

Кафедра Программной инженерии

Лабораторная работа

По дисциплине: Java

Выполнил студент: Яковлев М. А. ИКПИ-32

Принял работу: Березин А. Ю.

Дата выполнения:

«31» октября 2025 г.

Санкт-Петербург

2025 г.

Цель работы

Цель лабораторной работы по имитации работы сканера штрих-кода — разработка программы.

Программа

Файл первый:

package LAB2;

import java.util.*;

public class Main {

    private static final List<BarcodeScanner> mainList = new ArrayList<>();

    private static final List<List<BarcodeScanner>> arrays = new ArrayList<>();

    private static final List<String> arrayNames = new ArrayList<>();

    private static final Scanner scanner = new Scanner(System.in);

    private static final int MAX_SCANNERS = 10;

    private static final int MAX_ARRAY_NAME_LENGTH = 12;

    public static void main(String[] args) {

        while (true) {

            String choice = showMenu();

            switch (choice) {

                case "a" -> createDefaultObjects();

                case "b" -> createCustomObjects();

                case "c" -> displayListOnly();

                case "d" -> moveToArray();

                case "e" -> deleteObject();

                case "f" -> computeMostPopularModel();

                case "h" -> editObject();

                case "i" -> addToArrayDirectly();

                case "j" -> displayArraysOnly();

                case "g" -> {

                    System.out.println("Выход из программы.");

                    return;

                }

                default -> System.out.println("Неверный выбор!");

            }

        }

    }

    private static String showMenu() {

        System.out.println("\nМеню:");

        System.out.println("a. Создать объекты по умолчанию (в список)");

        System.out.println("b. Создать объекты с параметрами (в список)");

        System.out.println("c. Отобразить список");

        System.out.println("j. Отобразить массивы");

        System.out.println("d. Переместить объект из списка в массив");

        System.out.println("e. Удалить объект (список или массив)");

        System.out.println("f. Найти самую популярную модель");

        System.out.println("h. Редактировать объект");

        System.out.println("i. Добавить объект напрямую в массив");

        System.out.println("g. Выход");

        System.out.print("Ввод: ");

        return scanner.nextLine().trim().toLowerCase();

    }

    private static void createDefaultObjects() {

        int n = readInt("Сколько сканеров создать (макс. " + MAX_SCANNERS + ")? ");

        if (n <= 0 || n > MAX_SCANNERS) {

            System.out.println("Некорректное количество. Должно быть <" + MAX_SCANNERS);

            return;

        }

        for (int i = 0; i < n; i++) {

            BarcodeScanner scannerObj = new BarcodeScanner();

            mainList.add(scannerObj);

            System.out.println("Создан: " + scannerObj);

        }

    }

    private static void createCustomObjects() {

        int n = readInt("Сколько сканеров создать (макс. " + MAX_SCANNERS + ")? ");

        if (n <= 0 || n > MAX_SCANNERS) {

            System.out.println("Некорректное количество. Должно быть <" + MAX_SCANNERS);

            return;

        }

        for (int i = 0; i < n; i++) {

            System.out.print("Введите id сканера: ");

            String id = scanner.nextLine().trim();

            System.out.print("Введите модель сканера: ");

            String model = scanner.nextLine().trim();

            float charge = readFloat("Введите процент заряда (0–100): ");

            BarcodeScanner obj = new BarcodeScanner(id, model, charge);

            mainList.add(obj);

            System.out.println("Создан: " + obj);

        }

    }

    private static void addToArrayDirectly() {

        System.out.print("Введите имя массива для добавления: ");

        String name = scanner.nextLine().trim();

        if (!name.matches("[a-zA-Z]+")) {

            System.out.println("Имя массива должно содержать только буквы.");

            return;

        }

        if (name.length() > MAX_ARRAY_NAME_LENGTH) {

            System.out.println("Имя массива слишком длинное. Макс. длина: " + MAX_ARRAY_NAME_LENGTH);

            return;

        }

        int idx = indexOfArray(name);

        if (idx == -1) {

            arrays.add(new ArrayList<>());

            arrayNames.add(name);

            idx = arrays.size() - 1;

        }

        System.out.print("Введите id сканера: ");

        String id = scanner.nextLine().trim();

        System.out.print("Введите модель сканера: ");

        String model = scanner.nextLine().trim();

        float charge = readFloat("Введите процент заряда (0–100): ");

        BarcodeScanner obj = new BarcodeScanner(id, model, charge);

        arrays.get(idx).add(obj);

        System.out.println("Добавлен в массив \"" + name + "\": " + obj);

    }

    private static void displayListOnly() {

        System.out.println("\n=== Список ===");

        if (mainList.isEmpty()) System.out.println("  (пусто)");

        else for (int i = 0; i < mainList.size(); i++)

            System.out.println("  [" + i + "] " + mainList.get(i));

    }

    private static void displayArraysOnly() {

        System.out.println("\n=== Массивы ===");

        if (arrays.isEmpty()) {

            System.out.println("  (отсутствуют)");

            return;

        }

        for (int i = 0; i < arrays.size(); i++) {

            String name = arrayNames.get(i);

            List<BarcodeScanner> arr = arrays.get(i);

            System.out.println("  " + name + ":");

            if (arr.isEmpty()) System.out.println("    (пусто)");

            else for (int j = 0; j < arr.size(); j++)

                System.out.println("    [" + j + "] " + arr.get(j));

        }

    }

    private static void moveToArray() {

        if (mainList.isEmpty()) {

            System.out.println("Список пуст.");

            return;

        }

        displayListOnly();

        int idx = readInt("Введите индекс объекта для перемещения: ");

        if (idx < 0 || idx >= mainList.size()) {

            System.out.println("Некорректный индекс.");

            return;

        }

        System.out.print("Введите имя массива: ");

        String name = scanner.nextLine().trim();

        if (!name.matches("[a-zA-Z]+")) {

            System.out.println("Имя массива содержит недопустимые символы.");

            return;

        }

        if (name.length() > MAX_ARRAY_NAME_LENGTH) {

            System.out.println("Имя массива слишком длинное. Макс. длина: " + MAX_ARRAY_NAME_LENGTH);

            return;

        }

        int arrIndex = indexOfArray(name);

        if (arrIndex == -1) {

            arrays.add(new ArrayList<>());

            arrayNames.add(name);

            arrIndex = arrays.size() - 1;

        }

        BarcodeScanner obj = mainList.remove(idx);

        arrays.get(arrIndex).add(obj);

        System.out.println("Объект перемещён в массив \"" + name + "\"");

    }

    private static void deleteObject() {

        displayListOnly();

        displayArraysOnly();

        System.out.print("Удалить из (m) списка или (a) массива? ");

        String choice = scanner.nextLine().trim().toLowerCase();

        if (choice.equals("m")) {

            if (mainList.isEmpty()) {

                System.out.println("Список пуст.");

                return;

            }

            int idx = readInt("Введите индекс объекта для удаления: ");

            if (idx < 0 || idx >= mainList.size()) {

                System.out.println("Некорректный индекс.");

                return;

            }

            BarcodeScanner removed = mainList.remove(idx);

            System.out.println("Удалён: " + removed);

        } else if (choice.equals("a")) {

            if (arrays.isEmpty()) {

                System.out.println("Массивы отсутствуют.");

                return;

            }

            System.out.print("Введите имя массива: ");

            String name = scanner.nextLine().trim();

            int arrIndex = indexOfArray(name);

            if (arrIndex == -1) {

                System.out.println("Массив не найден.");

                return;

            }

            List<BarcodeScanner> arr = arrays.get(arrIndex);

            if (arr.isEmpty()) {

                System.out.println("Массив пуст.");

                return;

            }

            for (int i = 0; i < arr.size(); i++)

                System.out.println("[" + i + "] " + arr.get(i));

            int idx = readInt("Введите индекс объекта: ");

            if (idx < 0 || idx >= arr.size()) {

                System.out.println("Некорректный индекс.");

                return;

            }

            BarcodeScanner removed = arr.remove(idx);

            System.out.println("Удалён: " + removed);

            if (arr.isEmpty()) {

                arrays.remove(arrIndex);

                arrayNames.remove(arrIndex);

                System.out.println("Массив \"" + name + "\" удалён, так как он пуст.");

            }

        } else {

            System.out.println("Неверный выбор.");

        }

    }

    private static void editObject() {

        displayListOnly();

        displayArraysOnly();

        System.out.print("Редактировать из (m) списка или (a) массива? ");

        String choice = scanner.nextLine().trim().toLowerCase();

        BarcodeScanner target = null;

        if (choice.equals("m")) {

            if (mainList.isEmpty()) {

                System.out.println("Список пуст.");

                return;

            }

            int idx = readInt("Введите индекс: ");

            if (idx < 0 || idx >= mainList.size()) return;

            target = mainList.get(idx);

        } else if (choice.equals("a")) {

            if (arrays.isEmpty()) {

                System.out.println("Массивы отсутствуют.");

                return;

            }

            System.out.print("Введите имя массива: ");

            String name = scanner.nextLine().trim();

            int arrIndex = indexOfArray(name);

            if (arrIndex == -1) {

                System.out.println("Массив не найден.");

                return;

            }

            List<BarcodeScanner> arr = arrays.get(arrIndex);

            for (int i = 0; i < arr.size(); i++)

                System.out.println("[" + i + "] " + arr.get(i));

            int idx = readInt("Введите индекс для редактирования: ");

            if (idx < 0 || idx >= arr.size()) return;

            target = arr.get(idx);

        } else {

            System.out.println("Неверный выбор.");

            return;

        }

        System.out.println("1 — id, 2 — модель, 3 — заряд, 4 — понизить %, 5 — повысить %");

        int edit = readInt("Выбор: ");

        switch (edit) {

            case 1 -> {

                System.out.print("Новый id: ");

                target.setId(scanner.nextLine());

            }

            case 2 -> {

                System.out.print("Новая модель: ");

                target.setModel(scanner.nextLine());

            }

            case 3 -> target.setChargePercent(readFloat("Новый заряд (0-100): "));

            case 4 -> target.decreaseCharge(readFloat("Понизить на: "));

            case 5 -> target.increaseCharge(readFloat("Повысить на: "));

            default -> System.out.println("Неверный пункт.");

        }

        System.out.println("Изменено: " + target);

    }

    private static void computeMostPopularModel() {

        Map<String, Integer> freq = new HashMap<>();

        for (BarcodeScanner sc : mainList)

            freq.put(sc.getModel(), freq.getOrDefault(sc.getModel(), 0) + 1);

        for (List<BarcodeScanner> arr : arrays)

            for (BarcodeScanner sc : arr)

                freq.put(sc.getModel(), freq.getOrDefault(sc.getModel(), 0) + 1);

        if (freq.isEmpty()) {

            System.out.println("Нет данных.");

            return;

        }

        String best = null;

        int max = 0;

        for (var e : freq.entrySet())

            if (e.getValue() > max) {

                max = e.getValue();

                best = e.getKey();

            }

        System.out.println("Самая популярная модель: " + best + " (" + max + " раз)");

    }

    private static int readInt(String prompt) {

        while (true) {

            System.out.print(prompt);

            try {

                return Integer.parseInt(scanner.nextLine().trim());

            } catch (NumberFormatException e) {

                System.out.println("Введите целое число!");

            }

        }

    }

    private static float readFloat(String prompt) {

        while (true) {

            System.out.print(prompt);

            try {

                return Float.parseFloat(scanner.nextLine().trim());

            } catch (NumberFormatException e) {

                System.out.println("Введите число!");

            }

        }

    }

    private static int indexOfArray(String name) {

        for (int i = 0; i < arrayNames.size(); i++)

            if (arrayNames.get(i).equals(name)) return i;

        return -1;

    }

}

Файл второй:

package LAB2;

import java.util.Objects;

public class BarcodeScanner {

    private String id;              // d-ddddd-ddddd

    private String model;           // Model-XXX

    private float chargePercent;    // процент заряда батареи (0-100)

    // Конструкторы

    public BarcodeScanner() {

        this.id = "";

        this.model = "Model-AAA";

        this.chargePercent = 100f;

    }

    public BarcodeScanner(String id, String model, float chargePercent) {

        setId(id);

        setModel(model);

        setChargePercent(chargePercent);

    }

    // Геттеры и сеттеры с валидацией

    public String getId() {

        return id;

    }

    public void setId(String id) {

        if (isValidId(id)) {

            this.id = id;

        } else {

            System.out.println("Неверный формат id: " + id + ". Установлено значение по умолчанию.");

            this.id = "";

        }

    }

    public String getModel() {

        return model;

    }

    public void setModel(String model) {

        if (isValidModel(model)) {

            this.model = model;

        } else {

            System.out.println("Предупреждение: Неверный формат model: " + model + ". Установлено значение по умолчанию.");

            this.model = "Model-AAA";

        }

    }

    public float getChargePercent() {

        return chargePercent;

    }

    public void setChargePercent(float chargePercent) {

        if (chargePercent < 0f) {

            System.out.println("Процент заряда не может быть меньше 0. Установлено 0.");

            this.chargePercent = 0f;

        } else if (chargePercent > 100f) {

            System.out.println("Процент заряда не может быть больше 100. Установлено 100.");

            this.chargePercent = 100f;

        } else {

            this.chargePercent = chargePercent;

        }

    }

    // Валидация

    private boolean isValidId(String id) {

        if (id == null) return false;

        return id.matches("\\d-\\d{5}-\\d{5}");

    }

    private boolean isValidModel(String model) {

        if (model == null) return false;

        return model.matches("Model-[A-Za-z]+");

    }

    // Уменьшение процента заряда

    public void decreaseCharge(float percent) {

        if (percent < 0 || percent > 100) {

            System.out.println("Значение уменьшения заряда не менее 0, не более 100%");

            return;

        }

        setChargePercent(this.chargePercent - percent);

    }

    // Увеличение процента заряда

    public void increaseCharge(float percent) {

        if (percent < 0) {

            System.out.println("Увеличение заряда не может быть отрицательным");

            return;

        }

        setChargePercent(this.chargePercent + percent);

    }

    @Override

    public String toString() {

        return String.format("BarcodeScanner [id=%s, model=%s, chargePercent=%.2f%%]", id, model, chargePercent);

    }

    @Override

    public boolean equals(Object obj) {

        if (this == obj) return true;

        if (!(obj instanceof BarcodeScanner other)) return false;

        return Float.compare(chargePercent, other.chargePercent) == 0 &&

                Objects.equals(id, other.id) &&

                Objects.equals(model, other.model);

    }

    @Override

    public int hashCode() {

        return Objects.hash(id, model, chargePercent);

    }

}

Вывод

Разработана программа сканера штрих-кода.

Соседние файлы в папке Лабораторные. Березин