> 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/first-term/labs/lab_1/zadanie-na-laboratornuyu-rabotu.md).

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

{% file src="/files/-MiY1jXYt9InPMigQMof" %}

### Как выполнять лабораторную работу

Скачайте архив с заданием на первую лабораторную работу.

Откройте IntelliJ IDEA (предварительно установите плагин EduTools), выберите пункт `Learn and Teach -> Import Local Course`

![](/files/-MGFbCh9KF7VcpBGnZdh)

Выберите архив с заданием

![](/files/-MGFbzWEolG1rnGsjA3q)

Откройте задание с помощью кнопки Open

![](/files/-MGFcCb-xYSpWFfp5lq3)

Задание на лабораторную работу состоит из 7 задач, которые необходимо решить

![](/files/-MGFccOH4yygwZ6Nf3gd)

Для решения каждой задачи требуется написать код для метода и вернуть правильное значение. Условие работы метода описано в правой части окна. После написания кода, нажмите кнопку **Check**, чтобы проверить, правильно ли вы реализовали метод.

![](/files/-MGFdKOQL04HgaNZ331h)

#### Пример выполнения лабораторной работы

Давайте рассмотрим выполнение лабораторной работы на примере первой задачи.

Нам необходимо реализовать метод `sleepIn()`. Согласно условию задачи, метод принимает на вход булеву переменную `weekday` (будний ли день) и переменную `vacation` (отпуск или нет).

Давайте нажмем кнопку **Check** и посмотрим, что произойдет.

![](/files/-MGFe68GfOZI8_U32EYA)

Как мы видим, изначально задача не решена, нам необходимо корректно реализовать метод.

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

```java
public boolean sleepIn(boolean weekday, boolean vacation) {
    return !weekday || vacation;
}
```

Проверим правильность написания кода.

![](/files/-MGFedk0ZrSrVcN6ECbU)

Ура, задача решена. Для успешной сдачи лабораторной работы необходимо выполнить все 7 задач.

### Условия задач

На всякий случай, продублируем условия задач на первую лабораторную работу

#### 1. Метод sleepIn()

Метод **sleepIn()** принимает решение о том, необходимо ли нам проснуться или можно еще поспать.\
Нужно проснуться, если будний день и нет отпуска

* Параметр **weekday** определяет, будний ли день
* Параметр **vacation** определяет, отпуск или нет

Метод возвращает **true**, если можно еще поспать и **false** в обратном случае

#### 2. Метод closeToTen()

Дано два числа, метод **closeToTen()** возвращает число, которое наиболее близко к 10. Если оба числа равноблизки к 10, то метод возвращает 0.

Подсказка: используйте метод **Math.abs()** для получения абсолютного значения числа.\
Пример:

* closeToTen(8, 13) -> 8 (число 8 ближе к 10)
* closeToTen(8, 11) -> 11 (число 11 ближе к 10)
* closeToTen(13, 7) -> 0 (оба числа равноблизки к 10)

#### 3. Метод reverseArray()

Метод принимает на вход массив и возвращает массив в обратном порядке

Пример:

* reverseArray(\[1,2,3]) -> \[3,2,1]
* reverseArray(\[7,0,0]) -> \[0,0,7]

#### 4. Метод biggestArray()

Метод принимает на вход два массива и возвращает массив, сумма элементов которого больше. Если суммы элементов массивов равны, метод возвращает первый массив.

Пример:

* biggestArray(\[1,2,3], \[1,2,4]) -> \[1,2,4]
* biggestArray(\[1,5,10], \[15]) -> \[1,5,10]
* biggestArray(\[2,4,6], \[10,2]) -> \[2,4,6]

#### 5. Метод seriesUp()

Метод принимает на вход число n >=0. Метод возвращает массив по шаблону {1, 1,2, 1,2,3, ...1,2,3..n}. Длина итогового массива = n\*(n+1)/2

Пример:

* seriesUp(3) -> \[1, 1, 2, 1, 2, 3]
* seriesUp(4) -> \[1, 1, 2, 1, 2, 3, 1, 2, 3, 4]
* seriesUp(2) -> \[1, 1, 2]

#### 6. Метод canSplit()

Дан непустой массив. Метод возвращает true, если массив можно разбить на две части (необязательно равные) таким образом, чтобы сумма частей была равна.

Пример:

* canSplit(\[1, 1, 1, 2, 1]) -> true (\[1,1,1] \[2,1])
* canSplit(\[2, 1, 1, 2, 1]) -> false
* canSplit(\[10, 1, 2, 3, 4]) -> true (\[10] \[1,2,3,4])

#### 7. Метод scoresIncreasing()

Дан массив, метод возвращает true если каждый элемент массива равен или больше предыдущему

Пример:

* scoresIncreasing(\[1, 3, 4]) -> true
* scoresIncreasing(\[1, 3, 2]) -> false
* scoresIncreasing(\[1, 1, 4]) -> true

## Проект - игра "Крестики-нолики"

Реализуйте игру "Крестики-нолики". В игру играют два человека, поочередно вводя координаты поля, куда необходимо поставить крестик или нолик. Ввод происходит в формате `[строка] [столбец]`. Например: `0 0` или `1 2`.

Сценарий игры будет примерно следующим

```
---------
|       |
|       |
|       |
---------
First player: 0 0
---------
| X     |
|       |
|       |
---------
Second player: 1 1
---------
| X     |
|   0   |
|       |
---------
First player: 0 1
---------
| X X   |
|   0   |
|       |
---------
Second player: 2 2
---------
| X X   |
|   0   |
|     0 |
---------
First player: 0 2
First player won!

Process finished with exit code 0
```

Ниже представлен возможный вариант метода для отрисовки поля. В данном случае подразумевается, что в двумерном массиве число `0` соответствует пустому полю, число `1` соответствует `X`, а число - `1` соответствует `0`.

{% code title="Main.java" %}

```java
    public static void drawField(int[][] array) {
        System.out.println("---------");
        for (int i = 0; i < 3; i++) {
            System.out.print("| ");
            for (int j = 0; j < 3; j++) {
                String symbol = " ";
                if (array[i][j] != 0)
                    symbol = array[i][j] == 1 ? "X" : "0";
                System.out.print(symbol + " ");
            }
            System.out.println("|");
        }
        System.out.println("---------");
    }
```

{% endcode %}

Блок-схема алгоритма программы может быть примерно следующей.

![](/files/-MiXYYF_jyQeDxSnY_no)

{% hint style="warning" %}
В качестве дополнительного задания необходимо предусмотреть метод для проверки корректности ввода: можно ставить крестик или нолик только в свободную ячейку, а также отслеживать выход за пределы поля при указании номера строки и столбца.

Если пользовательский ввод оказался некорректным, то программа просит игрока повторить ход.
{% endhint %}
