Задание на лабораторную работу

Задания для выполнения:

1. Программное обеспечение для университета

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

  • имена полей и типы данных;

  • как реализовать "уникальность" номера зачетной книжки и номера группы в рамках приложения;

  • модификаторы доступа для полей и методов;

  • тип методов, которые требуется реализовать;

  • если надо, реализуйте приватные методы и добавьте приватные поля, которые должны обеспечивать работу публичных методов.

1.1 Класс Student

Создайте публичный класс Student – студента некоторой специальности некоторого университета. Класс не хранит явным образом информацию о специальности, номере группы\потока, предметах, университете.

В классе должны быть следующие поля:

  • имя;

  • фамилия;

  • год поступления;

  • уникальный шестизначный номер зачетной книжки.

В классе должны быть следующие конструкторы:

  • принимает на вход имя и фамилию. При использовании данного конструктора, в номер зачетной книжки записывается 0;

  • принимает на вход имя, фамилию, номер зачетной книжки.

В классе должны быть следующие методы:

  • метод возвращает имя студента;

  • метод изменяет имя студента;

  • метод возвращает фамилию студента;

  • метод изменяет фамилию студента;

  • метод возвращает номер зачетной книжки;

  • метод изменяет номер зачетной книжки;

  • метод возвращает год поступления;

  • метод изменяет год поступления.

1.2 Класс Group

Создайте публичный класс Group – студенческой группы. Класс не хранит явным образом специальность и название университета.

В классе должны быть следующие поля:

  • уникальный номер (в пределах специальности);

  • массив студентов.

В классе должны быть следующие конструкторы:

  • принимает на вход номер группы (в этом случае, количество студентов записывается как 0);

  • принимает на вход номер группы, количество студентов (инициализация массива, но его элементы остаются пустыми);

  • принимает на вход массив студентов.

В классе должны быть следующие методы:

  • метод возвращает номер группы;

  • метод изменяет номер группы;

  • метод возвращает общее число студентов группы;

  • метод возвращает ссылку на студента по номеру зачетной книжки;

  • метод удаляет студента из группы по номеру зачетной книжки (помните про корректное удаление элемента из массива);

  • метод добавляет нового студента в группу (принимает на вход ссылку на объект Student, если массив уже полностью заполнен - реализуйте расширение массива);

  • метод возвращает массив студентов;

  • метод возвращает массив студентов, отсортированный по фамилиям (подумайте, как это сделать; если фамилии одинаковы - сортируйте по имени; если имена одинаковы - по номеру зачетной книжки).

1.3 Класс Payment

Создайте класс Payment - платы за обучение.

В классе должны быть следующие поля:

  • дата (экземпляр класса java.util.Date);

  • размер суммы, переведенной студентом на счет университета.

В классе должны быть следующие конструкторы:

  • без параметров (дата содержит null, сумма - 0);

  • с двумя параметрами - датой оплаты и суммой.

В классе должны быть следующие методы:

  • геттеры и сеттеры для приватных полей.

1.4 Класс ContractStudent

Создайте класс ContractStudent, расширяющий класс Student. Данный класс добавляет следующие члены:

Поля:

  • приватное поле - массив платежей;

  • приватное поле - стоимость обучения за семестра (предполагается, что эта стоимость в течение всего периода обучения меняться не будет).

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

  • конструктор с именем и фамилией студента (номер зачетной книжки - 0, создает массив платежей нулевой длины);

  • конструктор, который принимает на вход имя, фамилию, номер книжки (создает массив платежей нулевой длины);

Методы:

  • геттер для массива платежей и стоимости обучения за семестр;

  • метод, возвращающий размер задолженности студента на текущий момент. Исходите из того, что плата за обучение не меняется. Зная текущую дату и год поступления, можно выяснить, сколько семестров студент проучился и определить сумму, которую он должен внести за проведенные в университете семестры. Сравните эту сумму с тем, что студент оплатил по факту;

  • метод, добавляющий новый платеж в конец списка платежей;

1.5 Интерфейс Event

Создайте интерфейс Event - мероприятия, в котором принимает участие студент. Интерфейс определяет следующие методы:

  • геттеры и сеттеры для даты проведения мероприятия (методы работают с объектами типа java.util.Date);

  • геттеры и сеттеры для названия города, в котором проводилось мероприятие.

1.6 Класс Olympics

Определите класс Olympics - студенческой олимпиады. Класс реализующий интерфейс Event.

В классе должны быть следующие поля:

  • дата проведения олимпиады;

  • название города, где проходила олимпиада;

  • место, которое занял студент на олимпиаде.

В классе должны быть следующие конструкторы:

  • конструктор с тремя полями (дата, город, место).

В классе должны быть следующие методы:

  • геттеры и сеттеры для приватных полей.

1.7 Класс Conference

Определите класс Conference - студенческой конференции. Класс должен реализовывать интерфейс Event.

В классе должны быть следующие поля:

  • дата проведения конференции;

  • город, где проходила конференция;

  • название доклада, с которым студент выступал на конференции.

В классе должны быть следующие конструкторы:

  • конструктор с тремя полями (дата, город, название доклада).

В классе должны быть следующие методы:

  • геттеры и сеттеры для приватных полей.

1.8 Класс Competition

Определите класс Competition - студенческого соревнования. Класс должен реализовывать интерфейс Event.

В классе должны быть следующие поля:

  • дата проведения соревнования;

  • город, где проходило соревнование;

  • название студенческого проекта;

  • выигранная сумма (0, если студент ничего не выиграл).

В классе должны быть следующие конструкторы:

  • конструктор с четырьмя полями (дата, город, название проекта, сумма).

В классе должны быть следующие методы:

  • геттеры и сеттеры для приватных полей.

1.9 Интерфейс Activist

Определите интерфейс Activist - участника различных конкурсов, олимпиад и так далее. Интерфейс определяет следующие методы:

  • метод возвращает общее количество мероприятий, в которых принимал участие студент;

  • метод возвращает число призовых мест (с 1 по 3), занятых на олимпиадах;

  • метод возвращает число докладов на конференциях;

  • метод возвращает строку, состоящую из названий проектов (названия разделены переходом на новую строку), за которые студент получил какую-то сумму на соревнованиях.

1.10 Модификация класса Student

Измените класс Student. Он теперь должен реализовывать интерфейс Activist. Реализуйте методы интерфейса. Помимо этого, в класс необходимо добавить следующие члены класса:

Поля:

  • массив событий, в которых принимал участие студент.

Методы:

  • добавление нового события в массив событий;

  • поиск событий по дате (метод возвращает ссылку на объект события);

  • удаление события по дате.

Внесите изменения в конструктор(-ы) класса Student, чтобы они инициализировали массив событий.

1.11 Модификация класса Group

Измените класс Group. Добавьте следующие методы:

  • метод возвращает массив студентов-активистов (студенты, которые принимали участие хотя бы в одном событии);

  • метод возвращает список студентов-призеров (которые хотя бы раз занимали призовое место на олимпиаде или выигрывали какую-то сумму в соревновании);

  • метод возвращает количество студентов-активистов;

  • метод возвращает число "бюджетников" в группе;

  • метод возвращает число контрактных студентов в группе;

  • метод возвращает количество студентов-должников (вовремя не оплативших контракт).

1.12 Класс Main

В классе Main напишите код, чтобы протестировать функциональность созданных классов и реализованных методов

2. Приложение Draw

Модифицируйте приложение Draw из лабораторной работы №5, что приложение использовало механизм абстрактных классов.

3. Приложение SortingList

Скачайте архив с проектом по этому адресу - http://bit.ly/2RzoLDo

Данная программа выводит список студентов и позволяет отсортировать их по имени, фамилии и по среднему баллу.

В программе уже реализована сортировка студентов по имени.

Задание состоит в следующем:

  • доделать программу, чтобы по нажатию на соответствующие кнопки происходила сортировка студентов по фамилии и по среднему баллу;

  • задание на дополнительные баллы - доработайте программу так, чтобы при повторном нажатии на ту же кнопку сортировки, осуществлялась обратная сортировка студентов. То есть, при первом нажатии на кнопку "Сортировка по имени" студенты сортировались в прямом порядке (по возрастанию), а при повторном нажатии на эту же кнопку, студенты сортировались в обратном порядке (по убыванию).

Список студентов находится в коллекции students, для сортировки необходимо вызвать у коллекции метод sort() и в этот метод передать объект компаратора.

Что такое компаратор. Базовая операция для почти любой сортировки – сравнение двух элементов. Если вы сортируете обычные числа или строки, сравнение происходит элементарно по известным всем правилам. Но как быть, если вы хотите отсортировать объекты, которые могут иметь десятки полей различных типов?

Для этого существует так называемый компаратор. Компаратор в Java – это объект класса, который реализует интерфейс Comparator. Интерфейс определяет всего один метод compare(), который принимает на вход два объекта типаObject. Если первый объект «меньше» – метод возвращает отрицательное число (обычно это просто -1, но может быть и любое другое отрицательное число), если первый объект «больше» – метод возвращает положительное число (обычно это 1, но может быть и любое другое положительное число), если объекты «равны» – метод возвращает 0.

Задача программиста - прописать нужную логику сравнения и вернуть -1/0/1 в том или ином случае.

Вы создаете класс, указываете, что этот класс реализует интерфейс Comparator и в методе compare() описываете логику сравнения двух объектов. В случае со сравнением двух студентов по имени, код компаратора выглядит следующим образом

public class NameSorter implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        if (o1 instanceof Student && o2 instanceof Student) {
            Student s1 = (Student) o1;
            Student s2 = (Student) o2;
            return s1.getName().compareTo(s2.getName());
        }
        return 0;
    }
}

Обратите внимание, что сначала мы должны убедиться, что оба объекта являются объектами класса Student, после чего делаем нисходящее преобразование.

В данном случае мы сравниваем два поля name у двух объектов класса Student. Так как это тип String, нам нет нужды сравнивать строки «вручную», мы просто можем воспользоваться методом compareTo(), который есть у любого объекта класса String.

Last updated