Лабораторные. Березин / Java. Отчет №2
.docxМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)
Факультет Информационных технологий и программной инженерии
Кафедра Программной инженерии
Лабораторная работа
По дисциплине: 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);
}
}
Вывод
Разработана программа сканера штрих-кода.
