辜渝傧

13037102709

027-87870986

教学实训

您当前的位置:首页 > 教学资源 > 实训方案 >

C#应用实训|任务3 银行卡账户开户实现

发布者:唯众    布时间:2020-12-12 16:21:00    点击量:

任务描述

        用户进入系统主菜单后,用户选择开户功能后,显示借记卡账户和信用卡账户开户菜单,用户选择其中一种需开户账户后,输入相关开户账户信息,当用户输入信息有误时,能检测出异常并输出相关异常信息;当用户输入信息正确无误后,系统提示开户成功信息。

知识引入

  1. 异常
        异常是程序运行时发生的错误或出现某种意想不到的状态。如被零除、溢出、数组下标越界或内存不足等。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..........");
            }
        }
    }

任务实现

  1. 定义银行账户类
        银行账户类作为借记卡子类和信用卡子类的父类,类中定义了子类共有的属性和开户时需用使用的构造方法。
class Account    //账户类,父类 ,以下是共有属性和方法
{ …….. }
  1. 定义借记卡子类和信用卡子类
        借记卡子类和信用卡子类都继承银行账户类,信用卡子类中添加透支金额属性,两个子类都调用父类的带参构造方法。
  class DebitAcc : Account   //借记卡子类
   { …….. }
 class CreditAccount : Account  //信用卡子类
{ …….. }
  1. 定义银行业务类
       在银行业务类中分别定义新账户开户、登录、存款、取款、查询余额方法,并完成相应功能 ,以实现用户使用借记卡或信用卡完成相应业务。
class Bank   //银行业务类
{
    public void  openAccount( ) { …….. }    // 开户
    public void  login( ) { …….. }     //登录
public void  saveMoney(Account at) { …….. }     //存款
    public void  takeMoney(Account at) { …….. }     //取款
    public void  loopMoney(Account at){ …….. }     //查询余额
}
  1. 实现主菜单方法
        在main主方法中实现,实现主菜单的输出,当选择菜单1时,调用开户方法,当选择菜单2时调用登录方法。
public static void Main(string[] args)
       {…….. }
  1. 编写调试项目三
        新建控制台项目,项目名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);
        }
    }

任务小结

  1. C#使用try,catch,throw和finally来处理C#异常。
  2. 被监控的代码写在try块中,用来捕获和处理异常的代码写在catch块中,finally中放置必须要执行的代码。
  3. 要手动引发异常,可以使用关键字throw。抛到方法外部的任何异常都必须用throws子句指定


上一篇:C#应用实训|任务2 银行卡账户类定义

下一篇:C#应用实训|项目三 知识拓展