Advertisement
simeon105

[НП] Систем за банкарско работење

Nov 24th, 2020 (edited)
1,047
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 23.36 KB | None | 0 0
  1. /*
  2. Треба да се креира апликација за банка која ќе управуваа со сметките на повеќе корисниците и ќе врши трансакции помеѓу нив. Банката работи само со долари и притоа сите суми на пари се претставуваат како стрингови со знакот $ на крај, и точка помеѓу бројот на центи и бројот на долари без празни места. Бројот на центи треба да се состои од две цифри без разлика на износот.
  3.  
  4. Пример:
  5.  
  6. 10 долари  10.00$
  7. 15 долари и 50 центи 15.50$
  8.  
  9. За потребите на ваквата апликација треба да се напишат класите Account,Transaction и Bank. Класата Account претставува една сметка на еден корисник и треба да ги чува следните податоци:
  10.  
  11. Име на корисникот,
  12. единствен идентификационен број (long)
  13. тековното салдо на сметката.
  14. Оваа класа исто така треба да ги имплементира и следниве методи
  15.  
  16. Account(String name, String balance) – конструктор со параметри (id-то треба да го генерирате сами со помош на класата java.util.Random)
  17. getBalance():String
  18. getName():String
  19. getId():long
  20. setBalance(String balance)
  21. toString():String – враќа стринг во следниот формат, \n означува нов ред
  22.  
  23. Name:Andrej Gajduk\n Balance:20.00$\n
  24.  
  25. Класата Transaction претставува трансакција (префрлување пари од една на друга сметка), од страна на банката за што честопати се наплаќа провизија. За почеток треба да се напише класата Transaction со податочни членови за идентификационите броеви на две сметки, едната од која се одземаат парите и друга на која се додаваат парите, текстуален опис и износ на трансакцијата.
  26.  
  27. За оваа класа треба да ги имплементирате методите:
  28.  
  29. Transaction(long fromId, long toId, Stirng description, String amount) – конструктор со параметри
  30. getAmount():String
  31. getFromId():long
  32. getToId():long
  33. Оваа класа треба да е immutable, а можете и да ја направите и апстрактна бидејќи не е наменета директно да се користи туку само како основна класа за изведување на други класи.
  34.  
  35. Како што споменавме претходно банката наплаќа провизија за одредени трансакции. Има два типа на провизија, фискна сума и процент. Кај фиксна сума за било која трансакција без разлика на износот на трансакцијата се наплаќа исто провизија (пример 10$). Кај процент за секој еден долар од трансакцијата банката наплаќа одреден процент провизија (на пример 5%, или 5 центи на секој долар – процентите секогаш се целобројни и провизија се наплаќа само на цели долари).
  36.  
  37. За да се прави разлика меѓу различните типови на провизија, треба да напишете уште две класи кои ќе наследуваат од Transaction кои треба да ги именувате FlatAmountProvisionTransaction и FlatPercentProvisionTransaction.
  38.  
  39. Првата класа FlatAmountProvisionTransaction треба да содржи соодветен конструктор
  40.  
  41. FlatAmountProvisionTransaction(long fromId, long toId,String amount, String flatProvision) кој го иницијализира полето за опис на "FlatAmount" и соодветен get метод
  42. getFlatAmount():String
  43. Слично и класата FlatPercentProvisionTransaction треба да има соодветен конструктор
  44.  
  45. FlatPercentProvisionTransaction (long fromId, long toId, String amount, int centsPerDolar) кој го иницијализира полето за опис на "FlatPercent" и соодветен get метод
  46. getPercent():int
  47. Исто така треба да се преоптовари equals(Object o):boolean методот и за двете класи.
  48.  
  49. За крај треба да ја имплементирате класата Bank која ги чува сметките од своите корисници и дополнително врши трансакции. Класата освен сметките на своите корисници, треба да ги чува и сопственото име и вкупната сума на трансфери како и вкупната наплатена провизија од страна на банката за сите трансакции.
  50.  
  51. Класата Bank треба да ги нуди следните методи:
  52.  
  53. Bank(String name, Account accounts[]) – конструктор со соодветните параметри (направете сопствена копија на низата од сметки)
  54. makeTransaction(Transaction t):boolean – врши проверка дали корисникот ги има потребните средства на сметка и дали и двете сметки на кои се однесува трансакцијата се нависитина во банката и ако и двата услови се исполнето ја извршува трансакцијата и враќа true, во спротивно враќа false
  55. totalTransfers():String – ја дава вкупната сума на пари кои се префрлени во сите трансакции до сега
  56. totalProvision():String – ја дава вкупната провизија наплатена од банката за сите извршени трансакции до сега
  57. toString():String - го враќа името на банката во посебна линија во формат
  58.  
  59. Name:Banka na RM\n \n по што следат податоците за сите корисници.
  60.  
  61. Провизијата се наплаќа така што на основната сума на трансакцијата се додава вредноста не провизијата и таа сума се одзема од првата сметка.
  62.  
  63. За сите класи да се напишат соодветни equals и hashCode методи.
  64.  
  65. Sample input
  66. typical_usage
  67. Banka na RM
  68. 2
  69. Andrej
  70. 10.00$
  71. Gajduk
  72. 10.00$
  73. print
  74. transaction
  75. FlatAmount
  76. 5.00$
  77. 2.00$
  78. 0 1
  79. print
  80. stop
  81. Sample output
  82. Name: Banka na RM
  83.  
  84. Name: Andrej
  85. Balance: 10.00$
  86. Name: Gajduk
  87. Balance: 10.00$
  88.  
  89. Total provisions: 0.00$
  90. Total transfers: 0.00$
  91.  
  92. Transaction amount: 5.00$
  93. Transaction description: FlatAmount
  94. Transaction successful? true
  95. Name: Banka na RM
  96.  
  97. Name: Andrej
  98. Balance: 3.00$
  99. Name: Gajduk
  100. Balance: 15.00$
  101.  
  102. Total provisions: 2.00$
  103. Total transfers: 5.00$
  104. */
  105.  
  106. import java.util.*;
  107. import java.util.stream.Collectors;
  108.  
  109. class Account
  110. {
  111.     String ime;
  112.     long id;
  113.     String saldoSmetka;
  114.    
  115.     public Account() {}
  116.     public Account(String name, String balance)
  117.     {
  118.         ime = name;
  119.         saldoSmetka = balance;
  120.         Random rand = new Random();
  121.         id = rand.nextLong();
  122.     }
  123.     public String getBalance()
  124.     {
  125.         return saldoSmetka;
  126.     }
  127.     public String getName()
  128.     {
  129.         return ime;
  130.     }
  131.     public long getId()
  132.     {
  133.         return id;
  134.     }
  135.     public void setBalance(String balance)
  136.     {
  137.         saldoSmetka = balance;
  138.     }
  139.     @Override
  140.     public String toString()
  141.     {
  142.         return "Name: " + ime + "\nBalance: " + saldoSmetka + "\n";
  143.     }
  144.     @Override
  145.     public boolean equals(Object obj)
  146.     {
  147.         if(this == obj)
  148.         {
  149.             return true;
  150.         }
  151.         if(obj == null)
  152.         {
  153.             return false;
  154.         }
  155.         Account acc = (Account) obj;
  156.         return id == acc.id&&ime.equals(acc.ime) && saldoSmetka.equals(acc.saldoSmetka);
  157.     }
  158. }
  159.  
  160. abstract class Transaction
  161. {
  162.     private final long fromId;
  163.     private final long toId;
  164.     private final String description;
  165.     private final String amount;
  166.    
  167.     public Transaction(long fromId, long toId, String description, String amount)
  168.     {
  169.         this.fromId = fromId;
  170.         this.toId = toId;
  171.         this.description = description;
  172.         this.amount = amount;
  173.     }
  174.     public String getAmount()
  175.     {
  176.         return amount;
  177.     }
  178.     public long getFromId()
  179.     {
  180.         return fromId;
  181.     }
  182.     public long getToId()
  183.     {
  184.         return toId;
  185.     }
  186.     public String getDescription()
  187.     {
  188.         return description;
  189.     }
  190.     public abstract double getProvision();
  191.     @Override
  192.     public int hashCode()
  193.     {
  194.         final int prime = 31;
  195.         int hash = 1;
  196.         hash = prime * hash + (int) fromId;
  197.         hash = prime * hash + (int) toId;
  198.         hash = prime * hash + description.hashCode();
  199.         hash = prime * hash + amount.hashCode();
  200.        
  201.         return hash;
  202.     }
  203.     @Override
  204.     public boolean equals(Object obj)
  205.     {
  206.         if (obj instanceof FlatAmountProvisionTransaction)
  207.         {
  208.             FlatAmountProvisionTransaction tmp = (FlatAmountProvisionTransaction) obj;
  209.             return this.fromId == tmp.getFromId()&&this.toId == tmp.getToId()
  210.                     && this.description.equals(tmp.getDescription()) && this.amount.equals(tmp.getAmount())
  211.                     && this.hashCode() == tmp.hashCode();
  212.         }
  213.         else if (obj instanceof FlatPercentProvisionTransaction)
  214.         {
  215.             FlatPercentProvisionTransaction tmp = (FlatPercentProvisionTransaction) obj;
  216.             return this.fromId == tmp.getFromId() && this.toId == tmp.getToId()
  217.                     && this.description.equals(tmp.getDescription()) && this.amount.equals(tmp.getAmount())
  218.                     && this.hashCode() == tmp.hashCode();
  219.         }
  220.         else
  221.         {
  222.             return false;
  223.         }
  224.     }
  225. }
  226.  
  227. class FlatAmountProvisionTransaction extends Transaction
  228. {
  229.     private String flatProvision;
  230.    
  231.     public FlatAmountProvisionTransaction(long fromId, long toId, String amount, String flatProvision)
  232.     {
  233.         super(fromId, toId, "FlatAmount", amount);
  234.        
  235.         this.flatProvision = flatProvision;
  236.     }
  237.     private double parseStringToDouble(String num)
  238.     {
  239.         return Double.parseDouble(num.substring(0, num.length() - 1));
  240.     }
  241.     @Override
  242.     public double getProvision()
  243.     {
  244.         return parseStringToDouble(flatProvision);
  245.     }
  246.     public String getFlatAmount()
  247.     {
  248.         return flatProvision;
  249.     }
  250.     @Override
  251.     public int hashCode()
  252.     {
  253.         final int prime = 31;
  254.         int hash = super.hashCode();
  255.         hash = hash * prime + flatProvision.hashCode();
  256.         return hash;
  257.     }
  258.  
  259.     @Override
  260.     public boolean equals(Object obj)
  261.     {
  262.         if (this == obj)
  263.             return true;
  264.         if (obj == null)
  265.             return false;
  266.         if (!(obj instanceof FlatAmountProvisionTransaction))
  267.             return true;
  268.         return super.equals(obj);
  269.     }
  270. }
  271.  
  272. class FlatPercentProvisionTransaction extends Transaction
  273. {
  274.     private int centsPerDolar;
  275.    
  276.     public FlatPercentProvisionTransaction(long fromId, long toId, String amount, int centsPerDolar)
  277.     {
  278.         super(fromId, toId, "FlatPercent", amount);
  279.        
  280.         this.centsPerDolar = centsPerDolar;
  281.     }
  282.     private double parseStringToDouble(String num)
  283.     {
  284.         return Double.parseDouble(num.substring(0, num.length() - 1));
  285.     }
  286.     @Override
  287.     public double getProvision()
  288.     {
  289.         return (centsPerDolar / 100.0) * (int) parseStringToDouble(super.getAmount());
  290.     }
  291.     public int getPercent()
  292.     {
  293.         return centsPerDolar;
  294.     }
  295.     @Override
  296.     public int hashCode()
  297.     {
  298.         final int prime = 31;
  299.         int hash = super.hashCode();
  300.         hash = prime * hash + centsPerDolar;
  301.        
  302.         return hash;
  303.     }
  304.  
  305.     @Override
  306.     public boolean equals(Object obj)
  307.     {
  308.         if (this == obj)
  309.             return true;
  310.         if (obj == null)
  311.             return false;
  312.         if (!(obj instanceof FlatPercentProvisionTransaction))
  313.             return false;
  314.        
  315.         return super.equals(obj);
  316.     }
  317. }
  318.  
  319. class Bank
  320. {
  321.     private String name;
  322.     private Account accounts[];
  323.     private double vkSumaTransferi;
  324.     private double vkSumaProvizija;
  325.     public Bank() {}
  326.     public Bank(String name, Account accounts[])
  327.     {
  328.         this.name = name;
  329.         this.accounts = accounts;
  330.         vkSumaTransferi = 0;
  331.         vkSumaProvizija = 0;
  332.     }
  333.     private double parseStringToDouble(String num)
  334.     {
  335.         return Double.parseDouble(num.substring(0, num.length() - 1));
  336.     }
  337.     public boolean makeTransaction(Transaction t)
  338.     {
  339.         int indexFromId = najdiId(t.getFromId());
  340.         int indexToId = najdiId(t.getToId());
  341.         if (indexFromId == -1 || indexToId == -1) {
  342.             return false;
  343.         }
  344.  
  345.         double balanceFromId = parseStringToDouble(accounts[indexFromId].getBalance());
  346.         double balanceToId = parseStringToDouble(accounts[indexToId].getBalance());
  347.         double transactionAmount = parseStringToDouble(t.getAmount());
  348.  
  349.  
  350.         if (balanceFromId < transactionAmount)
  351.             return false;
  352.  
  353.         double provision = t.getProvision();
  354.         vkSumaTransferi += transactionAmount;
  355.         vkSumaProvizija += provision;
  356.         balanceFromId -= (transactionAmount + provision);
  357.         if (indexFromId == indexToId)
  358.             balanceToId -= provision;
  359.         else
  360.             balanceToId += transactionAmount;
  361.         accounts[indexFromId].setBalance(String.format("%.2f", balanceFromId) + "$");
  362.         accounts[indexToId].setBalance(String.format("%.2f", balanceToId) + "$");
  363.         return true;
  364.     }
  365.     private int najdiId(long id) {
  366.         int index = -1;
  367.         for (int i = 0; i < accounts.length; ++i) {
  368.             if (accounts[i].getId() == id) {
  369.                 index = i;
  370.                 break;
  371.             }
  372.         }
  373.         return index;
  374.     }
  375.     public Account[] getAccounts()
  376.     {
  377.         return accounts;
  378.     }
  379.     public String totalTransfers()
  380.     {
  381.         return String.format("%.2f", vkSumaTransferi) + "$";
  382.     }
  383.     public String totalProvision()
  384.     {
  385.         return String.format("%.2f", vkSumaProvizija) + "$";
  386.     }
  387.     @Override
  388.     public String toString()
  389.     {
  390.         StringBuilder sb = new StringBuilder();
  391.         sb.append("Name: ");
  392.         sb.append(name);
  393.         sb.append("\n\n");
  394.         for (Account account : accounts)
  395.             sb.append(account);
  396.         return sb.toString();
  397.     }
  398.     @Override
  399.     public int hashCode()
  400.     {
  401.         final int prime = 31;
  402.         int hash = 1;
  403.         hash = hash * prime + name.hashCode();
  404.         hash = hash * prime + (int) vkSumaTransferi;
  405.         hash = hash * prime + (int) vkSumaProvizija;
  406.         hash = hash * prime + Arrays.hashCode(accounts);
  407.         return hash;
  408.     }
  409.  
  410.     @Override
  411.     public boolean equals(Object obj)
  412.     {
  413.         if (this == obj)
  414.             return true;
  415.         if (obj == null)
  416.             return false;
  417.         if (this.getClass() != obj.getClass())
  418.             return false;
  419.         Bank bank = (Bank) obj;
  420.         return this.name.equals(bank.name) && Arrays.equals(this.accounts, bank.accounts)
  421.                 && this.vkSumaTransferi == bank.vkSumaTransferi && this.vkSumaProvizija == bank.vkSumaProvizija
  422.                 && this.hashCode() == bank.hashCode();
  423.     }
  424. }
  425.  
  426. public class BankTester {
  427.  
  428.     public static void main(String[] args) {
  429.         Scanner jin = new Scanner(System.in);
  430.         String test_type = jin.nextLine();
  431.         switch (test_type) {
  432.             case "typical_usage":
  433.                 testTypicalUsage(jin);
  434.                 break;
  435.             case "equals":
  436.                 testEquals();
  437.                 break;
  438.         }
  439.         jin.close();
  440.     }
  441.  
  442.     private static void testEquals() {
  443.         Account a1 = new Account("Andrej", "20.00$");
  444.         Account a2 = new Account("Andrej", "20.00$");
  445.         Account a3 = new Account("Andrej", "30.00$");
  446.         Account a4 = new Account("Gajduk", "20.00$");
  447.         List<Account> all = Arrays.asList(a1, a2, a3, a4);
  448.         if (!(a1.equals(a1)&&!a1.equals(a2)&&!a2.equals(a1) && !a3.equals(a1)
  449.                 && !a4.equals(a1)
  450.                 && !a1.equals(null))) {
  451.             System.out.println("Your account equals method does not work properly.");
  452.             return;
  453.         }
  454.         Set<Long> ids = all.stream().map(Account::getId).collect(Collectors.toSet());
  455.         if (ids.size() != all.size()) {
  456.             System.out.println("Different accounts have the same IDS. This is not allowed");
  457.             return;
  458.         }
  459.         FlatAmountProvisionTransaction fa1 = new FlatAmountProvisionTransaction(10, 20, "20.00$", "10.00$");
  460.         FlatAmountProvisionTransaction fa2 = new FlatAmountProvisionTransaction(20, 20, "20.00$", "10.00$");
  461.         FlatAmountProvisionTransaction fa3 = new FlatAmountProvisionTransaction(20, 10, "20.00$", "10.00$");
  462.         FlatAmountProvisionTransaction fa4 = new FlatAmountProvisionTransaction(10, 20, "50.00$", "50.00$");
  463.         FlatAmountProvisionTransaction fa5 = new FlatAmountProvisionTransaction(30, 40, "20.00$", "10.00$");
  464.         FlatPercentProvisionTransaction fp1 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 10);
  465.         FlatPercentProvisionTransaction fp2 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 10);
  466.         FlatPercentProvisionTransaction fp3 = new FlatPercentProvisionTransaction(10, 10, "20.00$", 10);
  467.         FlatPercentProvisionTransaction fp4 = new FlatPercentProvisionTransaction(10, 20, "50.00$", 10);
  468.         FlatPercentProvisionTransaction fp5 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 30);
  469.         FlatPercentProvisionTransaction fp6 = new FlatPercentProvisionTransaction(30, 40, "20.00$", 10);
  470.         if (fa1.equals(fa1) &&
  471.                 !fa2.equals(null) &&
  472.                 fa2.equals(fa1) &&
  473.                 fa1.equals(fa2) &&
  474.                 fa1.equals(fa3) &&
  475.                 !fa1.equals(fa4) &&
  476.                 !fa1.equals(fa5) &&
  477.                 !fa1.equals(fp1) &&
  478.                 fp1.equals(fp1) &&
  479.                 !fp2.equals(null) &&
  480.                 fp2.equals(fp1) &&
  481.                 fp1.equals(fp2) &&
  482.                 fp1.equals(fp3) &&
  483.                 !fp1.equals(fp4) &&
  484.                 !fp1.equals(fp5) &&
  485.                 !fp1.equals(fp6)) {
  486.             System.out.println("Your transactions equals methods do not work properly.");
  487.             return;
  488.         }
  489.         Account accounts[] = new Account[]{a1, a2, a3, a4};
  490.         Account accounts1[] = new Account[]{a2, a1, a3, a4};
  491.         Account accounts2[] = new Account[]{a1, a2, a3};
  492.         Account accounts3[] = new Account[]{a1, a2, a3, a4};
  493.  
  494.         Bank b1 = new Bank("Test", accounts);
  495.         Bank b2 = new Bank("Test", accounts1);
  496.         Bank b3 = new Bank("Test", accounts2);
  497.         Bank b4 = new Bank("Sample", accounts);
  498.         Bank b5 = new Bank("Test", accounts3);
  499.  
  500.         if (!(b1.equals(b1) &&
  501.                 !b1.equals(null) &&
  502.                 !b1.equals(b2) &&
  503.                 !b2.equals(b1) &&
  504.                 !b1.equals(b3) &&
  505.                 !b3.equals(b1) &&
  506.                 !b1.equals(b4) &&
  507.                 b1.equals(b5))) {
  508.             System.out.println("Your bank equals method do not work properly.");
  509.             return;
  510.         }
  511.         //accounts[2] = a1;
  512.         if (!b1.equals(b5)) {
  513.             System.out.println("Your bank equals method do not work properly.");
  514.             return;
  515.         }
  516.         long from_id = a2.getId();
  517.         long to_id = a3.getId();
  518.         Transaction t = new FlatAmountProvisionTransaction(from_id, to_id, "3.00$", "3.00$");
  519.         b1.makeTransaction(t);
  520.         if (b1.equals(b5)) {
  521.             System.out.println("Your bank equals method do not work properly.");
  522.             return;
  523.         }
  524.         b5.makeTransaction(t);
  525.         if (!b1.equals(b5)) {
  526.             System.out.println("Your bank equals method do not work properly.");
  527.             return;
  528.         }
  529.         System.out.println("All your equals methods work properly.");
  530.     }
  531.  
  532.     private static void testTypicalUsage(Scanner jin) {
  533.         String bank_name = jin.nextLine();
  534.         int num_accounts = jin.nextInt();
  535.         jin.nextLine();
  536.         Account accounts[] = new Account[num_accounts];
  537.         for (int i = 0; i < num_accounts; ++i)
  538.             accounts[i] = new Account(jin.nextLine(), jin.nextLine());
  539.         Bank bank = new Bank(bank_name, accounts);
  540.         while (true) {
  541.             String line = jin.nextLine();
  542.             switch (line) {
  543.                 case "stop":
  544.                     return;
  545.                 case "transaction":
  546.                     String descrption = jin.nextLine();
  547.                     String amount = jin.nextLine();
  548.                     String parameter = jin.nextLine();
  549.                     int from_idx = jin.nextInt();
  550.                     int to_idx = jin.nextInt();
  551.                     jin.nextLine();
  552.                     Transaction t = getTransaction(descrption, from_idx, to_idx, amount, parameter, bank);
  553.                     System.out.println("Transaction amount: " + t.getAmount());
  554.                     System.out.println("Transaction description: " + t.getDescription());
  555.                     System.out.println("Transaction successful? " + bank.makeTransaction(t));
  556.                     break;
  557.                 case "print":
  558.                     System.out.println(bank.toString());
  559.                     System.out.println("Total provisions: " + bank.totalProvision());
  560.                     System.out.println("Total transfers: " + bank.totalTransfers());
  561.                     System.out.println();
  562.                     break;
  563.             }
  564.         }
  565.     }
  566.  
  567.     private static Transaction getTransaction(String description, int from_idx, int to_idx, String amount, String o, Bank bank) {
  568.         switch (description) {
  569.             case "FlatAmount":
  570.                 return new FlatAmountProvisionTransaction(bank.getAccounts()[from_idx].getId(),
  571.                         bank.getAccounts()[to_idx].getId(), amount, o);
  572.             case "FlatPercent":
  573.                 return new FlatPercentProvisionTransaction(bank.getAccounts()[from_idx].getId(),
  574.                         bank.getAccounts()[to_idx].getId(), amount, Integer.parseInt(o));
  575.         }
  576.         return null;
  577.     }
  578.  
  579.  
  580. }
  581.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement