C#应用实训|任务3 银行卡账户开户实现
发布者:唯众
布时间:2020-12-12 16:21:00
点击量:
任务描述
用户进入系统主菜单后,用户选择开户功能后,显示借记卡账户和信用卡账户开户菜单,用户选择其中一种需开户账户后,输入相关开户账户信息,当用户输入信息有误时,能检测出异常并输出相关异常信息;当用户输入信息正确无误后,系统提示开户成功信息。
知识引入
- 异常
异常是程序运行时发生的错误或出现某种意想不到的状态。如被零除、溢出、数组下标越界或内存不足等。C#提供了捕捉和处理异常机制可以处理这些错误,当程序运行时出现上述某种异常后,就会引发异常,转而搜索对应异常处理程序,当前程序停止执行。
C#中异常是以类的形式出现的。所有异常类都必须继承Exception类,也就是说Exception类是所有异常类的基类。引发异常后,应用程序或默认异常处理程序将处理异常。
C#常见的异常如表3-1所示:
表3-1 C#常见的异常
Exception类 |
描 述 |
Exception |
异常层次结构的根类 |
ArgumentException |
向方法提供的任意一个参数无效时引发的异常 |
ArithmeticException |
算术错误,如除数为0 |
FormatException |
参数的格式不符合调用方法的参数规范时引发的异常 |
RuntimeException |
当出现运行时错误,并且无法确定具体原因时,引发的异常。 |
DavideByZeroException |
除数为0 时引发的异常 |
IndexOutOfBoundsException |
数组下标越界时引发的异常 |
NullReferenceException |
尝试取消引用空对象引用时引发的异常 |
IOException |
出现I/O错误时引发的异常 |
SQLException |
SQL数据库异常时引发的异常 |
在应用开发中,开发人员常需引发新异常。若在应用中出现无法解决的情况时,应该向客户端应用程序引发一个异常,此种类型的异常称为自定义异常。
(1)使用try/catch语句
为捕获和处理异常,将可能出现异常的语句放到try子句中,当执行这些语句出现异常时,try子句会捕获这些异常,然后程序执行方向转到catch子句中;如果没有出现异常,程序就会执行try … catch后面的代码,而不会执行catch子句中的代码。
try … catch子句通用语法如下:
try
{
//程序代码段
}
catch(Exception e)
{
//错误处理代码
}
【
例3-10】
数组下标越界处理异常。
class Program
{
static void Main(string[] args)
{
//使用异常处理机制
int[] arr = {1,2,3};
try
{
for (int i = 0; i <= 3; i++) //出现异常,使用异常处理机制
{
Console.WriteLine("arr[{0}] = {1}", i, arr[i]);
}
}
catch(IndexOutOfRangeException ex1)
{
Console.WriteLine(ex1.Message);
}
}
}
(2)使用throw语句抛出异常
程序运行时可以捕获由C#自动产生的异常,C#也提供使用throw语句抛出异常,使用throw语句既可以抛出系统异常,也可以抛出开发人员自己创建的自定义异常。
throw的通用语法如下:
throw 异常对象
【
例3-11】
使用throw语句抛出数组下标越界并处理异常。
class Program
{
static void Main(string[] args)
{
//使用异常处理机制
int[] arr = { 1, 2, 3 };
try
{
for (int i = 0; i <= 3; i++) //出现异常,使用异常处理机制
{
Console.WriteLine("arr[{0}] = {1}", i, arr[i]);
}
throw new IndexOutOfRangeException(); //抛出异常
}
catch (IndexOutOfRangeException e) //捕获异常
{
Console.WriteLine(e.Message);
}
}
}
(3)使用多重catch语句
Catch块捕获try块引发的异常,有时一个try块可能需要多个catch块捕获多个异常,则必须具有多个catch块,多重catch语句语法如下:
try
{
//程序代码
}
catch(异常类型1 e)
{
//错误处理代码
}
catch(异常类型2 e)
{
//错误处理代码
}
一个try块可以有多个catch块,但只能有一个通用的catch块,且通用的catch块必须放到最后一个,否则将产生编译错误。
(4)使用finally语句
当与try块一起使用时,不管是否发生了异常,都将执行finally块中的语句。因此,一般情况下,finally块中执行一些清除资源的操作。
【
例3-12】
使用多重catch语句和finally语句处理数组下标越界异常。
class Program
{
static void Main(string[] args)
{
//使用异常处理机制
int[] arr = {1,2,3};
try
{
for (int i = 0; i <= 3; i++) //出现异常,使用异常处理机制
{
Console.WriteLine("arr[{0}] = {1}", i, arr[i]);
}
}
catch(IndexOutOfRangeException ex1)
{
Console.WriteLine(ex1.Message);
}
catch (Exception ex2)
{
Console.WriteLine(ex2.Message);
Console.WriteLine("Exception............");
}
finally
{
Console.WriteLine("After Exception..........");
}
}
}
任务实现
- 定义银行账户类
银行账户类作为借记卡子类和信用卡子类的父类,类中定义了子类共有的属性和开户时需用使用的构造方法。
class Account //账户类,父类 ,以下是共有属性和方法
{ …….. }
- 定义借记卡子类和信用卡子类
借记卡子类和信用卡子类都继承银行账户类,信用卡子类中添加透支金额属性,两个子类都调用父类的带参构造方法。
class DebitAcc : Account //借记卡子类
{ …….. }
class CreditAccount : Account //信用卡子类
{ …….. }
- 定义银行业务类
在银行业务类中分别定义新账户开户、登录、存款、取款、查询余额方法,并完成相应功能 ,以实现用户使用借记卡或信用卡完成相应业务。
class Bank //银行业务类
{
public void openAccount( ) { …….. } // 开户
public void login( ) { …….. } //登录
public void saveMoney(Account at) { …….. } //存款
public void takeMoney(Account at) { …….. } //取款
public void loopMoney(Account at){ …….. } //查询余额
}
- 实现主菜单方法
在main主方法中实现,实现主菜单的输出,当选择菜单1时,调用开户方法,当选择菜单2时调用登录方法。
public static void Main(string[] args)
{…….. }
- 编写调试项目三
新建控制台项目,项目名CustomDemo,解决方案名MyCustomDemo,设置启动项目为CustomDemo,编写调试项目三,程序如下:
【
例3-13】
银行卡账户开户实现,程序代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CustomDemo
{
class Account //账户类,父类 ,以下是共有属性和方法
{
public long aid; //账户编号
public string aname; //储户姓名
public string personId; //身份证号
public string password; //密码
public double balance; //账户余额
public Account() { }
public Account(long aid, string aname, string personId, string password, double balance)
{
this.aid = aid;
this.aname = aname;
this.personId = personId;
this.password = password;
this.balance = balance;
}
}
class Bank
{
protected static List<Account> list = new List<Account>();
private static long i = 11000000; //指借记卡卡号,每增加一个用户,i自增1
private static long j = 81000000; //指信用卡卡号,每增加一个用户,j自增1
//开户
public void openAccount()
{
Console.WriteLine("请选择开户类型:");
Console.WriteLine("1.------ 借记卡账户");
Console.WriteLine("2.------ 信用卡账户");
Console.WriteLine("3.------ 退出");
int choice = Convert.ToInt32(Console.ReadLine());
if (choice != 1 && choice != 2 || choice == 3)
{
Console.WriteLine("感谢您的使用,欢迎下次光临!");
System.Environment.Exit(0);
}
switch (choice)
{
case 1:
Console.WriteLine("您将要办理借记卡账户开户业务:");
Console.WriteLine("请输入开户的用户名:");
string name = Console.ReadLine();
Console.WriteLine("请输入密码:");
string password = Console.ReadLine();
Console.WriteLine("请输入身份证号:");
string personId = Console.ReadLine();
double money = 0;
try
{
Console.WriteLine("请输入开户金额:");
money = Convert.ToDouble(Console.ReadLine());
}catch(Exception e)
{
Console.WriteLine("输入错误");
}
Account ac = new DebitAcc(i, name, personId, password, money);
i++;
list.Add(ac);
Console.WriteLine("恭喜你开户成功!你的卡号为:{0}", i);
Console.WriteLine("用户名:{0}", name);
Console.WriteLine("密码:{0}", password);
Console.WriteLine("身份证号:{0}", personId);
Console.WriteLine("开户金额:{0}", money);
break;
case 2:
Console.WriteLine("您将要办理信用卡账户开户业务:");
Console.WriteLine("请输入开户的用户名:");
string name2 = Console.ReadLine();
Console.WriteLine("请输入密码:");
string password2 = Console.ReadLine();
Console.WriteLine("请输入身份证号:");
string personId2 = Console.ReadLine();
double money2 = 0;
double overdraft = 0;
try
{
Console.WriteLine("请输入开户金额:");
money = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请输入透支额度:");
overdraft = Convert.ToDouble(Console.ReadLine());
}catch(Exception e)
{
Console.WriteLine("输入错误");
}
Account ac2 = new CreditAccount(j, name2, personId2, password2, money2, overdraft);
j++;
list.Add(ac2);
Console.WriteLine("恭喜你开户成功!你的卡号为:{0}", j);
Console.WriteLine("用户名:{0}", name2);
Console.WriteLine("密码:{0}", password2);
Console.WriteLine("身份证号:{0}", personId2);
Console.WriteLine("开户金额:{0}", money2);
Console.WriteLine("透支额度:{0}", overdraft);
break;
}
}
//登录
public void login()
{
Console.WriteLine("请输入登录用户名:");
string name = Console.ReadLine();
Console.WriteLine("请输入登录密码:");
string password = Console.ReadLine();
Account at = null;
foreach (Account ac in list)
{
if (ac.aname == name && ac.password == password)
{
at = ac;
}
}
if (at != null)
{
Console.WriteLine("登录成功...");
Console.WriteLine("请选择功能:(按其它键退出)");
Console.WriteLine("1. 存款");
Console.WriteLine("2. 取款");
Console.WriteLine("3. 查询余额");
int choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case 1:
Console.WriteLine("欢迎使用存款功能......");
saveMoney(at);
Console.WriteLine("存款成功!");
break;
case 2:
Console.WriteLine("欢迎使用取款功能......");
takeMoney(at);
break;
case 3:
Console.WriteLine("欢迎使用余额查询功能......");
loopMoney(at);
break;
}
}
}
//存款
public void saveMoney(Account at)
{
Console.WriteLine("请输入存款金额");
double money = Convert.ToDouble(Console.ReadLine());
at.balance += money;
}
//取款
public void takeMoney(Account at)
{
Console.WriteLine("请输入取款金额");
double money = Convert.ToDouble(Console.ReadLine());
if (at.balance >= money)
{
Console.WriteLine("取款成功");
at.balance -= money;
}
}
//查询余额
public void loopMoney(Account at)
{
Console.WriteLine("您的账户信息如下:");
Console.WriteLine("卡号:{0}", at.aid);
Console.WriteLine("用户名:{0}", at.aname);
Console.WriteLine("账户余额:{0}", at.balance);
}
}
class DebitAcc : Account //借记卡子类
{
public DebitAcc(long aid, string aname, string personId, string password, double balance)
: base(aid, aname, personId, password, balance)
{
}
}
class CreditAccount : Account //信用卡子类
{
private double overdraft; //透支金额
public CreditAccount(long aid, string aname, string personId, string password, double balance, double overdraft)
: base(aid, aname, personId, password, balance)
{
this.overdraft = overdraft;
}
}
class Program
{
static void Main(string[] args)
{
Bank bk = new Bank();
int choice;
do
{
Console.WriteLine("**************** 欢迎使用银行系统 ****************");
Console.WriteLine("请选择功能(按其它键退出):");
Console.WriteLine("1. 开户");
Console.WriteLine("2. 登录");
choice = Convert.ToInt32(Console.ReadLine());
if (choice != 1 && choice != 2)
{
Console.WriteLine("感谢您的使用,欢迎下次光临!");
break;
}
switch (choice)
{
case 1:
bk.openAccount();
break;
case 2:
bk.login();
break;
}
} while (choice != 0);
}
}
}
任务小结
- C#使用try,catch,throw和finally来处理C#异常。
- 被监控的代码写在try块中,用来捕获和处理异常的代码写在catch块中,finally中放置必须要执行的代码。
- 要手动引发异常,可以使用关键字throw。抛到方法外部的任何异常都必须用throws子句指定
上一篇:C#应用实训|任务2 银行卡账户类定义
下一篇:C#应用实训|项目三 知识拓展