Skip to content

Commit

Permalink
homework
Browse files Browse the repository at this point in the history
  • Loading branch information
aberezn committed Sep 8, 2022
0 parents commit d11a196
Show file tree
Hide file tree
Showing 29 changed files with 2,128 additions and 0 deletions.
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Домашние задания по курсу «Основы Java»

### [Словарь терминов Java](./java_glossary.md/)

### Блок 3. Основы ООП

3.1 Модификаторы доступа, наследование (квиз)

[3.2 Полиморфизм](polymorphism)

[3.3 Абстракции и интерфейсы](abstractions-interfaces)

[3.4 Исключения, Stacktrace](exceptions)


### Блок 4. InMemory хранение данных — коллекции

4.1 Generics в коллекциях и методах (квиз)

[4.2 Коллекции List](list)

[4.3 Коллекции Queue](queue)

[4.4 Коллекция HashMap и HashSet](hash-collections)

[4.5 Коллекции Treemap и TreeSet](tree-collections)
33 changes: 33 additions & 0 deletions abstractions-interfaces/3.3.1/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
## Задача 1. Библиотека

### Описание
Необходимо разработать иерархию работников библиотеки. Нужно реализовать совмещение нескольких ролей в библиотеке в одном исполнителе через интерфейсы. Каждый объект в программе имеет определенный набор действий.

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

Для передачи информации о том, что должен уметь объект, используются интерфейсы.

Примером интерфейсов в нашей библиотеке может служить понятие роли на проекте.
Каждая роль подразумевает набор определенных операций, которые должен "уметь" объект пользователь — User в программе.

### Функционал программы
1. Создайте иерархию "Пользователи библиотеки" со следующими интерфейсами:
- Читатель – берет и возвращает книги.
- Библиотекарь – заказывает книги.
- Поставщик книг – приносит книги в библиотеку.
- Администратор – находит и выдает книги и уведомляет о просрочках времени возврата.
2. В методе `public static void main` создайте 2-3 объекта, реализующих эти интерфейсы.

### Дополнительная информация
Учтите, что интерфейсов у пользователя (`User`) может быть несколько.
Объекты класса User могут взаимодействовать друг с другом (например, библиотекарь заказывает у поставщика).

### Пример реализации
1. Создайте 4 интерфейса: `Reader`, `Librarian`, `Supplier`, `Administrator`.
Каждый из них должен содержать описанные выше методы. Например, у администратора должен быть метод `overdueNotification(Reader reader)`.
Методы могут принимать в качестве параметра других user-ов. Например, читатель берет книги у администратора, библиотекарь заказывает у поставщика и т.д.

2. Создайте несколько классов, демонстрирующих использование интерфейсов.
В частности, продемонстрируйте совмещение, например, поставщик, который может быть также и читателем, библиотекарь – администратором и т.д.
В качестве реализации методов можно сделать вывод подробного сообщения в консоль по типу "Библиотекарь Вася заказал у поставщика Петя книгу Игра Престолов".
25 changes: 25 additions & 0 deletions abstractions-interfaces/3.3.2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
## Задача 2. Банковские счета

### Описание
Часто в проектировании программ нам удобно опираться на понятия, которые не представлены в реальном мире,
но служат удобной "опорой" для объединения нескольких классов.

Так, например, в банковском деле нет абстрактного понятия "Счет". Каждый счет в банке имеет четкое назначение: сберегательный, кредитный, расчетный.
Но банковская программа работает с общими для счетов операциями как с одинаковыми объектами, и выполняет их, обращаясь к общему типу "Счет",
хотя его и невозможно явно инстанцировать в программе. Реализуйте этот сценарий, опираясь на механизмы полиморфизма.

### Функционал программы
1. Создайте несколько классов — различных счетов на основе общего интерфейса:
- Сберегательный счет (`SavingsAccount`)
- Кредитный счет (`CreditAccount`)
- Расчетный счет (`CheckingAccount`)
2. Выполните перевод с одного счета на другой в методе `public static void main`.

### Пример реализации
1. Создайте абстрактный класс `Account` с тремя методами: заплатить, перевести, пополнить (`pay(int amount)`, `transfer(Account account, int amount)`, `addMoney(int amount)`).
Платеж в нашем случае будет выглядеть просто как списание средств.
2. Добавьте классы Сберегательный, Кредитный, Расчетный (`SavingsAccount`, `CreditAccount`, `CheckingAccount` соответственно) как потомков класса Счет.
В них нужно переопределить методы базового класса. Каждый из них должен хранить баланс. Со сберегательного счета нельзя платить, только переводить и пополнять. Также сберегательный не может уходить в минус.
Кредитный не может иметь положительный баланс – если платить с него, то уходит в минус, чтобы вернуть в 0, надо пополнить его.
Расчетный может выполнять все три операции, но не может уходить в минус.
3. Продемонстрируйте работу счетов. Создайте три переменные типа `Account` и присвойте им три разных типа счетов.
31 changes: 31 additions & 0 deletions abstractions-interfaces/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Домашнее задание к занятию 3.3. Основы ООП - абстракции и интерфейсы
==

1. [Библиотека](3.3.1);

Дополнительная задача со * :

2. [Банковские счета](3.3.2);

=======

Задачи со звездочкой `*` необязательны для получения зачета.
Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru).

Любые вопросы по решению задач задавайте в чате учебной группы (ссылку вы найдете в письме на вашей эл. почте).

## Инструкция по выполнению домашнего задания

1. Пишите код в IDE (рекомендуем [Intellij Idea](https://www.jetbrains.com/idea/download/), версия Community).
1. Почему лучше работать в IDE? — Ускоряет работу, есть подсветка ошибок, отладка по шагам.
1. Почему Intellij Idea? — Родитель Android Studio, бесплатная, умная.
2. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md).
3. Готовый код сдаем в Repl.it. Для этого зарегистрируйтесь на сайте [Repl.IT](http://repl.it/).
4. Перейдите в раздел **my repls**.
5. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы.
6. В списке языков выберите `Java`.
7. Убедитесь, что на сайте всё работает так же, как и у вас на компьютере, нажав на кнопку **Run**. Результат появится в правой части окна.
8. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера.
9. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку.

*Никаких файлов прикреплять не нужно.*
Binary file added diploma/img2txt-screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added diploma/javabasicsdiploma.zip
Binary file not shown.
70 changes: 70 additions & 0 deletions exceptions/3.4.1/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
## Задача 1. Проверка доступа к ресурсу

### Описание
В этом задании мы напишем программу для проверки доступа к ресурсу. Во время запуска программы нужно запросить логин или пароль пользователя. Если один из введеных параметров не совпадает (логин/пароль), то нужно выбросить checked исключение UserNotFoundException. Если возраст пользователя менее 18 лет, то нужно выбросить исключение AccessDeniedException, а если 18 и больше лет - вывести сообщение "Доступ предоставлен". <br>
<br>
Массив пользователей для авторизации нужно описать до запуска программы. Каждая запись пользователя содержит поля: login, password, age (возраст) и email.

### Функционал программы
1. Создание Scanner для чтения логина и пароля пользователя из консоли;
2. Создание checked исключения UserNotFoundException;
3. Создание checked исключения AccessDeniedException;
4. Выбрасывать ошибку UserNotFoundException, если логин или пароль введены не верно;
5. Выбрасывать ошибку AccessDeniedException, если возраст пользователя меньше 18 лет;
5. Если ошибок не возникло, вывести сообщение "Доступ предоставлен".

### Процесс реализации
1. Создадим класс User, в котором будем хранить инфомрацию о логине, пароле и возрасте пользователя:
class User, login, password, email, age;
2. Создадим класс исключение UserNotFoundException на основе базового класса Exception. Это исключение будем использовать, если пользователь ввел неверный логин или пароль:
```java
public class UserNotFoundException extends Exception {
public UserNotFoundException(String message) {
super(message);
}
}
```
3. Аналогичным образом создадим класс исключения AccessDeniedException
4. Создадим класс Main, в котором создадим метод getUsers, этот метод должен возвращать список заранее созданных пользователей:
```java
public static User[] getUsers() {
User user1 = new User("jhon", "[email protected]", "pass", 24);
...
return new User[]{user1, ...};
}
```
5. Создадим в классе Main метод getUserByLoginAndPassword(String login, String password), в этом методе нужно найти соответствие пары логина и пароля пользователя из массива, возвращаемого методом getUsers. Если пользователь не найден, выбрасываем исключение UserNotFoundException, если найден - возвращаем найденного пользователя:
```java
public static User getUserByLoginAndPassword(String login, String password) throws UserNotFoundException {
User[] users = getUsers();
for (User user : users) {
...
}
throw new UserNotFoundException("User not found");
}
```
6. Создадим к классу Main еще один метод validateUser для проверки возрастра пользователя. Если возраст менее 18 лет, метод должен выбросить исключение AccessDeniedException:
```java
public static void validateUser(User user) throws AccessDeniedException
```
7. Добавим последний метод в классе Main для запуска программы public static void main(String[] args) throws UserNotFoundException, AccessDeniedException
В нем нужно запросить логин и пароль пользователя, проверить есть ли данная пара "логин и пароль" в массиве пользователей и последним шагом провалидировать возраст.
```java
public static void main(String[] args) throws UserNotFoundException, AccessDeniedException {

Scanner scanner = new Scanner(System.in);

System.out.println("Введите логин");
String login = scanner.nextLine();
System.out.println("Введите пароль");
String password = scanner.nextLine();

//Проверить логин и пароль

//Вызвать методы валидации пользователя

System.out.println("Доступ предоставлен");
}

```
8. Программа завершена. Отличная работа!
55 changes: 55 additions & 0 deletions exceptions/3.4.2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
## Задача 2. Валидация прочитанных событий

### Описание
Для выполнения задачи со звездочкой мы напишем программу проверки коррекности прочитанных значений. Для этого подготовим список событий - такими событиями (event) могут быть фильмы/спектакли. <br>
<br>
Базовый класс event содержит поля: название (title), год выпуска (releaseYear), ограничение по возрасту (age).<br>
<br>
Если любое из полей прочитанного объекта равно null или 0 (для целочисленных полей), нужно выбсроить RuntimeException и завершить работу программы, если ошибок не возникло - вывести сообщение "Все события корректны". <br>
<br>
### Функционал программы
1. Создание заранее подготовленного списока событий - отдельно для кино и отдельно для театров;
2. Возможность валидации каждолго из списка событий с помощью универсального метода;
3. Если хотя бы одно из событий содержит поля со значением null или 0, завершить работу программы и вывести это событие;
4. Если ошибок не возникло, вывести сообщение "Все события корректны".

### Процесс реализации
1. Создадим класс Event для описания базового события с полями title, releaseYear и age (класс можно сделать абстрактным);
2. Переопределим метод toString для класса Event, чтобы вывести значения всех полей;
3. Создадим два дочерних класса от класса Event - Movie и Theatre;
4. Создадим класс Main в котором нужно создать два метода для получения массива Movies, Theatres:
```java
public static Movie[] getMovies() {
return new Movie[]{
new Movie("Начало", 2010, 16),
...
};
}

public static Theatre[] getTheatres() {
return new Theatre[]{
new Theatre("Анна Каренина", 2017, 16),
...
};
}
```
5. Добавим в класс Main метод для валидации событий (Event)
```java
public static void validEvent(Event event)
```
Если хоть одно из полей не заполнено, нужно выбросить исключение throw new RuntimeException, обрабатывать
или перехватывать эту ошибку нигде не нужно.

6. Добавим в класс Main метод main для запуска и валидации созданных событий:
```java
public static void main(String[] args) {
for (Event event: getMovies()) {
validEvent(event);
}
for (Event event: getTheatres()) {
validEvent(event);
}
System.out.println("Все события корректны");
}
```
7. Завершим работу программы. Прекрасно!
Loading

0 comments on commit d11a196

Please sign in to comment.