一.模拟ATM程序

账户类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;
                }
            }
        }
    }
}

你可能感兴趣的:(模拟)