本程序实现了一个模拟现实中银行与ATM系统 的简易版本,可以提供注册、登录、查询余额、取款、存款、ATM限制取款额度并弹窗警告、自定义异常模拟出钞异常等功能。
这份代码实际是某周的C#作业,一切都从简处理了
完整代码:https://gitee.com/cai_zhi_peng/ATM.git
此C#程序模拟了现实中的银行和ATM系统,提供了一个简单的统一界面 界面可以同时进行银行或者是ATM的事务
可以进行登录账户,查询余额、取款、存款等 注册账户只能在银行进行,不能在ATM进行 开始运行的时候必须先注册账号才可以登录进行后续操作,
登录之后的操作可以依据界面的说明和按钮进行相应操作
#以下是此程序实现的一些东西 定义了账户Account,银行Bank,ATM,BadCashException等类 自定义事件的6部曲在代码中有实现,具体步骤已经按照1-6的编号标出 自定义了异常,用于表示出钞时的异常,用Random来随机抛出异常实现
程序运行截图:
代码是Visual Studio项目,下面是几个重要文件的代码
//Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace chapter4_ATM
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
//5、注册事件,当在ATM中取走一大笔钱的时候警告,调用alertBigMoney()去处理
Form1.BigMoneyFetched += Form1.alertBigMoney;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
//1、声明参数类型,事件对象
public class BigMoneyArgs : EventArgs
{
public Account account;//账户信息
public float fetchedmoney;//输入取款金额
}
//2、声明委托类型
public delegate void BigMoneyFetchedEventHandler(object sender, BigMoneyArgs e);
//自定义异常类型,表示取钱时的出钞异常
public class BadCashException:ApplicationException
{
private int idNumber;
public BadCashException(String message,int id):base(message)
{ this.idNumber = id; }
}
//账户类,表示账户的信息
public class Account
{
private string accountnumber;//账户号码
private string password;//账户密码
private float balanve;//余额
public Account(string accountnumber, string password)//带两个参数的构造函数
{
this.accountnumber = accountnumber;
this.password = password;
}
public Account()//无参构造函数
{
}
//查询余额
public float queryBalanve()
{
return balanve;
}
//取款
public void withdraw(float withdrawMoney)
{
// 随机生成异常,表示出钞的异常
Random ran = new Random();
int a = ran.Next(0, 5);
if (a < 2) throw new BadCashException("出钞错误,请重试", 222);//抛出异常
balanve -= withdrawMoney;
}
//取款
public void deposit(float depositMoney)
{
balanve += depositMoney;
}
//set get 函数
public string getaccountnumber() { return accountnumber; }
public void setaccountnumber(string value) { this.accountnumber = value; }
public string getpassword() { return password; }
public void setpassword(string value) { this.password = value; }
}
//银行类
public class Bank
{
static List<Account> accountsList = new List<Account>();//用户列表,静态数据
//用户注册函数,新建一个Account对象并放入用户列表中
public static void register(string accountnumber,string password)
{
Account newAccount = new Account(accountnumber, password);
accountsList.Add(newAccount);
}
//登录函数,检验输入的账号是否存在以及密码是否正确
public static Account login(string accountnumber,string password)
{
foreach(Account i in accountsList)
{
if (i.getaccountnumber() == accountnumber && i.getpassword() == password)
{
return i;
}
}
return null;
}
public static List<Account> getaccountsList() { return accountsList; }
}
//ATM类,与银行类类似
public class ATM
{
//登录函数,ATM不能注册
public static Account login(string accountnumber, string password)
{
foreach (Account i in Bank.getaccountsList())
{
if (i.getaccountnumber() == accountnumber && i.getpassword() == password)
{
return i;
}
}
return null;
}
}
}
//Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace chapter4_ATM
{
public partial class Form1 : Form
{
bool isloginSuccess_Bank = false;//判断是否在银行登录成功
bool isloginSuccess_ATM = false;//判断是否在ATM登录成功
public Form1()
{
InitializeComponent();
}
//3、声明事件
public static event BigMoneyFetchedEventHandler BigMoneyFetched;
//6、事件处理方法
public static void alertBigMoney(object sender, BigMoneyArgs e)
{
//弹出窗口警告
MessageBox.Show("在ATM取款不允许超过10000");
}
//下面是点击各个按钮触发的事件
private void button1_Click(object sender, EventArgs e)
{
if(textBox1.Text!=" "&&textBox2.Text!=" ")//判断有输入账户密码才创建账户
{
Bank.register(textBox1.Text, textBox2.Text);//调用银行注册函数
textBox1.Clear();
textBox2.Clear();
MessageBox.Show("注册成功");
}
}
//银行登录
private void button2_Click(object sender, EventArgs e)
{
foreach(Account i in Bank.getaccountsList())
{
if (textBox3.Text == i.getaccountnumber() && textBox4.Text == i.getpassword())
{
currentAccount = i;//目前执行操作的用户,为一个static 的全局变量
textBox4.Clear();
isloginSuccess_Bank = true;
MessageBox.Show("登录成功");
break;
}
}
if(!isloginSuccess_Bank)
{
textBox3.Clear();
textBox4.Clear();
MessageBox.Show("登录错误");
}
}
//查询余额
private void button3_Click(object sender, EventArgs e)
{
if(isloginSuccess_Bank)
{
textBox5.Text = currentAccount.queryBalanve() + " ";
}
}
//取款
private void button4_Click(object sender, EventArgs e)
{
if(isloginSuccess_Bank)
{
if(currentAccount.queryBalanve()>=float.Parse(textBox7.Text))
{
try//处理可能抛出的异常
{
currentAccount.withdraw(float.Parse(textBox7.Text));
textBox7.Clear();
MessageBox.Show("取款成功");
}
catch(BadCashException ex)
{
textBox7.Clear();
MessageBox.Show(ex.Message);
}
}
else
{
textBox7.Clear();
MessageBox.Show("余额不足");
}
}
}
//存款
private void button5_Click(object sender, EventArgs e)
{
if (isloginSuccess_Bank)
{
int depositmoney = int.Parse(textBox6.Text);
currentAccount.deposit((float)depositmoney);
textBox6.Clear();
MessageBox.Show("存款成功");
}
}
private void textBox8_TextChanged(object sender, EventArgs e)
{
}
//ATM取款
private void button7_Click(object sender, EventArgs e)
{
if (isloginSuccess_ATM)
{
if(float.Parse(textBox12.Text)>10000.0)
{
//4、符合条件则发生一个事件,ATN取款超过10000
BigMoneyArgs args = new BigMoneyArgs();
args.account = currentAccount;
args.fetchedmoney = float.Parse(textBox12.Text);
BigMoneyFetched(this, args);
}
else if (currentAccount.queryBalanve() >= float.Parse(textBox12.Text))
{
try
{
currentAccount.withdraw(float.Parse(textBox12.Text));
textBox12.Clear();
MessageBox.Show("取款成功");
}
catch (BadCashException ex)
{
textBox12.Clear();
MessageBox.Show(ex.Message);
}
}
else
{
textBox12.Clear();
MessageBox.Show("余额不足");
}
}
}
//ATM登录
private void button6_Click(object sender, EventArgs e)
{
foreach (Account i in Bank.getaccountsList())
{
if (textBox8.Text == i.getaccountnumber() && textBox9.Text == i.getpassword())
{
currentAccount = i;
textBox9.Clear();
isloginSuccess_ATM = true;
MessageBox.Show("登录成功");
break;
}
}
if (!isloginSuccess_ATM)
{
textBox8.Clear();
textBox9.Clear();
MessageBox.Show("登录错误");
}
}
//ATM查询余额
private void button9_Click(object sender, EventArgs e)
{
if (isloginSuccess_ATM)
{
textBox10.Text = currentAccount.queryBalanve() + " ";
}
}
//ATM存款
private void button8_Click(object sender, EventArgs e)
{
if (isloginSuccess_ATM)
{
int depositmoney = int.Parse(textBox11.Text);
currentAccount.deposit((float)depositmoney);
textBox11.Clear();
MessageBox.Show("存款成功");
}
}
private void label4_Click(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void label8_Click(object sender, EventArgs e)
{
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void textBox5_TextChanged(object sender, EventArgs e)
{
}
private void textBox11_TextChanged(object sender, EventArgs e)
{
}
}
}
```csharp
//Form1.Designer.cs
namespace chapter4_ATM
{
partial class Form1
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
Account currentAccount = new Account();//只有这句是重点
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
}
}
}