Skip to content

AndreiPanchenko/JavaLabWork2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Лабораторная работа 2: Объектно-ориентированное программирование в Java

Цель работы

Изучение основ объектно-ориентированного программирования на Java: создание классов, объектов, работа с инкапсуляцией, организация взаимодействия между классами, разделение ответственности между классами.

Формулировка задач

Задание 1. Точка координат

Создайте сущность Точка, расположенную на двумерной плоскости, которая описывается:

· Координата Х: число · Координата Y: число · Может возвращать текстовое представление вида "{X;Y}"

Необходимо создать три точки с разными координатами и вывести на экран их текстовое представление.

Задание 2. Прямая

Создайте сущность Линия, расположенную на двумерной плоскости, которая описывается:

· Координата начала: Точка · Координата конца: Точка · Может возвращать текстовое представление вида "Линия от {X1;Y1} до {X2;Y2}"

Для указания координат нужно использовать сущность Точка, разработанную в задании 1.1. Создайте линии со следующими характеристиками:

  1. Линия 1 с началом в т. {1;3} и концом в т.{23;8}.
  2. Линия 2, горизонтальная, на высоте 10, от точки 5 до точки 25.
  3. Линия 3, которая начинается всегда там же, где начинается линия 1, и заканчивается всегда там же, где заканчивается линия 2. Таким образом, если положение первой или второй линии меняется, то меняется и третья линия.
  4. После создания всех трех объектов измените координаты первой и второй линий, причем сделайте это таким образом, чтобы положение третьей линии соответствовало требованиям пункта 3.
  5. Измените координаты первой линии так, чтобы при этом не изменились координаты третьей линии.

Задание 3. Студент

Создайте сущность Студент, которая описывается:

· Имя: строка · Оценки: массив целых чисел. · Может возвращать текстовое представление вида "Имя: [оценка1, оценка2,...,оценкаN]"

Необходимо выполнить следующие задачи:

  1. Создать студента Васю с оценками: 3,4,5.
  2. Создать студента Петю и скопировать оценки Васи, присвоив содержимое поля с оценками Васи полю с оценками Пети.
  3. Заменить первую оценку Пети на число 5. Вывести на экран строковое представление Васи и Пети. Объяснить результат
  4. Создать студента Андрея и скопировать ему оценки Васи так, чтобы изменение оценок Васи не влияло на Андрея.

Задание 4. Создаем Точку и Линию

Создаем Точку. Измените сущность Точка из задачи 1.1.В соответствии с новыми требованиями создать объект Точки можно только путем указания обеих координат: X и Y.

Необходимо выполнить следующие задачи:

· Создайте и выведите на экран точку с координатами 3;5 · Создайте и выведите на экран точку с координатами 25;6 · Создайте и выведите на экран точку с координатами 7;8

Создаем Линию. Измените сущность Линия из задачи 2.1.Новые требования включают:

· Создание Линии возможно с указанием Точки начала и Точки конца (Точки из задачи 4.1)

Создайте линии со следующими характеристиками:

  1. Линия 1 с началом в т. {1;3} и концом в {23;8}.
  2. Линия 2, горизонтальная, на высоте 10, от точки 5 до точки 25.
  3. Линия 3 которая начинается всегда там же где начинается линия 1, и заканчивается всегда там же, где заканчивается линия 2.

Задание 5. Пистолет стреляет

Создайте сущность Пистолет, которая описывается следующим образом:

· Имеет Количество патронов (целое число) · Может быть создан с указанием начального количества патронов · Может быть создан без указания начального количества патронов, в этом случае он изначально заряжен пятью патронами. · Может Стрелять, что приводит к выводу на экран текста "Бах!" в том случае, если количество патронов больше нуля, иначе делает "Клац!". После каждого выстрела (когда вывелся "Бах!") количество патронов уменьшается на один.

Создайте пистолет с тремя патронами и выстрелите из него пять раз.

Описание программы

Программа представляет собой консольное приложение с интерактивным меню, позволяющим тестировать функциональность всех реализованных классов. Проект организован по принципу разделения ответственности: главный класс Main управляет меню и пользовательским взаимодействием, а класс TaskManager содержит логику выполнения всех заданий.

Программа обеспечивает:

· Безопасный ввод данных с обработкой исключений · Дружественный пользовательский интерфейс · Наглядную демонстрацию работы всех методов и классов · Проверку корректности вводимых данных · Чистую архитектуру с разделением ответственности

Структура проекта

Проект состоит из 6 классов, каждый в отдельном файле:

  1. Point.java - класс, представляющий точку на плоскости
  2. Line.java - класс, представляющий линию на плоскости
  3. Student.java - класс, представляющий студента с оценками
  4. Gun.java - класс, представляющий пистолет с патронами
  5. TaskManager.java - класс, содержащий логику выполнения всех заданий
  6. Main.java - главный класс с меню и управлением программой

Архитектура программы

Принцип разделения ответственности

Программа реализована с соблюдением принципа единственной ответственности (Single Responsibility Principle):

· Main.java - отвечает только за управление меню и пользовательским вводом · TaskManager.java - содержит всю бизнес-логику выполнения заданий · Point/Line/Student/Gun - представляют предметную область и данные

Взаимодействие классов

Main → TaskManager → (Point, Line, Student, Gun)

· Main делегирует выполнение заданий TaskManager · TaskManager использует предметные классы для демонстрации ООП концепций · Все классы независимы и могут использоваться отдельно

Реализация задач и методы решения

Задание 1: Точка координат

Методы решения:

· Создан класс Point с приватными полями x и y типа double · Реализован конструктор для инициализации координат · Реализованы геттеры и сеттеры для доступа к координатам · Переопределен метод toString() для возврата строки формата "{X;Y}"

Код реализации:

public class Point {
    private double x;
    private double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public void setX(double x) {
        this.x = x;
    }

    public void setY(double y) {
        this.y = y;
    }

    @Override
    public String toString() {
        return "{" + x + ";" + y + "}";
    }
}

Задание 2: Прямая

Методы решения:

· Создан класс Line с полями start и end типа Point · Реализован конструктор для инициализации точек начала и конца · Реализованы геттеры и сеттеры для точек · Переопределен метод toString() для форматированного вывода

Код реализации:

public class Line {
    private Point start;
    private Point end;

    public Line(Point start, Point end) {
        this.start = start;
        this.end = end;
    }

    public Point getStart() {
        return start;
    }

    public Point getEnd() {
        return end;
    }

    public void setStart(Point start) {
        this.start = start;
    }

    public void setEnd(Point end) {
        this.end = end;
    }

    @Override
    public String toString() {
        return "Линия от " + start + " до " + end;
    }
}

Задание 3: Студент

Методы решения:

· Создан класс Student с полями name (String) и grades (int[]) · Конструктор создает копию массива оценок для защиты от внешних изменений · Геттер возвращает копию массива, а не оригинал (глубокое копирование) · Реализован метод toString() для красивого вывода оценок

Код реализации:

public class Student {
    private String name;
    private int[] grades;

    public Student(String name, int[] grades) {
        this.name = name;
        // Создаём копию массива, чтобы избежать изменений извне
        this.grades = grades.clone();
    }

    public String getName() {
        return name;
    }

    public int[] getGrades() {
        // Возвращаем копию массива, чтобы его нельзя было изменить извне
        return grades.clone();
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(name).append(": [");
        for (int i = 0; i < grades.length; i++) {
            sb.append(grades[i]);
            if (i < grades.length - 1) sb.append(", ");
        }
        sb.append("]");
        return sb.toString();
    }
}

Задание 5: Пистолет стреляет

Методы решения:

· Создан класс Gun с полем bullets (int) · Реализованы два конструктора: по умолчанию (5 патронов) и с параметром · Метод shoot() проверяет наличие патронов и выводит соответствующие сообщения · Реализован метод toString() для отображения состояния пистолета

Код реализации:

public class Gun {
    private int bullets;

    public Gun() {
        this.bullets = 5;
    }

    public Gun(int bullets) {
        this.bullets = bullets;
    }

    public void shoot() {
        if (bullets > 0) {
            System.out.println("Бах!");
            bullets--;
        } else {
            System.out.println("Клац!");
        }
    }

    public int getBullets() {
        return bullets;
    }

    @Override
    public String toString() {
        return "Пистолет с " + bullets + " патронами";
    }
}

Класс TaskManager

Назначение:

· Содержит всю логику выполнения заданий · Обеспечивает безопасный ввод данных · Изолирует бизнес-логику от пользовательского интерфейса

Ключевые методы:

public class TaskManager {
    
    // Вспомогательные методы для безопасного ввода
    public static int readInt(Scanner scanner) {
        while (true) {
            try {
                return Integer.parseInt(scanner.nextLine());
            } catch (NumberFormatException e) {
                System.out.print("Пожалуйста, введите число: ");
            }
        }
    }
    
    public static double readDouble(Scanner scanner) {
        while (true) {
            try {
                return Double.parseDouble(scanner.nextLine());
            } catch (NumberFormatException e) {
                System.out.print("Некорректный ввод. Пожалуйста, введите число: ");
            }
        }
    }
    
    // Методы выполнения заданий
    public static void task1(Scanner scanner) { ... }
    public static void task2() { ... }
    public static void task3() { ... }
    public static void task4() { ... }
    public static void task5() { ... }
}

Главный класс Main

Назначение:

· Управление пользовательским интерфейсом · Навигация по меню · Координация работы всей программы

Код реализации:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean exit = false;

        while (!exit) {
            System.out.println("=== Меню заданий ===");
            System.out.println("1. Задание 1 - Точка координат");
            System.out.println("2. Задание 2 - Прямая");
            System.out.println("3. Задание 3 - Студент");
            System.out.println("4. Задание 4 - Создаем Точку и Линию");
            System.out.println("5. Задание 5 - Пистолет стреляет");
            System.out.println("0. Выход");
            System.out.print("Выберите задание: ");

            int choice = TaskManager.readInt(scanner);

            switch (choice) {
                case 1:
                    TaskManager.task1(scanner);
                    break;
                case 2:
                    TaskManager.task2();
                    break;
                case 3:
                    TaskManager.task3();
                    break;
                case 4:
                    TaskManager.task4();
                    break;
                case 5:
                    TaskManager.task5();
                    break;
                case 0:
                    exit = true;
                    System.out.println("Выход из программы.");
                    break;
                default:
                    System.out.println("Неверный выбор. Попробуйте снова.");
            }
        }
        scanner.close();
    }
}

Демонстрация ключевых концепций ООП

  1. Инкапсуляция

Все поля классов объявлены как private, доступ осуществляется через геттеры и сеттеры:

private double x;  // Инкапсуляция данных

public double getX() { return x; }        // Контролируемый доступ
public void setX(double x) { this.x = x; } // Контролируемое изменение
  1. Наследование

Использование наследования через @Override методов Object:

@Override
public String toString() {
    return "{" + x + ";" + y + "}";
}
  1. Полиморфизм

Разные реализации метода toString() в каждом классе:

// Point
return "{" + x + ";" + y + "}";

// Line  
return "Линия от " + start + " до " + end;

// Student
return name + ": [" + ... + "]";

// Gun
return "Пистолет с " + bullets + " патронами";

Тестирование программы

Тестирование Задания 1 ✅

Входные данные:

Введите X1: 2.5
Введите Y1: 3.7
Введите X2: 10.0
Введите Y2: 15.2
Введите X3: 7.3
Введите Y3: 4.8

Результат:

{2.5;3.7}
{10.0;15.2}
{7.3;4.8}

Вывод: Задание выполнено успешно. Точки создаются корректно, текстовое представление соответствует формату.

Тестирование Задание 2 ✅

Результат выполнения:

Линия от {1.0;3.0} до {23.0;8.0}
Линия от {5.0;10.0} до {25.0;10.0}
Линия от {1.0;3.0} до {25.0;10.0}

После изменения координат:
Линия от {2.0;4.0} до {23.0;8.0}
Линия от {5.0;10.0} до {30.0;12.0}
Линия от {2.0;4.0} до {30.0;12.0}

После изменения начала линии 1:
Линия от {10.0;10.0} до {23.0;8.0}
Линия от {2.0;4.0} до {30.0;12.0}

Вывод: Задание выполнено успешно. Демонстрируется работа с ссылками и изменение связанных объектов.

Тестирование Задание 3 ✅

Результат выполнения:

Вася: [3, 4, 5]
Петя: [5, 4, 5]
Андрей: [3, 4, 5]

Изменение оценок Пети не повлияло на Васю и Андрея, потому что использовалась копия массива.

Вывод: Задание выполнено успешно. Продемонстрирована работа с глубоким копированием массивов и защита данных.

Тестирование Задание 4 ✅

Результат выполнения:

Точка 1:{3.0;5.0}
Точка 2:{25.0;6.0}
Точка 3:{7.0;8.0}

Линия от {1.0;3.0} до {23.0;8.0}
Линия от {5.0;10.0} до {25.0;10.0}
Линия от {1.0;3.0} до {25.0;10.0}

Вывод: Задание выполнено успешно. Объекты создаются корректно через конструкторы.

Тестирование Задание 5 ✅

Результат выполнения:

Бах!
Бах!
Бах!
Клац!
Клац!

Вывод: Задание выполнено успешно. Пистолет корректно обрабатывает выстрелы при наличии и отсутствии патронов.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages