C#实现ATM自动取款机 您所在的位置:网站首页 atm机界面怎么输入x C#实现ATM自动取款机

C#实现ATM自动取款机

2024-04-24 14:07| 来源: 网络整理| 查看: 265

本篇用C#实现ATM自动取款机的一些功能。面临的第一个问题是:如何把与自动取款机相关的有形的、无形的方面抽象出来。大致如下:

 

(1)关于用户帐号的类:Account(2)关于银行数据库的类:BankDatabase(3)关于ATM屏幕显示的类:Screen(4)关于ATM键盘的类:Keypad(5)关于进钞、出钞口的类:DepositSlot(6)关于ATM出钱的类:CashDispendser(7)关于事务的基类:Transaction(8)关于查询的事务类:BalanceInquiry(9)关于取款的事务类:Withdrawl(10)关于存款的事务类:Deposit(11)关于ATM本身的类:ATM(12)运行

 

(1)关于用户帐号的类:Account

该类包含与卡号、密码、可用余额、总余额相关的字段和属性,比提供了存款和取款的方法。

namespace MyATM { /// /// 用户帐号 /// public class Account { private int accountNumber; //卡号 private int pin;//用来验证 private decimal availableBalance;//可用余额 private decimal totalBalance;//总余额 public Account(int theAccountNumber, int thePIN, decimal theAvailableBalance, decimal theTotalBalance) { accountNumber = theAccountNumber; pin = thePIN; availableBalance = theAvailableBalance; totalBalance = theTotalBalance; } //卡号 只读属性 public int AccountNumber { get { return accountNumber; } } //可提取余额 只读属性 public decimal AvailableBalance { get { return availableBalance; } } //总余额 只读属性 public decimal TotalBalance { get { return totalBalance; } } //验证输入密码是否正确 public bool ValidatePIN(int userPIN) { return (userPIN == pin); } //存款 public void Credit(decimal amount) { totalBalance += amount; } //取款 public void Debit(decimal amount) { availableBalance -= amount; totalBalance -= amount; } } }

 

(2)关于银行数据库的类:BankDatabase

该类维护着一个Account类型的数组,并提供验证用户,查询余额,存款、取款等方法。

namespace MyATM { /// /// 银行数据库 /// public class BankDatabase { private Account[] accounts; public BankDatabase() { accounts = new Account[2]; accounts[0] = new Account(12345,54321,1000.00M, 1200.00M); accounts[1] = new Account(98765, 56789, 200.00M, 200.00M); } //根据用户银行卡号获取该用户帐号 private Account GetAccount(int accountNumber) { foreach (Account currentAccount in accounts) { if (currentAccount.AccountNumber == accountNumber) { return currentAccount; } } return null; } //验证用户,根据卡号和密码 public bool AuthenticateUser(int userAccountNumber, int userPIN) { //先根据卡号获取帐号 Account userAccount = GetAccount(userAccountNumber); if (userAccount != null) { return userAccount.ValidatePIN(userPIN); } else { return false; } } //返回可提取的余额,根据卡号 public decimal GetAvailableBalance(int userAccountNumber) { Account userAccount = GetAccount(userAccountNumber); return userAccount.AvailableBalance; } //返回所有余额 public decimal GetTotalBalance(int userAccountNumber) { Account userAccount = GetAccount(userAccountNumber); return userAccount.TotalBalance; } //给用户存款 public void Credit(int userAccountNumber, decimal amount) { Account userAccount = GetAccount(userAccountNumber); userAccount.Credit(amount); } //给用户取款 public void Debit(int userAccountNumber, decimal amount) { Account userAccount = GetAccount(userAccountNumber); userAccount.Debit(amount); } } }

 

(3)关于ATM屏幕显示的类:Screen

该类提供了分行显示、不分行显示、显示金额这3个方法。

using System; namespace MyATM { /// /// 屏幕 /// public class Screen { //显示不分行的信息 public void DisplayMessage(string message) { Console.Write(message); } //显示分行的信息 public void DisplayMessageLine(string message) { Console.WriteLine(message); } //显示金额 public void DisplayDollarAmmount(decimal amount) { Console.Write("{0:c}", amount); } } }

 

(4)关于ATM键盘的类:Keypad

该类的职责很明确,就是把输入的数字返回。

using System; namespace MyATM { /// /// 输入键盘 /// public class Keypad { //根据用户输入,返回一个整型 public int GetInput() { return Convert.ToInt32(Console.ReadLine()); } } }

 

(5)关于进钞、出钞口的类:DepositSlot

该类主要是确认进钞、出钞口是否收到钱,默认返回true。

namespace MyATM { /// /// 存款槽 /// public class DepositSlot { //判断是否收到钱 public bool IsMoneyReceived() { return true; } } }

 

(6)关于ATM出钱的类:CashDispendser就像在现实生活中,ATM中肯定会预先存放一些人民币,出钱的时候首先要判断余额是否足够,如果足够就把ATM中当前的票数做适当的减法。

namespace MyATM { /// /// ATM取款 /// public class CashDispendser { private const int INITIAL_COUNT = 500;//初始票数 private int billCount;//当前取款机内票数 public CashDispendser() { billCount = INITIAL_COUNT; } //出钱 public void DispenseCash(decimal amount) { int billsRequired = ((int)amount) / 20; billCount -= billsRequired; } //判断是否有余额 public bool IsSufficientCashAvailable(decimal amount) { //假设取款机内钞票的面值是20 int billsRequired = ((int) amount)/20; return (billCount >= billsRequired); } } }

 

(7)关于事务的基类:Transaction

我们可以回想一下,现实生活中,ATM的主要功能包括:查询余额,取款,存款等。虽然执行的过程不尽相同,但所有的这些事务包含相同的部分:比如说,必须有屏幕必须针对卡号一定和数据库打交道,等等。于是,我们先抽象出一个有关事务的基类,这个基类是不需要被实例化的,所以把它定义成抽象类。如下:

namespace MyATM { /// /// ATM事务 /// public abstract class Transaction { private int accountNumber;//卡号 private Screen userScreen;//屏幕 private BankDatabase database;//银行数据库 public Transaction(int userAccount, Screen theScreen, BankDatabase theDatabase) { accountNumber = userAccount; userScreen = theScreen; database = theDatabase; } //银行卡号属性 只读 public int AccountNumber { get { return accountNumber; } } //用户使用的屏幕属性 只读 public Screen UserScreen { get { return userScreen; } } //用户使用的数据库 只读 public BankDatabase Database { get { return database; } } //抽象方法 子类必须重写 public abstract void Execute(); } }

以上,在其它有关事务的派生类中都可以访问到基类的只读属性,并且子类必须重写抽象基类的Execute方法。

 

(8)关于查询的事务类:BalanceInquiry

该类调用Database类的方法查询可用余额和总余额。

namespace MyATM { /// /// ATM余额查询事务 /// public class BalanceInquiry : Transaction { public BalanceInquiry(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase) : base(userAccountNumber, atmScreen, atmBankDatabase){} public override void Execute() { //获取可用余额 decimal availableBalance = Database.GetAvailableBalance(AccountNumber); //获取总余额 decimal totalBalance = Database.GetTotalBalance(AccountNumber); //打印信息 UserScreen.DisplayMessageLine("\n余额信息为:"); UserScreen.DisplayMessage(" -可用余额为:"); UserScreen.DisplayDollarAmmount(availableBalance); UserScreen.DisplayMessage("\n -总余额为:"); UserScreen.DisplayDollarAmmount(totalBalance); UserScreen.DisplayMessageLine(""); } } }

 

(9)关于取款的事务类:Withdrawl

当用户输入取款的金额,该类必须要做的事情是:在用户的银行数据库中和ATM上做相应的减法,还必须考虑什么时候退出循环,用户是否按了取消键,用户账户上是否有余额,以及ATM中是否有余额。

namespace MyATM { /// /// ATM取款事务 /// public class Withdrawl : Transaction { private decimal amount;//取款金额 private Keypad keypad;//键盘 private CashDispendser cashDispenser;//出钱 private const int CANCELED = 6;//对应菜单中的取消 public Withdrawl(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase, Keypad atmKeypad, CashDispendser atmCashDispenser) : base(userAccountNumber, atmScreen, atmBankDatabase) { keypad = atmKeypad; cashDispenser = atmCashDispenser; } public override void Execute() { bool cashDispensed = false; //表示还没出钱 bool transactionCanceled = false; //表示不取消事务 do { int selection = DisplayMenuOfAmounts(); if (selection != CANCELED)//如果用户没有按取消 { amount = selection; //确定取款金额 //根据卡号获取可用余额 decimal availableBalance = Database.GetAvailableBalance(AccountNumber); if (amount


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有