import java.text.DecimalFormat;
import java.util.Scanner;
import java.math.BigDecimal;
import java.math.MathContext;
class BankAccount
{
private double balance;
public BankAccount(double initial_amount) {
if (initial_amount >= 0.01)
balance = initial_amount;
else
balance = 0;
}
public double getBalance() {
return balance;
}
public boolean deposit(double amount) {
boolean result = false;
if (amount < 0.01)
System.
out.
println("invalid deposit amount"); else {
balance = (double)((int)(balance * 100) + (int)(amount * 100)) / 100;
result = true;
}
return result;
}
public boolean withdraw(double amount) {
boolean result = false;
if (amount < 0.01)
System.
out.
println("invalid withdraw amount"); else if (amount > balance)
System.
out.
println("not enough balance"); else {
balance = (double)((int)(balance * 100) - (int)(amount * 100)) / 100;
result = true;
}
return result;
}
}
class BankReader
{
private String input_line
= ""; private Scanner scan;
public BankReader() {
scan
= new Scanner
(System.
in); }
public char readCommand
(String message
) { input_line = scan.nextLine().toUpperCase();
return input_line.charAt(0);
}
public double readAmount()
{
double answer = 0;
String s
= input_line.
substring(1, input_line.
length());
if(s.length() > 0) {
answer
= new Double(s
).
doubleValue(); } else
System.
out.
println("invalid command - input amount: 0"); return answer;
}
}
class BankWriter
{
private BankAccount bank;
private String last_transaction
= "";
public BankWriter(BankAccount b) {
bank = b;
}
public void setTransaction
(String message,
double amount
) {
last_transaction
= message
+ " " + BigDecimal.
valueOf((double)((int)(amount
* 100)) / 100).
movePointRight(2).
round(MathContext.
UNLIMITED).
movePointLeft(2); System.
out.
println("transaction: " + last_transaction
); }
public void setTransaction
(String message
) {
last_transaction = message;
System.
out.
println("transaction: " + last_transaction
); }
}
class AccountController
{
private BankReader reader;
private BankAccount primary_account, secondary_account, account;
private BankWriter primary_writer, secondary_writer, writer;
public AccountController (BankReader r, BankAccount a1,BankWriter w1, BankAccount a2, BankWriter w2)
{
reader = r;
primary_account = a1;
primary_writer = w1;
secondary_account = a2;
secondary_writer = w2;
account = primary_account;
writer = primary_writer;
}
public void resetAccount (BankAccount new_account,BankWriter new_writer) {
account = new_account;
writer = new_writer;
}
public void processTransactions()
{
char command = reader.readCommand("Commands (P/S/D/W/T/I/Q): ");
switch (command) {
case 'P':
resetAccount(primary_account, primary_writer);
break;
case 'S':
resetAccount(secondary_account, secondary_writer);
break;
case 'Q':
return;
case 'D':
{
double amount = reader.readAmount();
if (account.deposit(amount)) writer.setTransaction("deposit $", amount);
else writer.setTransaction("deposit error ", amount);
break;
}
case 'W':
{
double amount = reader.readAmount();
if (account.withdraw(amount)) writer.setTransaction("withdraw $", amount);
else writer.setTransaction("withdraw error ", amount);
break;
}
case 'T':
{
double amount = reader.readAmount();
if (account.withdraw(amount))
{
writer.setTransaction("withdraw $", amount);
if(account == primary_account) resetAccount(secondary_account, secondary_writer);
else resetAccount(primary_account, primary_writer);
if(account.deposit(amount))
{
writer.setTransaction("deposit $", amount);
}
else
{
writer.setTransaction("deposit error ", amount);
}
}
else
{
writer.setTransaction("withdraw error ", amount);
}
if(account == primary_account) resetAccount(secondary_account, secondary_writer);
else resetAccount(primary_account, primary_writer);
break;
}
case 'I':
{
double amount = reader.readAmount() / 100 * account.getBalance();
if (account.deposit(amount)) writer.setTransaction("deposit $", amount);
else writer.setTransaction("deposit error ", amount);
break;
}
default:
writer.setTransaction("invalid commpand: " + command);
}
System.
out.
println("======================="); System.
out.
println("== currently active : " + ((account
== primary_account
) ? "primary" : "secondary")); System.
out.
println("== primary account : " + BigDecimal.
valueOf(primary_account.
getBalance()).
movePointRight(2).
round(MathContext.
UNLIMITED).
movePointLeft(2)); System.
out.
println("== secondary account : " + BigDecimal.
valueOf(secondary_account.
getBalance()).
movePointRight(2).
round(MathContext.
UNLIMITED).
movePointLeft(2)); System.
out.
println("=======================");
this.processTransactions();
}
}
public class Main {
public static void main
(String[] args
) { BankReader reader = new BankReader();
BankAccount primary_account = new BankAccount(0);
BankWriter primary_writer = new BankWriter(primary_account);
BankAccount secondary_account = new BankAccount(0);
BankWriter secondary_writer = new BankWriter(secondary_account);
AccountController controller = new AccountController(reader,
primary_account, primary_writer, secondary_account,
secondary_writer);
controller.processTransactions();
}
}