版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第C#實現(xiàn)模擬ATM自動取款機功能目錄(1)關(guān)于用戶帳號的類:Account(2)關(guān)于銀行數(shù)據(jù)庫的類:BankDatabase(3)關(guān)于ATM屏幕顯示的類:Screen(4)關(guān)于ATM鍵盤的類:Keypad(5)關(guān)于進(jìn)鈔、出鈔口的類:DepositSlot(6)關(guān)于ATM出錢的類:CashDispendser(7)關(guān)于事務(wù)的基類:Transaction(8)關(guān)于查詢的事務(wù)類:BalanceInquiry(9)關(guān)于取款的事務(wù)類:Withdrawl(10)關(guān)于存款的事務(wù)類:Deposit(11)關(guān)于ATM本身的類:ATM(12)運行本篇用C#實現(xiàn)ATM自動取款機的一些功能。面臨的第一個問題是:如何把與自動取款機相關(guān)的有形的、無形的方面抽象出來。
(1)關(guān)于用戶帳號的類:Account
該類包含與卡號、密碼、可用余額、總余額相關(guān)的字段和屬性,比提供了存款和取款的方法。
namespaceMyATM
///summary
///用戶帳號
////summary
publicclassAccount
privateintaccountNumber;//卡號
privateintpin;//用來驗證
privatedecimalavailableBalance;//可用余額
privatedecimaltotalBalance;//總余額
publicAccount(inttheAccountNumber,intthePIN,decimaltheAvailableBalance,decimaltheTotalBalance)
accountNumber=theAccountNumber;
pin=thePIN;
availableBalance=theAvailableBalance;
totalBalance=theTotalBalance;
//卡號只讀屬性
publicintAccountNumber
get{returnaccountNumber;}
//可提取余額只讀屬性
publicdecimalAvailableBalance
get{returnavailableBalance;}
//總余額只讀屬性
publicdecimalTotalBalance
get{returntotalBalance;}
//驗證輸入密碼是否正確
publicboolValidatePIN(intuserPIN)
return(userPIN==pin);
//存款
publicvoidCredit(decimalamount)
totalBalance+=amount;
//取款
publicvoidDebit(decimalamount)
availableBalance-=amount;
totalBalance-=amount;
}
(2)關(guān)于銀行數(shù)據(jù)庫的類:BankDatabase
該類維護(hù)著一個Account類型的數(shù)組,并提供驗證用戶,查詢余額,存款、取款等方法。
namespaceMyATM
///summary
///銀行數(shù)據(jù)庫
////summary
publicclassBankDatabase
privateAccount[]accounts;
publicBankDatabase()
accounts=newAccount[2];
accounts[0]=newAccount(12345,54321,1000.00M,1200.00M);
accounts[1]=newAccount(98765,56789,200.00M,200.00M);
//根據(jù)用戶銀行卡號獲取該用戶帳號
privateAccountGetAccount(intaccountNumber)
foreach(AccountcurrentAccountinaccounts)
if(currentAccount.AccountNumber==accountNumber)
returncurrentAccount;
returnnull;
//驗證用戶,根據(jù)卡號和密碼
publicboolAuthenticateUser(intuserAccountNumber,intuserPIN)
//先根據(jù)卡號獲取帳號
AccountuserAccount=GetAccount(userAccountNumber);
if(userAccount!=null)
returnuserAccount.ValidatePIN(userPIN);
else
returnfalse;
//返回可提取的余額,根據(jù)卡號
publicdecimalGetAvailableBalance(intuserAccountNumber)
AccountuserAccount=GetAccount(userAccountNumber);
returnuserAccount.AvailableBalance;
//返回所有余額
publicdecimalGetTotalBalance(intuserAccountNumber)
AccountuserAccount=GetAccount(userAccountNumber);
returnuserAccount.TotalBalance;
//給用戶存款
publicvoidCredit(intuserAccountNumber,decimalamount)
AccountuserAccount=GetAccount(userAccountNumber);
userAccount.Credit(amount);
//給用戶取款
publicvoidDebit(intuserAccountNumber,decimalamount)
AccountuserAccount=GetAccount(userAccountNumber);
userAccount.Debit(amount);
}
(3)關(guān)于ATM屏幕顯示的類:Screen
該類提供了分行顯示、不分行顯示、顯示金額這3個方法。
usingSystem;
namespaceMyATM
///summary
///屏幕
////summary
publicclassScreen
//顯示不分行的信息
publicvoidDisplayMessage(stringmessage)
Console.Write(message);
//顯示分行的信息
publicvoidDisplayMessageLine(stringmessage)
Console.WriteLine(message);
//顯示金額
publicvoidDisplayDollarAmmount(decimalamount)
Console.Write("{0:c}",amount);
}
(4)關(guān)于ATM鍵盤的類:Keypad
該類的職責(zé)很明確,就是把輸入的數(shù)字返回。
usingSystem;
namespaceMyATM
///summary
///輸入鍵盤
////summary
publicclassKeypad
//根據(jù)用戶輸入,返回一個整型
publicintGetInput()
returnConvert.ToInt32(Console.ReadLine());
}
(5)關(guān)于進(jìn)鈔、出鈔口的類:DepositSlot
該類主要是確認(rèn)進(jìn)鈔、出鈔口是否收到錢,默認(rèn)返回true。
namespaceMyATM
///summary
///存款槽
////summary
publicclassDepositSlot
//判斷是否收到錢
publicboolIsMoneyReceived()
returntrue;
}
(6)關(guān)于ATM出錢的類:CashDispendser
就像在現(xiàn)實生活中,ATM中肯定會預(yù)先存放一些人民幣,出錢的時候首先要判斷余額是否足夠,如果足夠就把ATM中當(dāng)前的票數(shù)做適當(dāng)?shù)臏p法。
namespaceMyATM
///summary
///ATM取款
////summary
publicclassCashDispendser
privateconstintINITIAL_COUNT=500;//初始票數(shù)
privateintbillCount;//當(dāng)前取款機內(nèi)票數(shù)
publicCashDispendser()
billCount=INITIAL_COUNT;
//出錢
publicvoidDispenseCash(decimalamount)
intbillsRequired=((int)amount)/20;
billCount-=billsRequired;
//判斷是否有余額
publicboolIsSufficientCashAvailable(decimalamount)
//假設(shè)取款機內(nèi)鈔票的面值是20
intbillsRequired=((int)amount)/20;
return(billCount=billsRequired);
}
(7)關(guān)于事務(wù)的基類:Transaction
我們可以回想一下,現(xiàn)實生活中,ATM的主要功能包括:查詢余額,取款,存款等。雖然執(zhí)行的過程不盡相同,但所有的這些事務(wù)包含相同的部分:比如說,必須有屏幕必須針對卡號一定和數(shù)據(jù)庫打交道,等等。于是,我們先抽象出一個有關(guān)事務(wù)的基類,這個基類是不需要被實例化的,所以把它定義成抽象類。如下:
namespaceMyATM
///summary
///ATM事務(wù)
////summary
publicabstractclassTransaction
privateintaccountNumber;//卡號
privateScreenuserScreen;//屏幕
privateBankDatabasedatabase;//銀行數(shù)據(jù)庫
publicTransaction(intuserAccount,ScreentheScreen,BankDatabasetheDatabase)
accountNumber=userAccount;
userScreen=theScreen;
database=theDatabase;
//銀行卡號屬性只讀
publicintAccountNumber
get{returnaccountNumber;}
//用戶使用的屏幕屬性只讀
publicScreenUserScreen
get{returnuserScreen;}
//用戶使用的數(shù)據(jù)庫只讀
publicBankDatabaseDatabase
get{returndatabase;}
//抽象方法子類必須重寫
publicabstractvoidExecute();
}
以上,在其它有關(guān)事務(wù)的派生類中都可以訪問到基類的只讀屬性,并且子類必須重寫抽象基類的Execute方法。
(8)關(guān)于查詢的事務(wù)類:BalanceInquiry
該類調(diào)用Database類的方法查詢可用余額和總余額。
namespaceMyATM
///summary
///ATM余額查詢事務(wù)
////summary
publicclassBalanceInquiry:Transaction
publicBalanceInquiry(intuserAccountNumber,ScreenatmScreen,BankDatabaseatmBankDatabase):base(userAccountNumber,atmScreen,atmBankDatabase){}
publicoverridevoidExecute()
//獲取可用余額
decimalavailableBalance=Database.GetAvailableBalance(AccountNumber);
//獲取總余額
decimaltotalBalance=Database.GetTotalBalance(AccountNumber);
//打印信息
UserScreen.DisplayMessageLine("\n余額信息為:");
UserScreen.DisplayMessage("-可用余額為:");
UserScreen.DisplayDollarAmmount(availableBalance);
UserScreen.DisplayMessage("\n-總余額為:");
UserScreen.DisplayDollarAmmount(totalBalance);
UserScreen.DisplayMessageLine("");
}
(9)關(guān)于取款的事務(wù)類:Withdrawl
當(dāng)用戶輸入取款的金額,該類必須要做的事情是:在用戶的銀行數(shù)據(jù)庫中和ATM上做相應(yīng)的減法,還必須考慮什么時候退出循環(huán),用戶是否按了取消鍵,用戶賬戶上是否有余額,以及ATM中是否有余額。
namespaceMyATM
///summary
///ATM取款事務(wù)
////summary
publicclassWithdrawl:Transaction
privatedecimalamount;//取款金額
privateKeypadkeypad;//鍵盤
privateCashDispendsercashDispenser;//出錢
privateconstintCANCELED=6;//對應(yīng)菜單中的取消
publicWithdrawl(intuserAccountNumber,ScreenatmScreen,BankDatabaseatmBankDatabase,KeypadatmKeypad,
CashDispendseratmCashDispenser):base(userAccountNumber,atmScreen,atmBankDatabase)
keypad=atmKeypad;
cashDispenser=atmCashDispenser;
publicoverridevoidExecute()
boolcashDispensed=false;//表示還沒出錢
booltransactionCanceled=false;//表示不取消事務(wù)
intselection=DisplayMenuOfAmounts();
if(selection!=CANCELED)//如果用戶沒有按取消
amount=selection;//確定取款金額
//根據(jù)卡號獲取可用余額
decimalavailableBalance=Database.GetAvailableBalance(AccountNumber);
if(amount=availableBalance)//如果取款金額小于可用余額
if(cashDispenser.IsSufficientCashAvailable(amount))//如果ATM余額足夠
Database.Debit(AccountNumber,amount);//賬戶扣款
cashDispenser.DispenseCash(amount);//ATM扣款
cashDispensed=true;//跳出循環(huán)
UserScreen.DisplayMessageLine("\n您可以拿著錢離開了~~");
else//如果ATM余額不夠
UserScreen.DisplayMessageLine("\nATM余額不足."+"\n\n請?zhí)崛「〉慕痤~~~");
else
UserScreen.DisplayMessageLine("\n賬戶余額不足."+"\n\n請?zhí)崛「〉慕痤~~~");
else//如果用戶按了取消,提示正在退出并跳出循環(huán)
UserScreen.DisplayMessageLine("\n正在取消......");
transactionCanceled=true;
}while((!cashDispensed)(!transactionCanceled));
///summary
///顯示提款金額
////summary
///returns/returns
privateintDisplayMenuOfAmounts()
intuserChoice=0;//默認(rèn)提款金額
int[]amounts={0,20,40,60,100,200};
while(userChoice==0)
//顯示菜單
UserScreen.DisplayMessageLine("\nWithdrawaloptions:");
UserScreen.DisplayMessageLine("1-20元");
UserScreen.DisplayMessageLine("2-40元");
UserScreen.DisplayMessageLine("3-60元");
UserScreen.DisplayMessageLine("4-100元");
UserScreen.DisplayMessageLine("5-200元");
UserScreen.DisplayMessageLine("6-取消操作");
UserScreen.DisplayMessage("\n輸入數(shù)字(1-6),選擇選項:");
intinput=keypad.GetInput();
switch(input)
case1:case2:case3:case4:case5:
userChoice=amounts[input];
break;
caseCANCELED:
userChoice=CANCELED;
break;
default:
UserScreen.DisplayMessageLine("\n輸入無效數(shù),請重試~~");
break;
returnuserChoice;
}
以上,
維護(hù)的amount變量表示的是取款金額,在每次用戶輸入提款金額后為該變量賦值。
Keypad類型的變量kepad和CashDispendser類型的變量cashDispenser需要在構(gòu)造函數(shù)中為其賦初值,而這2個因素是在取款時特有的,在事務(wù)的抽象基類中不需要考慮這2個因素。
通過DisplayMenuOfAmounts方法,會向用戶顯示一些面值,以及對應(yīng)的數(shù)字鍵,然后根據(jù)用戶按下的數(shù)字鍵返回對應(yīng)的、int類型的面值。
在Execute方法中,首先循環(huán)的2個條件是用戶沒有按取消鍵和還沒出錢的時候。然后把DisplayMenuOfAmounts方法的返回值賦值給表示取款金額的amount變量,據(jù)此判斷用戶賬戶的余額是否足夠,判斷ATM的余額是否足夠,最后在用戶賬戶和ATM中分別扣款。這期間,如果用戶按了取消鍵,就把表示取消事務(wù)的變量transactionCanceled設(shè)置為true以跳出循環(huán),完成扣款后把表示扣款完成的變量cashDispensed設(shè)置為true以跳出循環(huán)。
(10)關(guān)于存款的事務(wù)類:Deposit
該類最終是使用Database屬性把用戶輸入的金額保存到用戶賬戶上。另外需要考慮的是:用戶在存款的時候是否按了取消鍵。
namespaceMyATM
///summary
///ATM存款事務(wù)
////summary
publicclassDeposit:Transaction
privatedecimalamount;
privateKeypadkeypad;
privateDepositSlotdepositSlot;
privateconstintCANCELED=0;
publicDeposit(intuserAccountNumber,ScreenatmScreen,BankDatabaseatmBankDatabase,KeypadatmKeypad,
DepositSlotatmDepositSlot):base(userAccountNumber,atmScreen,atmBankDatabase)
keypad=atmKeypad;
depositSlot=atmDepositSlot;
publicoverridevoidExecute()
//確定存款金額
amount=PromptForDepositAmount();
if(amount!=CANCELED)
UserScreen.DisplayMessage("\n請輸入的存款金額為"+amount);
//確認(rèn)是否收到錢
boolisReceived=depositSlot.IsMoneyReceived();
if(isReceived)
UserScreen.DisplayMessageLine("\n存款成功~~");
Database.Credit(AccountNumber,amount);//存款到賬戶
else
UserScreen.DisplayMessageLine("\n存款時發(fā)生錯誤~~");
else
UserScreen.DisplayMessageLine("\n正在取消交易......");
///summary
///顯示存款金額
////summary
///returns/returns
privatedecimalPromptForDepositAmount()
UserScreen.DisplayMessage("\n請輸入存款金額(輸入0退出)");
intinput=keypad.GetInput();
if(input==CANCELED)
returnCANCELED;
else
returninput;
}
以上,
私有方法PromptForDepositAmount用來返回用戶輸入的金額,如果用戶按取消鍵,就返回0。
(11)關(guān)于ATM本身的類:ATM
該類主要是提供給外部一個方法用來運行。
namespaceMyATM
publicclassATM
privatebooluserAuthenticated;//表示用戶是否驗證通過
privateintcurrentAccountNumber;//當(dāng)前交易的銀行卡號
privateScreenscreen;//屏幕
privateKeypadkeypad;//鍵盤
privateCashDispendsercashDispendser;//出款
privateDepositSlotdepositSlot;//存款
privateBankDatabasebankDatabase;//數(shù)據(jù)庫
//菜單選項枚舉
privateenumMenuOption
BANLANCE_INQUIRY=1,//余額查詢
WITHDRAWAL=2,//取款
DEPOSIT=3,//存款
EXIT_ATM=4//退出
publicATM()
userAuthenticated=false;//默認(rèn)驗證不通過
currentAccountNumber=0;//默認(rèn)卡號
screen=newScreen();//默認(rèn)屏幕
keypad=newKeypad();//默認(rèn)鍵盤
cashDispendser=newCashDispendser();//默認(rèn)出款幫助類
bankDatabase=newBankDatabase();//默認(rèn)銀行數(shù)據(jù)庫
depositSlot=newDepositSlot();//默認(rèn)存款幫助類
//運行
publicvoidRun()
while(true)
while(!userAuthenticated)//如果用戶沒有驗證通過,就一直循環(huán)
screen.DisplayMessageLine("\n歡迎");
AuthenticateUser();
PerormTransactions();
//重新設(shè)置一些參數(shù)
userAuthenticated=false;
currentAccountNumber=0;
screen.DisplayMessageLine("\n謝謝,再見~~");
//驗證用戶
privatevoidAuthenticateUser()
screen.DisplayMessage("\n請輸入卡號");
intaccountNumber=keypad.GetInput();
screen.DisplayMessage("\n輸入密碼");
intpin=keypad.GetInput();
userAuthenticated=bankDatabase.AuthenticateUser(accountNumber,pin);
if(userAuthenticated)
currentAccountNumber=accountNumber;//保存當(dāng)前的用戶卡號
else
screen.DisplayMessageLine("無效的卡號或密碼,請重試~~");
//執(zhí)行交易
privatevoidPerormTransactions()
TransactioncurrenTransaction;
booluserExited=false;//用戶還沒選擇退出
while(!userExited)
//確定選擇的具體事務(wù)
intmainMenuSelction=DisplayMainMenu();
switch((MenuOption)mainMenuSelction)
caseMenuOption.BANLANCE_INQUIRY:
caseMenuOption.WITHDRAWAL:
caseMenuOption.DEPOSIT:
currenTransaction=CreateTransaction(mainMenuSelction);
currenTransaction.Execute();
break;
caseMenuOption.EXIT_ATM:
screen.DisplayMessageLine("\n正在退出系統(tǒng)......");
userExited=true;//退出循環(huán)
break;
default:
screen.DisplayMessageLine("\n無效選項,請重新選擇~~");
break;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026江蘇省常州市體育運動學(xué)校招聘排球教練1人備考題庫及一套完整答案詳解
- 江蘇省東臺市三倉中學(xué)2026屆高一上數(shù)學(xué)期末質(zhì)量跟蹤監(jiān)視模擬試題含解析
- 罕見腫瘤的個體化治療治療策略優(yōu)化經(jīng)驗與案例
- 罕見腫瘤的個體化治療療效預(yù)測模型構(gòu)建與個體化路徑
- 2025貴州興義市人民醫(yī)院引進(jìn)高層次、急需緊缺人才100人備考題庫及一套答案詳解
- 電商會計財務(wù)制度
- 生產(chǎn)經(jīng)營類企業(yè)財務(wù)制度
- 石油公司財務(wù)制度
- 2026江蘇南京大學(xué)招聘備考題庫XZ2025-428醫(yī)學(xué)院專業(yè)、技術(shù)人員備考題庫有完整答案詳解
- 學(xué)校社團(tuán)章程財務(wù)制度
- 途虎養(yǎng)車安全培訓(xùn)課件
- 衛(wèi)生管理研究論文
- 2025-2026學(xué)年人教版(新教材)小學(xué)數(shù)學(xué)二年級下冊(全冊)教學(xué)設(shè)計(附教材目錄P161)
- 委托市場調(diào)研合同范本
- 畜牧安全培訓(xùn)資料課件
- 2025年度黨支部書記述職報告
- 2026四川省引大濟岷水資源開發(fā)限公司公開招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 2026年安徽糧食工程職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性考試備考試題及答案詳解
- 內(nèi)科學(xué)總論小兒遺傳代謝病課件
- 雨課堂學(xué)堂在線學(xué)堂云《中國電影經(jīng)典影片鑒賞(北京師范大學(xué))》單元測試考核答案
- 核電站防地震應(yīng)急方案
評論
0/150
提交評論