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

{% hint style="warning" %}
Для каждого класса необходимо предоставить его графическое представление в диаграмме классов UML. Графическое представление добавить в протокол лабораторной работы и принести на защиту лабораторной работы.
{% endhint %}

### 1. Класс TimeSpan

#### 1.1 Создание класса

Создайте класс с названием `TimeSpan`. Объект класса `TimeSpan`хранит интервал времени в часах и минутах (к примеру, временной интервал между 8:00 и 10:30 это 2 часа 30 минут). Класс `TimeSpan`должен иметь следующие методы

| Название метода            | Описание метода                                                                                                                                                                                                                                                                                                                 |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TimeSpan(hours, minutes)` | Конструктор. Входные аргументы – количество часов и минут                                                                                                                                                                                                                                                                       |
| `getHours()`               | Возвращает целое количество часов во временном интервале, без учета количества минут (например, если интервал 2 часа 15 минут, то метод вернет 2, так как 15 минут мы не учитываем)                                                                                                                                             |
| `getMinutes()`             | Возвращает количество минут во временном интервале, без учета количества часов (например, если интервал 2 часа 15 минут, то метод вернет 15, так как 2 часа мы отбрасываем)                                                                                                                                                     |
| `add(hours, minutes)`      | Добавляет указанное количество часов и минут к промежутку. Новое значение промежутка должно пересчитываться корректно. Например, 2 часа 15 минут + 1 час 45 минут = 4 часа 0 минут. Помните, что необходимо проверить корректность входных аргументов (количество часов - не отрицательное число, количество минут от 0 до 59). |
| `addTimeSpan(timespan)`    | Добавляет входной промежуток времени к указанному промежутку (используйте методы `getHours()` и `getMinutes()` для получения значений часов и минут).                                                                                                                                                                           |
| `getTotalHours()`          | Возвращает количество часов в промежутке в виде дробного числа. Например, если временной интервал 9 часов 45 минут, то метод должен вернуть `9.75`.                                                                                                                                                                             |
| `getTotalMinutes()`        | Возвращает количество минут в текущем промежутке времени (помните, что в интервале есть еще показатель часов, который нужно умножить на 60)                                                                                                                                                                                     |

**Вы должны продумать:**

* как хранить значение временного интервала;
* типы входных аргументов методов;
* корректно реализовать требуемые методы;
* в методах предусмотреть проверки на корректность входных данных.

#### 1.2. Добавление метода subtract()

Добавьте к написанному ранее классу метод `subtract()`со следующей сигнатурой

```java
public void subtract(TimeSpan span)
```

Метод вычитает из текущего временного интервала входной временной интервал. Если входной интервал больше текущего, выйдите из метода и не модифицируйте текущий интервал (можете выбросить исключение `IllegalArgumentException`, если знаете что это и знаете как выбрить исключение).

#### 1.3 Добавление метода scale()

Добавьте к написанному ранее классу метод `subtract()`со следующей сигнатурой

```java
public void scale(int factor)
```

Метод увеличивает текущий интервал в `factor`число раз. Например, если текущий временной интервал равен 1 час 45 минут, а входной аргумент равен 2, то интервал увеличится до 3 часов 30 минут. Убедитесь, что `factor`- неотрицательное число, помните про пересчет минут в часы при увеличении интервала.

### 2. Класс BankAccount

#### 2.1 Добавление поля transactionFee

В программе существует класс `BankAccount`, исходный код которого приведен ниже.

```java
// Каждый объект класса BankAccount представляет данные одного
// счета пользователя, включая имя и баланс счета

public class BankAccount {
    String name;
    double balance;

    public void deposit(double amount) {
        balance = balance + amount;
    }

    public double getBalance() {
        return this.balance;
    }

    public boolean withdraw(double amount) {
        balance = balance - amount;
        return true;
    }
}
```

Каждый объект класса предназначен для описания одного счета клиента банка, включая его имя и баланс. Модифицируйте класс следующим образом:

* добавьте поле `transactionFee`типа `double`, которое хранит сумму, которая вычитается из баланса каждый раз, когда клиент банка снимает деньги (метод `withdraw()`). Изначальное значение равно `0.00`, но значение может быть изменено в дальнейшем. Производите вычитание суммы каждый раз, когда клиент осуществляет снятие денег;
* сделайте так, чтобы в результате снятия денег и снятия `transactionFee`, баланс счета не мог опуститься ниже нуля. Если в результате снятия денег и `transactionFee` баланс может стать отрицательным, выйдите из метода и не производите модификацию баланса вообще;
* в методe `deposit()` входной аргумент не должен быть ноль или меньше;
* в методе `withdraw()` входной аргумент не должно быть ноль или меньше.

**Модификация класса может потребовать создания новых методов и полей.**

#### 2.2 Добавление метода transfer()

Добавьте к модифицированному ранее классу `BankAccout`метод `transfer()` со следующей сигнатурой

```java
public boolean transfer(BankAccount receiver, double amount)
```

Метод `transfer()` осуществляет перевод денег из одного счета (текущего) на другой счет (объект `receiver`). Первый параметр - счет получателя денег, второй параметр - количество денег, которые переводятся со счета на счет.&#x20;

**Важно!**&#x20;

**При снятии денег должна учитываться комиссия (поле** `transactionFee`**). Следовательно, из текущего объекта должна быть вычтено** `amount + transactionFee`**.**

Метод должен модифицировать баланс двух объектов. У текущего объекта должна вычтена сумма `amount + transactionFee`из баланса, а у объекта `receiver`должен быть пополнен баланс счета на сумму `amount`.

**При реализации метода убедитесь, что** `amount > 0`**.**

Если у текущего объекта баланс меньше `amount + transactionFee`, то выйдите из метода без какого-либо перевода денег.

### 3. Класс Student

Создайте класс `Student`, который хранит информацию о студенте. У студента есть имя, год обучения (от 1 до 4), а также массив изучаемых дисциплин.

Класс `Student` должен иметь следующие методы

| Название метода         | Описание метода                                                                                                                 |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `Student(name, year)`   | Конструктор. Входные аргументы – имя и год обучения                                                                             |
| `addCourse(courseName)` | Добавляет дисциплину(в формате String) к массиву дисциплин студента                                                             |
| `dropAll()`             | Удаляет все дисциплины студента                                                                                                 |
| `getCourseCount()`      | Возвращает количество дисциплин, которые студент изучает                                                                        |
| `getName()`             | Возвращает имя студента                                                                                                         |
| `getTuition()`          | Возвращает количество денег, которые студент заплатил за обучение (с условием, что каждый курс обошелся студенту в 1000 гривен) |
| `getYear()`             | Возвращает год обучения студента (от 1 до 4)                                                                                    |

**Вы должны продумать:**

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