自动取款机(ATM)模拟程序(C#控制台应用程序)_第1页
自动取款机(ATM)模拟程序(C#控制台应用程序)_第2页
自动取款机(ATM)模拟程序(C#控制台应用程序)_第3页
自动取款机(ATM)模拟程序(C#控制台应用程序)_第4页
自动取款机(ATM)模拟程序(C#控制台应用程序)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、自动取款机(ATM)模拟程序一、 需求我们需要设计一个具备如下功能的ATM模拟程序。开户:用户能够通过ATM来开设帐号,开户需要设置密码。登录:用户能够登录到已经开设的帐号上,登录需要验证密码。管理帐号:用户登录到帐号上后,能够进行如下的操作。存款:将指定的款项存到帐号中。取款:从帐号中取出指定的款项。查询余额:查询帐号的余额。修改密码:修改帐号的密码。二、 分析面向对象编程的第一步是进行面向对象分析。面向对象分析的目标是建立问题领域的模型,包括如下模型。 功能模型:即画出每一个功能要求的用例图。 对象模型:对用例模型进行分析,把系统分解成互相协作的类,通过类图/对象图描述对象、对象的属性、对

2、象间的关系。 动态模型:描述系统的动态行为,通过序列图来描述对象的交互,以揭示对象间如何写作来完成每个具体的用例,单个对象的状态变化和动态行为可以通过状态图来表达。1. 功能模型根据我们的需求,可以很容易地画出ATM模拟程序的用例图:可以看出,用户可以开户和登录帐号,开户或者登录帐号之后就能管理帐号。要管理账号,就必须首先登录帐号或者开户。管理帐号的功能包括存款、取款、查询余额和修改密码。2. 对象模型ATM是银行相连的设备,因此银行是ATM模拟程序的相关对象,所有的操作都是针对帐号的,因此帐号是其中的核心对象。此外,需要一个程序来启动ATM。因此,在ATM模拟程序中,我们需要处理四个类,或者

3、说四类对象:启动程序、ATM、银行及帐号。1) 帐号类 Account帐号类Account包含所有的帐号信息负责所有的帐号操作。基本的帐号信息包括: 帐号名 name 帐号密码 password 帐号余额 balance主要的帐号操作包括: 登录 Login 存款 Deposit 取款 Withdraw 查询余额 Get_Balance 修改密码 ChangePassword2) 银行类 Bank银行类Bank的本质就是一组帐号的组合,并负责管理帐号。基本的银行信息包括: 银行名 name 已经开户的帐号数 usedAccountNum 可以容纳的最大账户数 MaxAccountNum 帐号集

4、 accounts主要的银行操作包括: 开户 OpenAccount 登录帐号 LoginAccount 撤销帐号,但是由于ATM不能撤销帐号,因此我们不关心这个操作3) ATM类ATM类与银行类之间在一对一的关联关系,ATM提供用户界面,并将用户的请求提交给银行、将银行的反馈提交给用户。基本的ATM信息包括: 银行 Bank主要的ATM操作包括: 启动 Start 开户 OpenAccount 登录帐号 LoginAccount 管理帐号 ManageAccount 一些显示不同信息的辅助操作(PrintLogo、Print、Pause等)。4) 启动程序类Program启动程序类Progr

5、am的唯一功能就是创建银行类和ATM类的实例,并将它们关联起来,然后启动ATM(执行ATM对象的Start方法)。因此,这个类仅仅包含程序的入口点Main方法。5) ATM模拟程序的类图根据上述各类的分析,可以画出ATM模拟程序的类图:注意:Bank类和Account类的数据成员都使用protected访问模式,主要是为了使它们的之类都能集成它们的这些数据成员。3. 动态模型ATM模拟程序的基本工作流程:三、 设计经过分析,我们已经了解了ATM模拟程序中的四个类的基本结构。在设计阶段需要进一步细化个各类的结构。对Account类,我们将进行如下的调整: 用只读属性来实现Get_Balance方

6、法 增加赌气name的只读属性。 增加构造函数。 重载Deposit方法,并提供三个重载方法。 重载Withdraw方法,并提供三个重载方法。对Bank类,主要调整包括: 提供构造函数,传入银行的名称。 增加读取name的只读属性。 用数组来实现帐号集。 用常量来表示MaxAccountNum对ATM类,主要增加几个与用户交互的函数(打印信息和输入信息),以及一个退出系统的密码。在设计类的时候,为了提供代码的重用性,一个重要的原则是,不要将功能与用户界面紧密耦合在一起。在这个程序中,Account类和Bank类是功能类,ATM类是用户界面类。因此,在设计Account类和Bank类时候,不要涉

7、及任何的用户界面操作。所有的用户界面都放在ATM类中。这样做的好处是:功能类可以适用于任何的用户界面,比如,Bank类和Account可以用于网上银行,用户界面类可以适用于其他功能,比如,ATM类可以用于信用卡机构。四、 实现1)在ATM项目中增加Account类using System;using System.Collections.Generic;using System.Text;/Account.cs/ATM项目中的Account类源文件namespace ATM class Account protected string name; protected string passwo

8、rd; protected decimal balance; public decimal Banlance get return balance; public string Name get return name; public Account(string name,string password) this.balance = 0; = name; this.password = password; public bool Deposit(decimal amount) if(amount<=0) return false; balance += amoun

9、t; return true; public bool Deposit(double amount) return Deposit(decimal)amount); public bool Deposit(int amount) return Deposit(decimal)amount); public bool Deposit(decimal amount,out decimal balance) bool succeed = Deposit(amount); balance = this.balance; return succeed; public bool Withdraw(deci

10、mal amount) if (amount > balance | amount <= 0) return false; balance -= amount; return true; public bool Withdraw(double amount) return Withdraw(decimal)amount); public bool Withdraw(int amount) return Withdraw(decimal)amount); public bool Withdraw(decimal amount, out decimal balance) bool su

11、cceed = Withdraw(amount); balance = this.balance; return succeed; public bool ChangePassword(string oldPassword, string newPassword) if(oldPassword!=password) return false; password = newPassword; return true; public bool Login(string name,string password) return (=name&&this.passwo

12、rd=password); 2)在ATM项目中增加Bank类using System;using System.Collections.Generic;using System.Text;/Bank.cs/ATM项目中的Bank类源文件namespace ATM class Bank protected string name; protected const int MaxAccountNum = 2048; protected int usedAccountNum; protected Account accounts; public string Name get return name

13、; public Bank(string name) = name; this.usedAccountNum = 0; accounts=new AccountMaxAccountNum; public bool LoginAccount(string name,string password,out Account account) account = null; for (int i = 0; i < usedAccountNum;+i ) if(accountsi.Login(name,password) account=accountsi; return tr

14、ue; return false; public bool OpenAccount(string name, string password, out Account account) account = null; for (int i = 0; i < usedAccountNum;+i ) if(accountsi.Name=name) return false; account = new Account(name, password); accountsusedAccountNum+ = account; return true; 3)在ATM项目中增加ATM类using Sy

15、stem;using System.Collections.Generic;using System.Text;/ATM.cs/ATM项目中的ATM类源文件namespace ATM class ATM private const string quitcode = "20130814" private Bank bank; public ATM(Bank bank) this.bank = bank; public void Start() while (true) /主界面 PrintLogo(); Console.WriteLine("-1.开户-"

16、;); Console.WriteLine("-2.登录-"); Console.WriteLine("-3.退出-"); Console.WriteLine("-"); Console.WriteLine(""); Console.Write("请输入您的选择(回车结束):"); string code = Console.ReadLine(); /quit system if (code = quitcode) return; if (code = "1") OpenAc

17、count(); else if(code="2") LoginAccount(); else if (code = "3") Console.WriteLine("按一下任意键直接退出."); Console.ReadKey(); return; private void LoginAccount() PrintLogo(); Console.WriteLine("-请输入您的帐号的用户名和密码:-"); Console.WriteLine("-"); Console.WriteLine(&q

18、uot;"); string name = Input("用户名(回车结束):"); string password = Input("密码(回车结束):"); /登录帐号 Account account; if (!bank.LoginAccount(name, password, out account) Console.WriteLine("-登录错误,请检查用户名和密码是否正确。按Enter键继续.-"); Console.Read(); else ManageAccount(ref account); privat

19、e void OpenAccount() PrintLogo(); Console.WriteLine("-请输入您的帐号的用户名和密码:-"); Console.WriteLine("-"); Console.WriteLine(""); string name = Input("用户名(回车结束):"); string password = Input("密码(回车结束):"); /开户 Account account; if (!bank.OpenAccount(name, passwor

20、d, out account) Console.WriteLine("-开户错误,用户名和密码已经存在。按Enter键继续.-"); Console.Read(); else Print("开户",0,account); Pause(); ManageAccount(ref account); private void ManageAccount(ref Account account) while (true) /管理帐号界面 PrintLogo(); Console.WriteLine("-1.存款-"); Console.Wri

21、teLine("-2.取款-"); Console.WriteLine("-3.查询余额-"); Console.WriteLine("-4.修改密码-"); Console.WriteLine("-5.退出-"); Console.WriteLine("-"); Console.WriteLine(""); Console.Write("您的选择是(回车结束):"); string code = Console.ReadLine(); string s;

22、 decimal amount; bool succeed; switch(code) case"1": amount = InputNumber("n请输入存款数目:"); succeed = account.Deposit(amount); if (succeed) Print("存入", amount, account); else Console.WriteLine("存款失败!"); Pause(); break; case "2": amount = InputNumber(&quo

23、t;n请输入取款数目:"); succeed = account.Withdraw(amount); if (succeed) Print("取出", amount, account); else Console.WriteLine("取款失败!"); Pause(); break; case "3": Print(account); ; Pause(); break; case "4": string oldPassword = Input("当前密码(回车结束):"); strin

24、g newPassword = Input("新密码(回车结束):"); succeed = account.ChangePassword(oldPassword,newPassword); if (succeed) Console.WriteLine("密码修改成功!"); else Console.WriteLine("密码修改失败!"); Pause(); break; case "5": return; /break; default: break; private void PrintLogo() Con

25、sole.WriteLine("n-"); Console.WriteLine("0自动取款机 用专业的心 做专业的事",bank.Name); Console.WriteLine("-"); private string Input(string prompt) Console.Write(prompt); string str = Console.ReadLine(); while(str="") Console.Write("不能为空,0",prompt); str = Console.ReadLine(); return str; private decimal InputNumber(string prompt) Console.Write(prompt); string s = Console.ReadLine(); decimal amount = Decimal.Parse(s); return amount; private void Pause() Console.Write("按Enter继续.&q

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论