Скачать презентацию Automated Teller Machine — ATM Lars Schelde Скачать презентацию Automated Teller Machine — ATM Lars Schelde

b1abed863bf15806077ccc3006736ee9.ppt

  • Количество слайдов: 22

Automated Teller Machine - (ATM ) Lars Schelde Jens S. Olsen Automated Teller Machine - (ATM ) Lars Schelde Jens S. Olsen

Agenda o o o Funktioner Krav Klassediagram Implementering Test Agenda o o o Funktioner Krav Klassediagram Implementering Test

Funktioner o o o o Konto administration Indsæt penge Hæve penge Kontrol af korrekt Funktioner o o o o Konto administration Indsæt penge Hæve penge Kontrol af korrekt opgørelse I relation til seddel nomination. Saldo kontrol Registrering af bevægelser Overflytte penge til en anden konto

Kravene til programmet (1): o o R 1: En konto består af et navn, Kravene til programmet (1): o o R 1: En konto består af et navn, et konto nr. , en saldo, et overtræks-beløb, en PIN-kode, antal forsøg siden sidste rigtige PIN-kode og om kontoen er spærret. R 2: En konto bliver spærret efter 3 på hinanden følgende fejlindtastninger af PIN-koden. R 3: Administratoren (bankrådgiveren) kan oprette en konto, bevilge et overtræk, ændre størrelsen af et overtræk og ophæve bevillingen af et overtræk. Endvidere kan administratoren spærre og genåbne en konto. R 4: Der kan indsættes penge på en konto, beløb svarende til en sum af de danske pengesedler. n o Hvis ikke beløbet svarer til en sum af de danske pengesedler, er der kommet falske penge i automaten, og kontoen spærres. R 5: Der kan udbetales et beløb i sedler fra en konto, såfremt der er kontoens saldo + evt. bevilget overtræk er større end det beløb der ønskes hævet og kontoens saldo vil blive nedskrevet med det udbetalte beløb. n n Hvis det ønskede beløb ikke kan udbetales, grundet beløbet ikke er delelig med de danske pengesedler, afrundes der nedad til nærmeste mulige beløb der kan udbetales med de danske pengesedler. Hvis der ikke kan udbetales penge grundet manglende, udskrives der en besked til brugeren om at kontakte bankrådgiveren med henblik på at få ændret eller oprettet muligheden for overtræk.

Kravene til programmet (2): o R 6: Der kan overføres et beløb fra en Kravene til programmet (2): o R 6: Der kan overføres et beløb fra en konto til en anden, såfremt kontoens saldo + evt. bevilget overtræk er større end det beløb der ønskes overflyttet og kontoens saldo vil herefter blive nedskrevet med det udbetalte beløb. o R 7: For hver transaktion der laves, registreres datoen, typen af transaktionen n o Ved udbetaling registreres endvidere beløbet samt saldoen Ved kontooverførsel registreres endvidere beløbet samt saldoen Ved oprettelse/ændring/ophævelse af overtræksbevillingen endvidere størrelsen på den nye overtræksbevilling R 8: Der kan laves et kontoudtog, hvor alle transaktionerne vises.

2 1 3 2 1 3

Date Transaction Cash Account. DB Environment ATM System World Bank Account Date Transaction Cash Account. DB Environment ATM System World Bank Account

Implementering (1) o R 1: (konto-data) implementeres i klasserne: o Bank. Account n name Implementering (1) o R 1: (konto-data) implementeres i klasserne: o Bank. Account n name : Bank. Account. Name. Type number : Bank. Account. Type isopen : bool Cash. Account o n n balance: Bank. Account`Bank. Account. Money. Type creditlimit: Bank. Account`Bank. Account. Money. Type pincode: Bank. Account`Bank. Account. Pincode. Type pincodeerrorcount: nat

Implementering (2) o R 2: (Spærring af konto, 3 pinkode fejl)implementeres i klassen: o Implementering (2) o R 2: (Spærring af konto, 3 pinkode fejl)implementeres i klassen: o Account. DB n n public Request. Check. Pin : Bank. Account`Bank. Account. Type * Bank. Account`Bank. Account. Pincode. Type ==> bool. Request. Check. Pin(accnum, pincode) == ( o if accounts(accnum). Is. Pin(pincode) then ( transactioncode : = ; accounts(accnum). Add. Transaction(transactioncode); return true; ); ) transactioncode : = ; accounts(accnum). Add. Transaction(transactioncode); if accounts(accnum). get. Pin. Error. Count() = 3 then ( accounts(accnum). set. Is. Open(false); transactioncode : = ; accounts(accnum). Add. Transaction(transactioncode); ); return false; ) pre accnum in set dom accounts;

Implementering (3) o R 3: (Administrator rettigheder)implementeres i klasserne: o ATM o instance variables Implementering (3) o R 3: (Administrator rettigheder)implementeres i klasserne: o ATM o instance variables isadministrator: bool pre isadministrator = true o o Metoder: Admin. Create. Account, Admin. Set. Limit, Admin. Open. Account, Admin. Close. Account o Account. DB o public Create. Account: Bank. Account`Bank. Account. Name. Type * Bank. Account`Bank. Account. Pincode. Type ==> () Create. Account(name, pin) == ( transactioncode : = ; accounts : = accounts ++ { nextaccountid |-> new Cash. Account(name, nextaccountid, pin, transactioncode) }; nextaccountid : = nextaccountid + 1; );

Implementering (4) o R 4: (Indsæt penge) implementeres i klassen: o Account. DB o Implementering (4) o R 4: (Indsæt penge) implementeres i klassen: o Account. DB o instance variables bills: seq of Bank. Account`Bank. Account. Money. Type : = [1000, 500, 200, 100, 50]; o Amount. Legal: Bank. Account`Bank. Account. Money. Type ==> Bank. Account`Bank. Account. Money. Type Amount. Legal(amt) == return amt - amt mod bills(len bills) pre amt >= 0; o Amount. Is. Legal. Check: Bank. Account`Bank. Account. Money. Type ==> bool Amount. Is. Legal. Check(amt) == return (amt = amt - amt mod bills(len bills)) pre amt >= 0;

Implementering (5) o R 5: (Hæve/Sætte ind) + R 6: (Flytte til konto)implementeres i Implementering (5) o R 5: (Hæve/Sætte ind) + R 6: (Flytte til konto)implementeres i klasserne: o Account. DB o public Request. Transfer. Accounts : Bank. Account`Bank. Account. Type * Bank. Account`Bank. Account. Money. Type ==> bool Request. Transfer. Accounts (sourceaccnum, targetaccnum, amt) ==( if(not accounts(sourceaccnum). get. Is. Open()) then ( transactioncode : = ; accounts(sourceaccnum). Add. Transaction(amt, transactioncode); return false ); if(not accounts(sourceaccnum). Request. Withdrawal(amt)) then ( transactioncode : = ; accounts(sourceaccnum). Add. Transaction(targetaccnum, amt, transactioncode); return false );

Implementering (6) o R 5: (Hæve/Sætte ind) + R 6: (Flytte til konto)implementeres i Implementering (6) o R 5: (Hæve/Sætte ind) + R 6: (Flytte til konto)implementeres i klasserne: o Account. DB o Withdraw(sourceaccnum, amt); transactioncode : = ; accounts(sourceaccnum). Add. Transaction(targetaccnum, amt, transactioncode); Deposit(targetaccnum, amt); transactioncode : = ; accounts(targetaccnum). Add. Transaction(sourceaccnum, amt, transactioncode); return true ) pre sourceaccnum in set dom accounts and targetaccnum in set dom accounts and amt >= 0;

Implementering (7) o R 5: (Hæve/Sætte ind) + R 6: (Flytte til konto)implementeres i Implementering (7) o R 5: (Hæve/Sætte ind) + R 6: (Flytte til konto)implementeres i klasserne: o Cash. Account o public Request. Withdrawal : Bank. Account`Bank. Account. Money. Type ==> bool Request. Withdrawal (amt) == return (balance + creditlimit > amt) pre get. Is. Open();

Implementering (8) o R 7: (transaktionslog) implementeres i klasserne: o Transaction o types public Implementering (8) o R 7: (transaktionslog) implementeres i klasserne: o Transaction o types public Code = | | | | | | | | | | | | | | | ; public Transaction. Type = nat; instance variables balance: Bank. Account`Bank. Account. Money. Type : = 0; creditlimit: Bank. Account`Bank. Account. Money. Type : = 0; amount: Bank. Account`Bank. Account. Money. Type : = 0; accnumother : [Bank. Account`Bank. Account. Type] ; name : Bank. Account`Bank. Account. Name. Type; accnumber : Bank. Account`Bank. Account. Type; isopen : bool; transactiontype: Code; -- system call to date. . . ? ? now: Date : = new Date(26, 2, 2009);

Test o Vi har endnu ikke fået VDM++ testene til at køre automatisk, men Test o Vi har endnu ikke fået VDM++ testene til at køre automatisk, men i ”Intepreteren” o Initializing specification. . . done >> create t: = new Test 1() >> print t. Run() 0 >> print t. atm. database o o o

Test 1 o o o o o class Test 1 instance variables public atm: Test 1 o o o o o class Test 1 instance variables public atm: ATM : = new ATM(); i: nat 1 : = 1; operations public Run: () ==> nat Run() == ( -- 1 administrator login if not atm. Login(1, 0) then return i; o i : = 2; -- 2 adduser Lars, pincode 1234 then return i; if not atm. Admin. Create. Account("Lars", 1234) then return i; o o . . . i : = 23; --23 logout if not atm. Logout() then return i; o o return 0

Test 2, Print af transaktioner o o o o Initializing specification. . . done Test 2, Print af transaktioner o o o o Initializing specification. . . done >> create t: = new Test 1() >> print t. Run() 0 Construct is fully evaluated >> print t. atm. database objref 24(Account. DB): < Account. DB`accounts = { 1 |-> objref 25(Cash. Account): < Bank. Account`isopen = true, Bank. Account`name = "Administrator", Bank. Account`number = 1, Cash. Account`balance = 0, … 2 |-> objref 58(Transaction): < Transaction`accnumber = <>, Transaction`accnumother = 2, Transaction`amount = 550, Transaction`balance = 550, Transaction`creditlimit = 0, Transaction`isopen = true, Transaction`name = "Lars", Transaction`now = objref 59, Transaction`transactiontype = >

Test 3, Print af transaktioner o 4 |-> o objref 74(Transaction): < Transaction`accnumber = Test 3, Print af transaktioner o 4 |-> o objref 74(Transaction): < Transaction`accnumber = 3, Transaction`accnumother = 2, Transaction`amount = 33, Transaction`balance = 467, Transaction`creditlimit = 0, Transaction`isopen = true, Transaction`name = "Jens", Transaction`now = objref 75, Transaction`transactiontype = > o o o o o 4 |-> objref 80(Transaction): < Transaction`accnumber = 2, Transaction`accnumother = 3, Transaction`amount = 33, Transaction`balance = 583, Transaction`creditlimit = 0, Transaction`isopen = false, Transaction`name = "Lars", Transaction`now = objref 81, Transaction`transactiontype = >

Test 4, Print af transaktioner o o o 6 |-> objref 92(Transaction): < Transaction`accnumber Test 4, Print af transaktioner o o o 6 |-> objref 92(Transaction): < Transaction`accnumber = 3, Transaction`accnumother = <>, Transaction`amount = 0, Transaction`balance = 467, Transaction`creditlimit = 0, Transaction`isopen = true, Transaction`name = "Jens", Transaction`now = objref 93, Transaction`transactiontype = > 9 |-> objref 110(Transaction): < Transaction`accnumber = 3, Transaction`accnumother = <>, Transaction`amount = 0, Transaction`balance = 467, Transaction`creditlimit = 0, Transaction`isopen = false, Transaction`name = "Jens", Transaction`now = objref 111, Transaction`transactiontype = >

Test 5, Print af transaktioner 10 |-> o objref 122(Transaction): < Transaction`accnumber = 3, Test 5, Print af transaktioner 10 |-> o objref 122(Transaction): < Transaction`accnumber = 3, Transaction`accnumother = <>, Transaction`amount = 0, Transaction`balance = 467, Transaction`creditlimit = 0, Transaction`isopen = true, Transaction`name = "Jens", Transaction`now = objref 123, Transaction`transactiontype = > , 3 |-> o objref 50(Transaction): < Transaction`accnumber = 2, Transaction`accnumother = <>, Transaction`amount = 55, Transaction`balance = 550, Transaction`creditlimit = 0, Transaction`isopen = false, Transaction`name = "Lars", Transaction`now = objref 51, Transaction`transactiontype = > o o o o o