当前位置: 移动技术网 > IT编程>开发语言>c# > c#模拟银行atm机示例分享

c#模拟银行atm机示例分享

2019年07月18日  | 移动技术网IT编程  | 我要评论
账户类account:id:账户号码password:账户密码name:真实姓名personid:身份证号码email:客户的电子邮箱balance:账户余额 depos

账户类account:
id:账户号码
password:账户密码
name:真实姓名
personid:身份证号码
email:客户的电子邮箱
balance:账户余额

deposit:存款方法,参数是double型的金额
withdraw:取款方法,参数是double型的金额

银行的客户分为两种类型:
储蓄账户(savingaccount)和信用账户(creditaccount)
两者的区别是储蓄账户不许透支,而信用账户可以透支,并允许用户设置自己的透支额度(使用ceiling表示)

bank类,
属性如下
(1)当前所有的账户对象的集合
(2)当前账户数量
构造方法
(1)用户开户:需要的参数包括id,密码,姓名,身份证号码,油箱和账户类型
(2)用户登录:参数包括id,密码,返回account对象
(3)用户存款:参数包括id和存款数额
(4)用户取款:参数包括id和取款数额
(5)设置透支额度:参数包括id和新的额度,这个方法需要哦验证账户是否是信用账户参数
统计方法
(6)统计银行所有账户的余额总数
(7)统计所有信用账户透支额额度总数

源代码:

复制代码 代码如下:

using system;
using system.collections.generic;
using system.linq;
using system.text;

namespace atm
{
abstract class account
{
//账户号码
protected long id;
public long id
{
get { return id; }
set { id = value; }
}
//账户密码
protected string password;
public string password
{
get { return password; }
set { password = value; }
}
//户主的姓名
protected string name;
public string name
{
get { return name; }
set { name = value; }
}
//身份证号码
protected string personid;
public string personid
{
get { return personid; }
set { personid = value; }
}
//email
protected string email;
public string email
{
get { return email; }
set { email = value; }
}
//余额
protected double balance;
public double balance
{
get { return balance; }
set { balance = value; }
}

//静态号码生成器
private static long idbuilder = 100000;
public static long idbuilder
{
get { return idbuilder; }
set { idbuilder = value; }
}

public void deposit(double sum)//存款
{
if (sum < 0)
throw new invalidoperationexception("输入的金额为负数");
balance += sum;
}

public abstract void withdraw(double sum);//取款
public account()
{ }
public account(string password, string name, string personid, string email)
{
this.id = ++idbuilder;
this.password = password;
this.name = name;
this.personid = personid;
this.email = email;
}
}
//创建creditaccount类,该类继承抽象类account
class creditaccount : account
{
protected double ceiling;//透支额度
public double ceiling
{
get { return ceiling; }
set { ceiling = value; }
}
public creditaccount(string password, string name, string personid, string email)
: base(password, name, personid, email)
{ }  
//信用账户的取款操作
public override void withdraw(double sum)
{
if (sum < 0)
{
throw new invalidoperationexception("输入的金额为负数!");
}
if (sum > balance + ceiling)
{
throw new invalidoperationexception("金额已经超出余额和透支度的总数了");
}
balance -= sum;
}
}
//创建savingaccount类,该类继承抽象类account
class savingaccount : account
{
public savingaccount(string password, string name, string personid, string email)
: base(password, name, personid, email)
{ }

public override void withdraw(double sum)
{
if (sum < 0)
{
throw new invalidoperationexception("输入的金额为负数!");
}
if(sum>balance)
{
throw new invalidoperationexception("金额已经超出金额!");
}
balance -= sum;
}
}

//bank类,对银行中的所有账户进行管理
class bank
{
//存放账户的集合
private list<account> accounts;
public list<account> accounts
{
get { return accounts; }
set { accounts = value; }
}

//当前银行的账户数量
private int currentaccountnumber;
public int currentaccountnumber
{
get { return currentaccountnumber; }
set { currentaccountnumber = value; }
}

//构造函数
public bank()
{
accounts=new list<account>();
}

//开户
public account openaccount(string password, string confirmationpassword, string name, string personid, string email, int typeofaccount)
{
account newaccount;
if (!password.equals(confirmationpassword))
{
throw new invalidoperationexception("两次密码输入的不一致");
}
switch (typeofaccount)
{
case 1: newaccount = new savingaccount(password, name, personid, email);
break;
case 2: newaccount = new creditaccount(password,name,personid,email);
break;
default: throw new argumentoutofrangeexception("账户类型是1和2之间的整数");
}
//把新开的账号加到集合中
accounts.add(newaccount);
return newaccount;
}
//根据账户id得到账户对象
private account getaccountbyid(long id)
{
foreach (account account in accounts)
{
if (account.id == id)
{
return account;
}
}
return null;
}

//根据账号和密码登陆账户
public account signin(long id, string password)
{
foreach (account account in accounts)
{
if (account.id == id && account.password.equals(password))
{
return account;
}
}
throw new invalidoperationexception("用户名或者密码不正确,请重试");
}

//存款
public account deposit(long id, double sum)
{
account account = getaccountbyid(id);
if (account != null)
{
account.deposit(sum);
return account;
}
throw new invalidoperationexception("非法账户!");
}

//取款
public account withdraw(long id, double sum)
{
account account = getaccountbyid(id);
if (account != null)
{
account.withdraw(sum);
return account;
}
throw new invalidoperationexception("非法账户!");
}

//设置透支额度
public account setceiling(long id, double newceiling)
{
account account = getaccountbyid(id);
try
{
(account as creditaccount).ceiling = newceiling;
return account;
}
catch (exception)
{
throw new invalidoperationexception("次账户不是信用账户!");
}
throw new invalidoperationexception("非法账户");
}

//统计银行所有账户余额
public double gettotalbalance()
{
double totalbalance = 0;
foreach (account account in accounts)
{
totalbalance += account.balance;
}
return totalbalance;
}
//统计所有信用账户透支额度总数
public double gettotalceiling()
{
double totalceiling = 0;
foreach (account account in accounts)
{
if (account is creditaccount)
{
totalceiling += (account as creditaccount).ceiling;
}
}
return totalceiling;
}
}

//进行客户测试
class program
{
static account signin(bank icbc)
{
console.writeline("\nplease input your account id");
long id;
try
{
id = long.parse(console.readline());
}
catch (formatexception)
{
console.writeline("invalid account id!");
return null;
}

console.writeline("please input your password");
string password = console.readline();
account account;
try
{
   account = icbc.signin(id, password);
}
catch (invalidoperationexception ex)
{
console.writeline(ex.message);
return null;
}
return account;
}
static void main(string[] args)
{
bank icbc = new bank();
while (true)
{
console.writeline("please choose the service your need");
console.writeline("(1) open a new account");
console.writeline("(2) desposit");
console.writeline("(3) withdraw");
console.writeline("(4) set ceiling");
console.writeline("(5) get total balance");
console.writeline("(6) get total ceiling");
console.writeline("(0) exit");
string choice;
choice = console.readkey().keychar.tostring();
//consolekey i=console.readkey().key;
switch (choice)
{
case "1":
{
string personid;
int typeofaccount;
string password;
console.writeline("\nwhich kind of account do you want to open?");
while (true)
{
console.writeline("(1)saving account\n(2)credit account\n(3)return to last menu");
try
{
typeofaccount = int.parse(console.readline());
}
catch (formatexception)
{
console.writeline("\ninvalid option,please choose again");
continue;
}
if (typeofaccount < 1 || typeofaccount > 3)
{
console.writeline("\ninvalid option,please choooose again!");
continue;
}
break;
}
if (typeofaccount == 3)
{
break;
}
console.writeline("\nplease input your name:");
string name = console.readline();
while (true)
{
console.writeline("please input your personal id");
personid = console.readline();
if (personid.length != 18)
{
console.writeline("invalid personal id,please input again!");
continue;
}
break;
}
console.writeline("please input your e-mail");
string email = console.readline();
while (true)
{
console.writeline("please input your password");
password = console.readline();
console.writeline("please confirm your password");
if (password != console.readline())
{
console.writeline("the password doesn't math!");
continue;
}
break;
}
account account = icbc.openaccount(password, password, name, personid, email, typeofaccount);
console.writeline("the account opened successfully");
console.writeline("account id:{0}\naccount name;{1}\nperson id:{2}\nemail;{3}\nbalance:{4}",account.id,account.name,account.personid,account.email,account.balance);
}
break;
case "2":
{
account account = signin(icbc);
if (account == null)
{
break;
}
int amount;
while (true)
{
console.writeline("please input the amount;");
try
{
amount = int.parse(console.readline());
}
catch (formatexception)
{
console.writeline("invalid input!");
continue;
}
break;
}
try
{
icbc.deposit(account.id, amount);
}
catch (invalidoperationexception ex)
{
console.writeline(ex.message);
break;
}
console.writeline("deposit successfully,our balance is{0}元",account.balance);
}
break;
case "3":
{
account account = signin(icbc);
if (account == null)
{
break;
}
int amount;
while (true)
{
console.writeline("please input the amount");
try
{
amount = int.parse(console.readline());
}
catch (formatexception)
{
console.writeline("invalid input!");
continue;
}
break;
}
try
{
icbc.withdraw(account.id, amount);
}
catch (invalidoperationexception ex)
{
console.writeline(ex.message);
break;
}
console.writeline("deposit successfully,your balance is{0}yuan",account.balance);
}
break;
case "4":
{
account account = signin(icbc);
if (account == null)
{
break;
}
double newceiling;
while (true)
{
console.writeline("please input the new ceiling");
try
{
newceiling = double.parse(console.readline());
}
catch (formatexception)
{
console.writeline("invalid input!");
continue;
}
break;
}
try
{
icbc.setceiling(account.id, newceiling);
}
catch (invalidoperationexception ex)
{
console.writeline(ex.message);
break;
}
console.writeline("set ceiling successfully,your new ceiling is{0} yuan",(account as creditaccount).ceiling);

}
break;
case "5":
console.writeline("\nthe total balance is:"+icbc.gettotalbalance());
break;
case "6":
console.writeline("\nthe total ceiling is:" + icbc.gettotalceiling());
break;
case "0":
return;
default:
console.writeline("\ninvalid option,plwase choose again!");
break;
}
}
}
}
}

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

  • c# 面试必备线程基础知识点

    c# 面试必备线程基础知识点

    线程的知识太多,知识点有深有浅,往深的研究会涉及操作系统、cpu、内存,往浅了说就是一些语法。没有一定的知识积累,很难把线程的知识写得全面,当然我也没有这个能力... [阅读全文]
  • C#使用System.Net邮件发送功能踩过的坑

    C#使用System.Net邮件发送功能踩过的坑

    1.eazyemail邮件发送类库net 类库自带了邮件发送功能。笔者对该类库,从使用的角度进行了二次封装,nuget上可搜索eazyemail,注入容器时通过... [阅读全文]
  • C#基于Modbus三种CRC16校验方法的性能对比

    C#基于Modbus三种CRC16校验方法的性能对比

    1.背景介绍主要应用场景在物联网中,底端设备注册报文的上报,需要对报文的有效载荷(data)进行crc16的复验,验证与设备端的crc校验是否相等,如果相等,报... [阅读全文]
  • 深入谈谈C#9新特性的实际运用

    前言你一定会好奇:“老周,你去哪开飞机了?这么久没写博客了。”老周:“我买不起飞机,开了个铁矿,挖了一年半的石头。谁知铁矿垮了,压死了几条蜈蚣,什么也没挖着。”... [阅读全文]
  • C# 泛型集合的自定义类型排序的实现

    C# 泛型集合的自定义类型排序的实现

    一、泛型集合list<t>排序经sort方法之后,采用了升序的方式进行排列的。二、对自定义类型进行排序定义一个普通类:接下来,将定义的person实... [阅读全文]
  • C#开发中常用的加密解密方法汇总

    相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天给大家分享我个人总结的一些加密算法:常见的加密方式分为可逆和不可逆两种方式可逆:rsa,a... [阅读全文]
  • C# 如何添加错误日志信息

    系统日志系统日志包含了由windows系统组件记录的事件。例如,在启动期间装入驱动程序或其他系统组件失败被记录到系统日志。要查看系统日志: 打开命令提示符。 ... [阅读全文]
  • 关于C#委托三种调用的分享使用

    关于C#委托三种调用的分享使用

    一、同步调用1、同步调用会按照代码顺序来执行2、同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量io操作),可能会让程序停顿很长时间,造成糟糕的用户体验,... [阅读全文]
  • 用c# 自动更新程序

    作者:冰封一夏出处:hzhcontrols官网:首先看获取和更新的接口更新程序program.cs更新程序界面定义服务端接口,你可以用任意接口都行,我这里用we... [阅读全文]
  • c# 生成二维码的示例

    二维码是越来越流行了,很多地方都有可能是使用到。如果是静态的二维码还是比较好处理的,通过在线工具就可以直接生成一张二维码图片,比如:草料二维码。但有的时候是需要... [阅读全文]
验证码:
移动技术网