Bankkontona är objekt i ett lokalt övningsprogram, inte användarkonton på Codebean. Double används för att öva objekt och metoder; för exakt decimalaritmetik behövs en genomtänkt penningrepresentation, exempelvis heltalsören eller BigDecimal. Menyn förutsätter giltig taltext.
Nyckelord: Klasser, Objekt
I denna uppgift ska vi skapa två klasser som samverkar tillsammans för att skapa en bank. Vi ska först skapa klassen Account som håller reda på hur mycket pengar som finns på kontot. Klassen innehåller även metoder som är typiska bankkonton så som att se hur mycket pengar som finns på kontot samt ta in och ut pengar från densamma.
Sedan ska vi även skapa klassen Bank som håller reda på alla bankkonton. Klassen Bank ska bland annat kunna öppna nya bankkonton.
I huvudskriptet ska vi sedan skapa banken och sköta logiken över kontona. Utgå från följande program:
public class KlasserObjektUppgift3 {
public static void main(String[] args) {
// Skriv din kod här
}
}
Uppgift a - Skapa ett konto
Skapa klassen Account. Klassen ska ha två instansvariabler:
- Variabeln accountNumber som är av datatypen String och håller namnet på kontot.
- Variabeln value som är av datatypen double och håller i värdet på bankkontot.
Ingen av variablerna ska vara synliga utanför klassen.
Konstruktorn ska tilldela värden till instansvariablerna när den blir anropad.
Denna klass har även fyra metoder.
getAccountNumberär en getter som returnerar namnet på kontot.getValuesom är en getter som returnerar värdet på kontot.withdrawMoneyminskar värdet på kontot med en given summa. Observera att kontot inte kan ha ett negativt värde! Om en användare försöker ta ut mer pengar på kontot än som finns, ska utskriften"Det finns inte tillräckligt med pengar. Försök igen."skrivas ut.dispositMoneysom sätter in pengar på kontot med angiven summa.
Uppgift b - Skapa en bank
Klassen Bank ska hålla två instansvariabler:
- Arraylisten accounts som håller alla bankkonton som har skapats.
- Variabeln
namesom håller namnet på banken.
Ingen av instansvariablerna ska vara synliga utanför klassen.
Konstruktorn ska initiera båda instansvariablerna, dels ge banken ett namn, dels skapa en tom arraylist. Klassen har även 6 stycken metoder:
- Metoden
createNewAccountskapar ett nytt bankkonto och lägger till kontot i accounts. - Metoden
isAccountkollar om en konto med givet namn existerar i accounts och returnerar true om det existerar, annars false. - Gettern
getNameär en metod som returnerar namet på banken. - I metoden
getAccountFromNumberskickar man in ett namn på ett konto och returnerar kontot med samma namn. - I metoden
getValueFromVaultskickar man in ett namn på ett konto och returnerar värdet på kontot med samma namn. - Avslutningsvis,
showAllAccountsskriver ut namnet och värdet på alla konto.
Uppgift c - Skapa huvudklassen
Vi ska nu skapa huvudskriptet som kopplar ihop ovanstående klasser. Programmet ska vid start fråga användaren vilket namn banken ska ha och skapa en instans av klassen bank med samma namn. Programmet ska sedan skriva ut en meny med fem alternativ:
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
När användaren väljer ett alternativ ska motsvarande handling utföras.
Nedan visas en exempelutskrift på hur programmet beter sig beroende på vad användaren skickar in för värden.
Ange namnet på banken:
Codebean Invest AB
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
1
Välj ett nytt namn på bankkontot:
Sparkonto
Bankkontot Sparkonto har skapats!
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
2
Välj konto visa
Sparkonto
Summa på kontot: 0.0
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
3
Välj konto du vill ta ut pengar från
Sparkonto
Ange summan du vill ta ut.
200
Det finns inte tillräckligt med pengar. Försök igen.
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
4
Välj konto du vill sätta in pengar på:
Sparkonto
Ange summan du vill sätta in.
500
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
5
Konto Sparkonto har 500.0 kronor.
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
2
Välj konto visa
Aktiekonto
Kontot existerar inte. Försök igen.
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
1
Välj ett nytt namn på bankkontot:
Aktiekonto
Bankkontot Aktiekonto har skapats!
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
4
Välj konto du vill sätta in pengar på:
Aktiekonto
Ange summan du vill sätta in.
1000
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
5
Konto Sparkonto har 500.0 kronor.
Konto Aktiekonto har 1000.0 kronor.
===========================
Meny: Gör ditt val
1. Skapa nytt konto
2. Visa summa på konto
3. Ta ut pengar från konto
4. Sätt in pengar på konto
5. Visa alla konton
6. Stäng av programmet
===========================
6
Process finished with exit code 0
Svar
Klassen Account:
public class Account {
// Instansvariabler
private String accountNumber;
private double value;
// Konstruktor
Account(String accountNumber){
this.accountNumber = accountNumber;
this.value = 0;
}
// Getters
public String getAccountNumber(){
return this.accountNumber;
}
public double getValue() {
return this.value;
}
// Tar ut pengar från kontot
public void withdrawMoney(double withdraw){
if (!Double.isFinite(withdraw) || withdraw < 0) {
System.out.println("Ogiltigt belopp"); return;
}
if(this.value - withdraw >= 0){
this.value = this.value - withdraw;
}else{
System.out.println("Det finns inte tillräckligt med pengar. Försök igen.");
}
}
// Sätter in pengar på kontot
public void dispositMoney(double value){
if (!Double.isFinite(value) || value < 0 || !Double.isFinite(this.value + value)) {
System.out.println("Ogiltigt belopp"); return;
}
this.value += value;
}
}
Klassen Bank
import java.util.ArrayList;
public class Bank {
// Instansvariabler
private String name;
private ArrayList<Account> accounts;
// Konstruktor
Bank(String name){
this.name = name;
this.accounts = new ArrayList<>();
}
// Skapar ett nytt konto och lägger till i listan
public void createNewAccount(String accountNumber){
Account newAccount = new Account(accountNumber);
accounts.add(newAccount);
}
// Kollar om något konto finns med ett givet kontonummer
public boolean isAccount(String accountNumber){
for(Account ac : accounts) {
if(ac.getAccountNumber().equals(accountNumber)) {
return true;
}
}
return false;
}
// Getters
public String getName(){
return this.name;
}
// Returnerar kontot med ett specifikt banknummer
public Account getAccountFromNumber(String accountNumber){
for(int i = 0; i < accounts.size(); i++){
if(accounts.get(i).getAccountNumber().equals(accountNumber)){
return accounts.get(i);
}
}
return null;
}
// Returnerar summan från ett konto
public double getValueFromVault(String accountNumber){
return getAccountFromNumber(accountNumber).getValue();
}
// Visar och skriver ut alla konton med motsvarande summa
public void showAllAccounts(){
for(Account ac : accounts){
System.out.println("Konto " + ac.getAccountNumber() + " har " + ac.getValue() + " kronor.");
}
}
}
Huvudskriptet:
import java.util.Scanner;
public class KlasserObjektUppgift3 {
public static void main(String[] args) {
// Skapar ett scanner objekt och sparar värdet på banken
Scanner scanner = new Scanner(System.in);
System.out.println("Ange namnet på banken: ");
String input = scanner.nextLine();
String value;
// Skapar en ny instans av klassen Bank
Bank bank = new Bank(input);
// Skriver ut en ny meny och väntar på input från användaren
while(true){
System.out.println("===========================");
System.out.println("Meny: Gör ditt val");
System.out.println("1. Skapa nytt konto");
System.out.println("2. Visa summa på konto");
System.out.println("3. Ta ut pengar från konto");
System.out.println("4. Sätt in pengar på konto");
System.out.println("5. Visa alla konton");
System.out.println("6. Stäng av programmet");
System.out.println("===========================");
input = scanner.nextLine();
// Varje case sats sköter sin del av logiken
switch (input){
case "1":
System.out.println("Välj ett nytt namn på bankkontot:");
input = scanner.nextLine();
bank.createNewAccount(input);
System.out.println("Bankkontot " + input + " har skapats!");
break;
case "2":
System.out.println("Välj konto visa");
input = scanner.nextLine();
if(!bank.isAccount(input)){
System.out.println("Kontot existerar inte. Försök igen.");
}else{
System.out.println("Summa på kontot: " + bank.getValueFromVault(input));
}
break;
case "3":
System.out.println("Välj konto du vill ta ut pengar från");
input = scanner.nextLine();
if(!bank.isAccount(input)){
System.out.println("Kontot existerar inte. Försök igen.");
}else{
System.out.println("Ange summan du vill ta ut.");
value = scanner.nextLine();
bank.getAccountFromNumber(input).withdrawMoney(Double.parseDouble(value));
}
break;
case "4":
System.out.println("Välj konto du vill sätta in pengar på:");
input = scanner.nextLine();
if(!bank.isAccount(input)){
System.out.println("Kontot existerar inte. Försök igen.");
}else{
System.out.println("Ange summan du vill sätta in.");
value = scanner.nextLine();
bank.getAccountFromNumber(input).dispositMoney(Double.parseDouble(value));
}
break;
case "5":
bank.showAllAccounts();
break;
case "6":
System.exit(0);
break;
default:
break;
}
}
}
}
Förklaring:
Klassen Account har två instansvariabler, namnet på kontot samt en värdet som kontot har. Den har även två getters som returnerar motsvarande instansvariabler. Klassen har även två metoder där den ena tar ut pengar och den andra sätter in pengar.
Klassen Bank har också två instansvariabler, namnet på banken, samt en ArrayList som håller i alla objekt av typen Account som har blivit skapade i banken. Eftersom alla konton ligger i en lista behöver vi loopa igenom listan för att hitta det specifika kontot vi letar efter. Ett alternativ till en ArrayList skulle såklart kunna vara att istället använda en HashTable där nyckeln motsvarar namnet på kontot för att enkelt hitta kontot vi letar efter. Metoderna i Bank kan alltså i sin tur anropa metoder i Account där varje account är isolerat från varandra.
I huvudklassen skapar vi en switch-sats där vi för varje alternativ som användaren väljer, kör en metod från bank-klassen. Här lägger vi även till logiken för att kolla om kontot existerar eller inte.