> For the complete documentation index, see [llms.txt](https://opu.gitbook.io/oop/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://opu.gitbook.io/oop/2019-2020-archive/arkhiv-1/arkhiv/laboratornye-raboty-1/laboratornaya-rabota-3/zadanie-na-laboratornuyu-rabotu.md).

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

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

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

{% hint style="warning" %}
При выполнении задания продумайте следующие аспекты:

* имена полей и типы данных;
* как реализовать "уникальность" номера зачетной книжки и номера группы в рамках приложения;
* модификаторы доступа для полей и методов;
* тип методов, которые требуется реализовать;
* если надо, реализуйте приватные методы и добавьте приватные поля, которые должны обеспечивать работу публичных методов.
  {% endhint %}

#### 1.1 Класс Student

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

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

* имя;
* фамилия;
* год поступления;
* уникальный шестизначный номер зачетной книжки.

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

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

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

* метод возвращает имя студента;
* метод изменяет имя студента;
* метод возвращает фамилию студента;
* метод изменяет фамилию студента;
* метод возвращает номер зачетной книжки;
* метод изменяет номер зачетной книжки;
* метод возвращает год поступления;
* метод изменяет год поступления.

#### 1.2 Класс Group

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

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

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

#### В классе должны быть следующие конструкторы: <a href="#v-klasse-dolzhny-byt-sleduyushie-konstruktory" id="v-klasse-dolzhny-byt-sleduyushie-konstruktory"></a>

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

#### В классе должны быть следующие методы: <a href="#v-klasse-dolzhny-byt-sleduyushie-metody" id="v-klasse-dolzhny-byt-sleduyushie-metody"></a>

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

#### 1.3 Класс Main

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

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

Класс `Group` содержит внутри себя массив студентов. Методы класса `Group` требуют увеличения или уменьшения размера массива, вставки элемента внутри массива, вывод данных массива в отсортированном порядке.

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

**Используя механизм инкапсуляции и принципы ООП, модифицируйте класс** `Group` **так, чтобы программа больше соответствовала принципам ООП.**
