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

### Задание 1. Модификация классов

Добавьте модификаторы доступа к членам классов, разработанных в лабораторной работе 2 (классы `TimeSpan`, `BankAccount` и `Student`).

{% hint style="warning" %}
Подумайте над тем, какие члены класса сделать приватными, а какие публичными
{% endhint %}

### Задание 2. Создание UML-диаграмм

Для модифицированных классов из второй лабораторной работы нарисуйте диаграммы классов UML.

### Задание 3. Класс IntStack

Необходимо создать класс `IntStack`, который реализует функционал **стека целых чисел** с помощью статического массива.

{% hint style="danger" %}
Нарисуйте класс в диаграмме классов UML
{% endhint %}

При реализации стека учитывайте следующее:

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

{% tabs %}
{% tab title="Читать внимательно!" %}
**Перейдите во вкладку "Подсказка", чтобы получить подсказку, которая поможет вам в реализации класса или попробуйте реализовать класс без подсказки.**
{% endtab %}

{% tab title="Подсказка" %}

* При создании объекта стека инициализируйте внутренний статический массив с каким-то изначальным размером;
* При вставке элементов проверяйте, не выходите ли вы за пределы внутреннего статического массива;
* Если внутренний массив переполнен, создавайте новый массив б**о**льшего размера: создавайте новый массив, копируйте значения из старого массива в новый, заменяйте новый массив на старый. Помните, что массивы в Java - объекты и что поле - просто указатель на массив и что указатель может указывать на другой массив;
* При уменьшении размера стека реализуйте уменьшение внутреннего статического массива. Подумайте, как это лучше сделать, чтобы не уменьшать внутренний массив при каждом удалении элемента из стека.
  {% endtab %}
  {% endtabs %}

{% hint style="warning" %}
**ВАЖНО! Стек необходимо реализовать с помощью статического целочисленного массива!**

**НЕ ИСПОЛЬЗУЙТЕ КОЛЛЕКЦИИ И ПОТОКИ ДАННЫХ, ТОЛЬКО МАССИВЫ**
{% endhint %}

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

* пользователь может создать новый стек с конструктором без параметров;
* пользователю доступна команда `pop()` для извлечения элемента из стека. Метод `pop()` возвращает извлеченный элемент. При попытке извлечь из пустого стека, метод возвращает `0` или выбрасывает исключение (реализуйте выброс исключения, если вы знаете, как это делать и что такое исключение);
* пользователю доступна команда `push()`, которая добавляет элемент в стек;
* пользователю доступна команда `peek()` для просмотра элемента на вершине стека без его исключения.
* пользователь может получить значение количества элементов в стеке с помощью метода `size()`;
* пользователь может проверить, пустой ли стек с помощью метода `isEmpty()`;
* пользователь может очистить стек полностью с помощью метода `clear()`.

### Задание 4. Создание класса по UML-диаграмме

Создайте Java-классы исходя из диаграммы, представленной ниже. Код методов реализовывать не нужно, только заголовки и общую структуру классов.

![](https://1377473627-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnhxGhlv6e_zwoZYywB%2F-MjfC1bZdLIAM3FkZ9Tx%2F-MjfHDZm8b-0FL4a2SCr%2Fimage.png?alt=media\&token=b45b9abc-b7c9-4fe3-ae58-cebd4c226431)
