JavaRush /Курсы /Java Collections /Большая задача: Пишем ПО банкомата

Большая задача: Пишем ПО банкомата

Java Collections
9 уровень , 15 лекция
Открыта

— Привет, Амиго!

— Здравия желаю, капитан Бобров.

— Хорошо учишься. Молодец, боец!

У тебя сегодня новая секретная миссия — осваивать финансы.

— Ура!!! Я уже придумал, на что я их потрачу!!!

— Так, не расслабляться! Осваивать финансы – это писать новую секретную
программу «Банкомат».

Большая задача: Пишем ПО банкомата - 1

Отправляйся к нашему секретному агенту Intellij IDEA, там получишь все инструкции.

— Будет сделано, товарищ капитан!

10
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (1)
Давай напишем эмулятор работы банкомата. Операции, которые будем поддерживать, следующие: поместить деньги, снять деньги, показать состояние банкомата. Также будем поддерживать мультивалютность. Купюрами будем оперировать теми, которые поместим в банкомат. Если для снятия требуемой суммы будет недос
10
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (2)
1. Создай в ConsoleHelper два статических метода: 1.1 writeMessage(String message), который будет писать в консоль наше сообщение. 1.2 String readString(), который будет считывать с консоли строку и возвращать ее. Если возникнет какое-то исключение при работе с консолью, то перехватим его и не будем
20
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (3)
1. Создай класс CurrencyManipulator, который будет хранить всю информацию про выбранную валюту. Класс должен содержать: 1.1 String currencyCode - код валюты, например, USD. Состоит из трех букв. 1.2 Map<Integer, Integer> denominations - это Map<номинал, количество>. Чтобы можно было посмотреть, к ка
40
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (4)
1. Выберем операцию, с которой мы сможем начать. Подумаем. В банкомате еще денег нет, поэтому INFO и WITHDRAW протестить не получится. Начнем с операции DEPOSIT - поместить деньги. Считаем с консоли код валюты, потом считаем номинал и количество банкнот, а потом добавим их в манипулятор. 2. Чтобы с
20
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (5)
1.В предыдущем таске мы реализовали основную логику операции DEPOSIT. Но посмотреть результат так и не удалось. Поэтому создай в манипуляторе метод int getTotalAmount(), который посчитает общую сумму денег для выбранной валюты. 2. Добавь вызов метода getTotalAmount() в метод main. Всё работает верн
20
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (6)
Чтобы отрефакторить код в соответствии с паттерном Command, нужно выделить в коде несколько логических блоков кода. У нас пока два таких блока: 1) код операции DEPOSIT, 2) код операции INFO. Они захардкожены в методе main. Нужно от этого избавиться. Нужно сделать так, чтобы пользователь сам выбирал,
20
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (7)
Возвращаемся к паттерну Command. 1. Создай пакет command, в нем будут все классы, относящиеся к этой логике. Подумай над модификатором доступа для всех классов в этом пакете. 2. Создай интерфейс Command с методом void execute(). 3. Для каждой операции создай класс-команду, удовлетворяющую паттерн
40
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (8)
Пора привести в порядок наш main, уж очень там всего много, чего не должно быть. 1. Перенеси логику из main в DepositCommand и InfoCommand. Проверим, что там стало с main? Цикл, в котором спрашиваем операцию у пользователя, а потом вызываем метод у CommandExecutor. И так до бесконечности... надо бы
40
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (9)
Сегодня мы займемся командой ExitCommand. 1. Реализуй следующую логику в команде ExitCommand: 1.1. Спросить, действительно ли пользователь хочет выйти - варианты <y,n>. 1.2. Если пользователь подтвердит свои намерения, то попрощаться с ним. 1.3. Если пользователь не подтвердит свои намерения, то не
40
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (10)
Сегодня мы займемся командой WithdrawCommand - это самая сложная операция. 1. Реализуй следующий алгоритм для команды WithdrawCommand: 1.1. Считать код валюты (метод уже есть). 1.2. Получить манипулятор для этой валюты. 1.3. Пока пользователь не введет корректные данные выполнять: 1.3.1. Попросить
40
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (11)
Поздравляю, ты реализовал WithdrawCommand! Основной функционал завершен. Дальше можно допиливать и наводить красоту. Реализуем одну плюшку. Можно и без нее, но с ней - красивее. Это верификация кредитной карты пользователя. Нет, никакого API сторонних либ не будет. Только консольная обработка. Итак
40
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (12)
В задании 11 мы захардкодили номер кредитной карточки с пином, с которыми разрешим работать нашему банкомату. Но юзеров может быть много. Не будем же мы их всех хардкодить! Если понадобится добавить еще одного пользователя, то придется передеплоить наше приложение. Есть решение этой проблемы. Смотр
40
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (13)
Ты уже разобрался с ResourceBundle - это круто. Теперь мы сможем прикрутить локализацию, т.е. поддержку нескольких языков. 1. В DepositCommand, ExitCommand, InfoCommand добавь поле private ResourceBundle res, которое инициализируй соответствующим ресурсом. Для DepositCommand ресурс deposit_en.prope
40
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (14)
1. В LoginCommand, WithdrawCommand добавь поле private ResourceBundle res, которое инициализируй соответствующим ресурсом. Для LoginCommand ресурс login_en.properties. Для WithdrawCommand ресурс withdraw_en.properties. 2. Для ресурса common_en.properties замени все строки в ConsoleHelper. Для этого
10
Задача
Java Collections, 9 уровень, 15 лекция
Недоступна
CashMachine (15)
1. В CashMachine создай константу - путь к ресурсам. public static final String RESOURCE_PATH; Отрефакторь загрузку всех ResourceBundle с учетом RESOURCE_PATH. 2. В классе CashMachine не должно быть инициализации ResourceBundle. Вынеси из CashMachine сообщение о выходе в ConsoleHelper, назови метод
Комментарии (70)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
И. Ж. Уровень 41
18 марта 2024
И еще в задаче баг оказался от автора. В логине именно. По логике принятого решения, так же как и в готовом, если вводить номер карты правильный который есть в файле, а потом ввести абсолютно любой 4 х значный пин код , то верификация успешна! Поэтому в проверке на наличие ключа в файле и сравнение значения ключа с введенным пин кодом, надо не && как в авторском решении, а || ставить. Сам при этом тоже изначально && поставил, уже после всех задач заметилось, когда "красоту" наводил.
И. Ж. Уровень 41
14 марта 2024
Жадный алгоритм работает только в случае когда номиналы купюр такие, что при делении большей купюры на меньшую всегда получается целое число, то есть скажем 1000, 500, 100... Когда же допустим купюры 500 и 200, уже нет. К примеру в банкомате есть купюры 5×500 и 3×200 и надо выдать 600 рублей. Он сначала согласно жадному алгоритму изымет одну 500-ку, а 200-ки соответственно уже не подпадают и таким образом деньги не выдаст, вместо того чтобы дать 3х200. Уже другой алгоритм надо. Но валидатор такое хочет и ладно..
PhanSca Уровень 48
22 мая 2023
Отличная задача, если бы не косяк с жадным алгоритмом. Имхо, таких ошибок в обучении допускать нельзя. Это же чуть ли не классический пример, на котором показывают, что тут жадный алгоритм НЕ РАБОТАЕТ.
On1k Уровень 45
11 декабря 2022
Перевел эту задачу на спринг бут. Загружается как стартер при запуске приложения. Получилось интересно, хочу добавить базу данных, чтобы хранить информацию о счетах, а то тут получается счет один на все карты.
Рогов Игорь Уровень 17
13 июня 2022
опять все мои комментарии и пометки на 11 задаче сбросились......
Afanasii Уровень 51
14 августа 2023
:D
Александр Уровень 41
5 декабря 2021
Отличная задача. Получил кучу удовольствия, решая. А тема с просто жадным и жадным, но умным алгоритмом настолько зацепила, что пошел изучать динамическое программирование и пока не напишу умного не успокоюсь))
Ars Уровень 41
4 декабря 2021
Инфа по последней задаче: Среднее количество попыток для этой задачи 1.8. Всего эту задачу решили 2733 учеников. Спокойно решил задачу. Валидатор в принципе нормальный. Даже удивительно.
Sega Уровень 51
22 сентября 2022
3062
Flexo Уровень 41
24 мая 2021
С удовольствием прорешал всю задачу, но так и не понял, зачем метод getValidTwoDigits принимает в аргументы currencyCode также помимо: - допилил функционал exit, не зря же мы спрашиваем у пользователя, действительно ли он хочет выйти - исправил баг, когда вводишь на выдаче ещё несуществующую валюту, в дефолтной версии остаётся только выйти см поправки подробно в комментариях к 15 главе что ещё хочется доделать: -реализовать рабочий (а не жадный) алгоритм сдачи, именно для минимального кол-ва купюр ну, как-нибудь потом
SerB Уровень 41
14 июля 2021
currencyCode нужен в конце задачи, его в выводимое сообщение подставить можно
Александр Уровень 41
4 декабря 2021
-реализовать рабочий (а не жадный) алгоритм сдачи, именно для минимального кол-ва купюр Да, меня тоже зацепила эта задачка. Надо будет обязательно заняться на досуге. ))
LokiLaufeyson Уровень 41
29 апреля 2021
Исправьте, пожалуйста: в 7-м номере зачем делать static метод final, если статические методы и так нельзя переопределять
26 марта 2021
CashMachine (10) - очень тяжелая задача нужно тренировать алгоритмы
Flexo Уровень 41
24 мая 2021
тяжёлая, если пытаться реализовать её согласно противоречивому условию) жадный алгоритм не может являться оптимальным для рандомных номиналов та реализация алгоритма, что может приниматься, она даже не всегда выдаёт сумму, даже если это в принципе возможно. такие дела 😕