fork download
  1. import java.text.DecimalFormat;
  2. import java.util.Scanner;
  3. import java.math.BigDecimal;
  4. import java.math.MathContext;
  5.  
  6. class BankAccount
  7. {
  8. private double balance;
  9.  
  10. public BankAccount(double initial_amount) {
  11. if (initial_amount >= 0.01)
  12. balance = initial_amount;
  13. else
  14. balance = 0;
  15. }
  16.  
  17. public double getBalance() {
  18. return balance;
  19. }
  20.  
  21. public boolean deposit(double amount) {
  22. boolean result = false;
  23. if (amount < 0.01)
  24. System.out.println("invalid deposit amount");
  25. else {
  26. balance = (double)((int)(balance * 100) + (int)(amount * 100)) / 100;
  27. result = true;
  28. }
  29. return result;
  30. }
  31.  
  32. public boolean withdraw(double amount) {
  33. boolean result = false;
  34. if (amount < 0.01)
  35. System.out.println("invalid withdraw amount");
  36. else if (amount > balance)
  37. System.out.println("not enough balance");
  38. else {
  39. balance = (double)((int)(balance * 100) - (int)(amount * 100)) / 100;
  40. result = true;
  41. }
  42. return result;
  43. }
  44. }
  45.  
  46. class BankReader
  47. {
  48. private String input_line = "";
  49. private Scanner scan;
  50.  
  51. public BankReader() {
  52. scan = new Scanner(System.in);
  53. }
  54. public char readCommand(String message) {
  55. System.out.print(message);
  56. input_line = scan.nextLine().toUpperCase();
  57. return input_line.charAt(0);
  58. }
  59.  
  60. public double readAmount()
  61. {
  62. double answer = 0;
  63. String s = input_line.substring(1, input_line.length());
  64.  
  65. if(s.length() > 0) {
  66. answer = new Double(s).doubleValue();
  67. } else
  68. System.out.println("invalid command - input amount: 0");
  69. return answer;
  70. }
  71. }
  72.  
  73. class BankWriter
  74. {
  75. private BankAccount bank;
  76. private String last_transaction = "";
  77.  
  78. public BankWriter(BankAccount b) {
  79. bank = b;
  80. }
  81.  
  82. public void setTransaction(String message, double amount)
  83. {
  84. last_transaction = message + " " + BigDecimal.valueOf((double)((int)(amount * 100)) / 100).movePointRight(2).round(MathContext.UNLIMITED).movePointLeft(2);
  85. System.out.println("transaction: " + last_transaction);
  86. }
  87.  
  88. public void setTransaction(String message)
  89. {
  90. last_transaction = message;
  91. System.out.println("transaction: " + last_transaction);
  92. }
  93.  
  94. }
  95.  
  96. class AccountController
  97. {
  98. private BankReader reader;
  99. private BankAccount primary_account, secondary_account, account;
  100. private BankWriter primary_writer, secondary_writer, writer;
  101.  
  102. public AccountController (BankReader r, BankAccount a1,BankWriter w1, BankAccount a2, BankWriter w2)
  103. {
  104. reader = r;
  105. primary_account = a1;
  106. primary_writer = w1;
  107. secondary_account = a2;
  108. secondary_writer = w2;
  109. account = primary_account;
  110. writer = primary_writer;
  111. }
  112.  
  113. public void resetAccount (BankAccount new_account,BankWriter new_writer) {
  114. account = new_account;
  115. writer = new_writer;
  116. }
  117.  
  118. public void processTransactions()
  119. {
  120. char command = reader.readCommand("Commands (P/S/D/W/T/I/Q): ");
  121.  
  122. switch (command) {
  123. case 'P':
  124. resetAccount(primary_account, primary_writer);
  125. break;
  126. case 'S':
  127. resetAccount(secondary_account, secondary_writer);
  128. break;
  129. case 'Q':
  130. System.out.println("Quit");
  131. return;
  132. case 'D':
  133. {
  134. double amount = reader.readAmount();
  135. if (account.deposit(amount)) writer.setTransaction("deposit $", amount);
  136. else writer.setTransaction("deposit error ", amount);
  137. break;
  138. }
  139. case 'W':
  140. {
  141. double amount = reader.readAmount();
  142. if (account.withdraw(amount)) writer.setTransaction("withdraw $", amount);
  143. else writer.setTransaction("withdraw error ", amount);
  144. break;
  145. }
  146. case 'T':
  147. {
  148. double amount = reader.readAmount();
  149. if (account.withdraw(amount))
  150. {
  151. writer.setTransaction("withdraw $", amount);
  152. if(account == primary_account) resetAccount(secondary_account, secondary_writer);
  153. else resetAccount(primary_account, primary_writer);
  154. if(account.deposit(amount))
  155. {
  156. writer.setTransaction("deposit $", amount);
  157. }
  158. else
  159. {
  160. writer.setTransaction("deposit error ", amount);
  161. }
  162. }
  163. else
  164. {
  165. writer.setTransaction("withdraw error ", amount);
  166. }
  167. if(account == primary_account) resetAccount(secondary_account, secondary_writer);
  168. else resetAccount(primary_account, primary_writer);
  169. break;
  170. }
  171. case 'I':
  172. {
  173. double amount = reader.readAmount() / 100 * account.getBalance();
  174. if (account.deposit(amount)) writer.setTransaction("deposit $", amount);
  175. else writer.setTransaction("deposit error ", amount);
  176. break;
  177. }
  178. default:
  179. writer.setTransaction("invalid commpand: " + command);
  180. }
  181. System.out.println("=======================");
  182. System.out.println("== currently active : " + ((account == primary_account) ? "primary" : "secondary"));
  183. System.out.println("== primary account : " + BigDecimal.valueOf(primary_account.getBalance()).movePointRight(2).round(MathContext.UNLIMITED).movePointLeft(2));
  184. System.out.println("== secondary account : " + BigDecimal.valueOf(secondary_account.getBalance()).movePointRight(2).round(MathContext.UNLIMITED).movePointLeft(2));
  185. System.out.println("=======================");
  186.  
  187. this.processTransactions();
  188. }
  189. }
  190.  
  191.  
  192. public class Main {
  193. public static void main(String[] args) {
  194. BankReader reader = new BankReader();
  195. BankAccount primary_account = new BankAccount(0);
  196. BankWriter primary_writer = new BankWriter(primary_account);
  197. BankAccount secondary_account = new BankAccount(0);
  198. BankWriter secondary_writer = new BankWriter(secondary_account);
  199. AccountController controller = new AccountController(reader,
  200. primary_account, primary_writer, secondary_account,
  201. secondary_writer);
  202. controller.processTransactions();
  203. }
  204. }
Success #stdin #stdout 0.22s 38624KB
stdin
d 0.01
w 0.02
d 0.01112341
w 0.02
d 1000
i 0.06
s
d 1000
t 1000
d 1000
i 4.12
p
d 0.001224
w 0.001222
d 0.0099999999
w 0.009999999999999999
t 1000
q
stdout
Commands (P/S/D/W/T/I/Q): transaction: deposit $ 0.01
=======================
== currently active : primary
== primary account : 0.01
== secondary account : 0.00
=======================
Commands (P/S/D/W/T/I/Q): not enough balance
transaction: withdraw error  0.02
=======================
== currently active : primary
== primary account : 0.01
== secondary account : 0.00
=======================
Commands (P/S/D/W/T/I/Q): transaction: deposit $ 0.01
=======================
== currently active : primary
== primary account : 0.02
== secondary account : 0.00
=======================
Commands (P/S/D/W/T/I/Q): transaction: withdraw $ 0.02
=======================
== currently active : primary
== primary account : 0.00
== secondary account : 0.00
=======================
Commands (P/S/D/W/T/I/Q): transaction: deposit $ 1000.00
=======================
== currently active : primary
== primary account : 1000.00
== secondary account : 0.00
=======================
Commands (P/S/D/W/T/I/Q): transaction: deposit $ 0.60
=======================
== currently active : primary
== primary account : 1000.60
== secondary account : 0.00
=======================
Commands (P/S/D/W/T/I/Q): =======================
== currently active : secondary
== primary account : 1000.60
== secondary account : 0.00
=======================
Commands (P/S/D/W/T/I/Q): transaction: deposit $ 1000.00
=======================
== currently active : secondary
== primary account : 1000.60
== secondary account : 1000.00
=======================
Commands (P/S/D/W/T/I/Q): transaction: withdraw $ 1000.00
transaction: deposit $ 1000.00
=======================
== currently active : secondary
== primary account : 2000.60
== secondary account : 0.00
=======================
Commands (P/S/D/W/T/I/Q): transaction: deposit $ 1000.00
=======================
== currently active : secondary
== primary account : 2000.60
== secondary account : 1000.00
=======================
Commands (P/S/D/W/T/I/Q): transaction: deposit $ 41.20
=======================
== currently active : secondary
== primary account : 2000.60
== secondary account : 1041.20
=======================
Commands (P/S/D/W/T/I/Q): =======================
== currently active : primary
== primary account : 2000.60
== secondary account : 1041.20
=======================
Commands (P/S/D/W/T/I/Q): invalid deposit amount
transaction: deposit error  0.00
=======================
== currently active : primary
== primary account : 2000.60
== secondary account : 1041.20
=======================
Commands (P/S/D/W/T/I/Q): invalid withdraw amount
transaction: withdraw error  0.00
=======================
== currently active : primary
== primary account : 2000.60
== secondary account : 1041.20
=======================
Commands (P/S/D/W/T/I/Q): invalid deposit amount
transaction: deposit error  0.00
=======================
== currently active : primary
== primary account : 2000.60
== secondary account : 1041.20
=======================
Commands (P/S/D/W/T/I/Q): invalid withdraw amount
transaction: withdraw error  0.00
=======================
== currently active : primary
== primary account : 2000.60
== secondary account : 1041.20
=======================
Commands (P/S/D/W/T/I/Q): transaction: withdraw $ 1000.00
transaction: deposit $ 1000.00
=======================
== currently active : primary
== primary account : 1000.60
== secondary account : 2041.20
=======================
Commands (P/S/D/W/T/I/Q): Quit