Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
# Mobile Tools for Java (J2ME)
.mtj.tmp/

# vim swap files
*.swp

# Package Files #
*.jar
!gradle-wrapper.jar
Expand Down
Binary file removed .gradle/6.3/executionHistory/executionHistory.lock
Binary file not shown.
Binary file removed .gradle/6.3/fileChanges/last-build.bin
Binary file not shown.
Binary file removed .gradle/6.3/fileHashes/fileHashes.lock
Binary file not shown.
Empty file removed .gradle/6.3/gc.properties
Empty file.
Binary file removed .gradle/6.5/executionHistory/executionHistory.bin
Binary file not shown.
Binary file removed .gradle/6.5/executionHistory/executionHistory.lock
Binary file not shown.
Binary file removed .gradle/6.5/fileChanges/last-build.bin
Binary file not shown.
Binary file removed .gradle/6.5/fileHashes/fileHashes.bin
Binary file not shown.
Binary file removed .gradle/6.5/fileHashes/fileHashes.lock
Binary file not shown.
Empty file removed .gradle/6.5/gc.properties
Empty file.
Binary file removed .gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file not shown.
2 changes: 0 additions & 2 deletions .gradle/buildOutputCleanup/cache.properties

This file was deleted.

Binary file removed .gradle/checksums/checksums.lock
Binary file not shown.
Empty file removed .gradle/vcs-1/gc.properties
Empty file.
3 changes: 0 additions & 3 deletions .idea/.gitignore

This file was deleted.

10 changes: 0 additions & 10 deletions .idea/compiler.xml

This file was deleted.

18 changes: 0 additions & 18 deletions .idea/gradle.xml

This file was deleted.

20 changes: 0 additions & 20 deletions .idea/jarRepositories.xml

This file was deleted.

7 changes: 0 additions & 7 deletions .idea/misc.xml

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/vcs.xml

This file was deleted.

18 changes: 6 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
# Примеры для курса "Разработчик Java" в OTUS
Написать эмулятор АТМ (банкомата).

Группа 2020-09
Объект класса АТМ должен уметь:

### Преподаватели
Сергей Петрелевич<br>
Стрекалов Павел<br>
Александр Оруджев<br>
Вячеслав Лапин<br>
Виталий Куценко<br>
Дмитрий Коган
принимать банкноты разных номиналов (на каждый номинал должна быть своя ячейка)
выдавать запрошенную сумму минимальным количеством банкнот или ошибку если сумму нельзя выдать Это задание не на алгоритмы, а на проектирование. Поэтому оптимизировать выдачу не надо.
выдавать сумму остатка денежных средств
В этом задании больше думайте об архитектуре приложения. Не отвлекайтесь на создание таких объектов как: пользователь, авторизация, клавиатура, дисплей, UI (консольный, Web, Swing), валюта, счет, карта, т.д. Все это не только не нужно, но и вредно!

Студент:
Kashapov Renat (Кашапов Ренат)<br>
renat.kashapov@gmail.com
22 changes: 22 additions & 0 deletions hw06-ATM/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
plugins {
id 'java'
id 'application'
}

group 'ru.otus'
version '1.0-SNAPSHOT'

repositories {
mavenCentral()
}

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

test {
useJUnitPlatform()
}

mainClassName = 'atm.Starter'
29 changes: 29 additions & 0 deletions hw06-ATM/src/main/java/atm/Nominal.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package atm;

public enum Nominal {
ONE_HUNDRED( 100 ),
TWO_HUNDREDS( 200 ),
FIVE_HUNDRED( 500 ),
ONE_THOUSAND( 1000 ),
TWO_THOUSANDS( 2000 ),
FIVE_THOUSANDS( 5000 );

private Integer nominal;

Nominal( Integer nominal ) {
this.nominal = nominal;
}

public Integer getNominal() {
return nominal;
}

public static Nominal getNominalFromInt( Integer value ) {
if ( value == null ) return null;
for ( Nominal nominal : values() ) {
if ( nominal.nominal.equals( value ) ) return nominal;
}
return null;
}
}

64 changes: 64 additions & 0 deletions hw06-ATM/src/main/java/atm/Starter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package atm;

import atm.atm.ATMService;
import atm.atm.impl.ATMImpl;
import atm.atm.impl.ATMServiceImpl;
import java.util.List;
import java.util.Scanner;

public class Starter {
private ATMImpl atm;

public static void main(String args[]) {
Starter starter = new Starter();
starter.atm = ATMImpl.ATMImplBuilder.build();
String name = "User";
System.out.println("Hello, my dear friend. What's your name?");
Scanner scanner = new Scanner(System.in);
Scanner stringScanner;
name = scanner.nextLine();
System.out.println("Hello " + name + "! What's your command? (add, get, rest, exit)");
String operation = scanner.nextLine();
while (!operation.equalsIgnoreCase("exit")) {
switch (operation.toLowerCase()) {
case "add":
System.out.println("What nominal?");
String nominalsString = scanner.nextLine();
stringScanner = new Scanner(nominalsString);
Integer value;
while (stringScanner.hasNextInt()) {
value = stringScanner.nextInt();
Nominal nominal = Nominal.getNominalFromInt(value);
if (nominal != null) {
starter.atm.putCash(nominal);
System.out.println("Success " + nominal.getNominal());
} else {
System.out.println(value + "? Was it?");
}
}
break;
case "get":
System.out.println("How much? Enter sum");
String sumString = scanner.nextLine();
stringScanner = new Scanner(sumString);
value = stringScanner.nextInt();
List<Nominal> cash = starter.atm.getCash(value);
System.out.print("Cash included:");
for (Nominal nominal:cash){
System.out.print(" " + nominal.getNominal());
}
System.out.println("");
break;
case "rest":
ATMService atmService = new ATMServiceImpl(starter.atm);
System.out.println("Balance is " + atmService.getBalance());
break;
default:
System.out.println("Incorrect command");
}

System.out.println(" What's your next command? (add, get, rest, exit)");
operation = scanner.nextLine();
}
}
}
13 changes: 13 additions & 0 deletions hw06-ATM/src/main/java/atm/atm/ATM.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package atm.atm;

import atm.Nominal;
import atm.cell.Cell;

import java.util.List;

public interface ATM {
boolean putCash( Nominal cash);
List<Nominal> getCash(Integer sum);
List<Cell> getAtmStorage();
}

9 changes: 9 additions & 0 deletions hw06-ATM/src/main/java/atm/atm/ATMService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package atm.atm;

import atm.cell.Cell;
import java.util.List;

public interface ATMService {

Integer getBalance();
}
94 changes: 94 additions & 0 deletions hw06-ATM/src/main/java/atm/atm/impl/ATMImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package atm.atm.impl;

import atm.Nominal;
import atm.atm.ATM;
import atm.cell.Cell;
import atm.cell.impl.CellImpl;
import java.util.*;
import java.util.stream.Collectors;

public class ATMImpl implements ATM {
private List<Cell> atmStorage;

private ATMImpl() {

this.atmStorage = new ArrayList<>();
for (Nominal nominal : Nominal.values()) {
this.atmStorage.add(new CellImpl(nominal, 5));
}
}

public List<Cell> getAtmStorage(){
return new ArrayList<>(this.atmStorage);
}

@Override
public boolean putCash(Nominal cash) {
Cell curCell = null;
for (Cell cellNominalEntry : atmStorage) {
if (cellNominalEntry.getNominal() == cash && cellNominalEntry.getCount() < CellImpl.MAX_COUNT) {
cellNominalEntry.put(1);
return true;
}
}
return false;
}

@Override
public List<Nominal> getCash(Integer sum) {
if (sum % 100 != 0) {
throw new IllegalArgumentException("Введена некорректная сумма. Минимальная купюра - 100р.");
}
List<Nominal> outList = new ArrayList<>();
List<Nominal> nominalList = new ArrayList<>(this.atmStorage.stream().map(Cell::getNominal).collect(Collectors.toList()));
nominalList.sort(Comparator.reverseOrder());
Map<Nominal, Integer> checkMap = new HashMap<>();
for (Nominal nominal : nominalList) {
Integer mustGive = sum / nominal.getNominal();
sum = sum % nominal.getNominal();
Integer canGive = 0;
for (Cell cell : this.atmStorage)
if (cell.getNominal() == nominal)
canGive += cell.getCount();
if (canGive < mustGive) {
sum += (mustGive - canGive) * nominal.getNominal();
checkMap.put(nominal, canGive);
} else {
if (!checkMap.containsKey(nominal))
checkMap.put(nominal, mustGive);
}
}
if (sum != 0) {
int iHave = 0;
for (Nominal key : checkMap.keySet()) {
iHave += key.getNominal() * checkMap.get(key);
}
throw new IllegalArgumentException("Невозможно выдать запрашиваемую сумму имеющимися купюрами, максимально возможная сумма: " + iHave);
} else {
for (Nominal key : checkMap.keySet())
addBanknotes(checkMap.get(key), key, outList);
}
return outList;
}

private void addBanknotes(Integer number, Nominal nominal, List<Nominal> outList) {
for (int i = 0; i < number; i++) {
Cell minCountCell = null;
int minCount = Cell.MAX_COUNT;
outList.add(nominal);
for (Cell cell : this.atmStorage)
if (cell.getNominal() == nominal && cell.getCount() > 0 && cell.getCount() <= minCount) {
minCount = cell.getCount();
minCountCell = cell;
}
minCountCell.get(1);
}
}

public static class ATMImplBuilder {
public static ATMImpl build() {
ATMImpl atm = new ATMImpl();
return atm;
}
}
}
22 changes: 22 additions & 0 deletions hw06-ATM/src/main/java/atm/atm/impl/ATMServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package atm.atm.impl;

import atm.atm.ATM;
import atm.atm.ATMService;
import atm.cell.Cell;

public class ATMServiceImpl implements ATMService {

private ATM atm;

public ATMServiceImpl(ATM atm){
this.atm = atm;
}
@Override
public Integer getBalance() {
Integer balance = 0;
for (Cell cell : atm.getAtmStorage()) {
balance += cell.getCount() * cell.getNominal().getNominal();
}
return balance;
}
}
13 changes: 13 additions & 0 deletions hw06-ATM/src/main/java/atm/cell/Cell.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package atm.cell;
import atm.Nominal;

public interface Cell {
public static final Integer MAX_CAPACITY = 10;
public static final Integer MAX_COUNT = 100;

public void put( Integer count );
public Integer get( Integer count );
public Integer getCount();
public Nominal getNominal();
public Integer getBalance();
}
Loading