C#实现模拟ATM自动取款机功能

目录
  • (1)关于用户帐号的类:Account
  • (2)关于银行数据库的类:BankDatabase
  • (3)关于ATM屏幕显示的类:Screen
  • (4)关于ATM键盘的类:Keypad
  • (5)关于进钞、出钞口的类:DepositSlot
  • (6)关于ATM出钱的类:CashDispendser
  • (7)关于事务的基类:Transaction
  • (8)关于查询的事务类:BalanceInquiry
  • (9)关于取款的事务类:Withdrawl
  • (10)关于存款的事务类:Deposit
  • (11)关于ATM本身的类:ATM
  • (12)运行

本篇用C#实现ATM自动取款机的一些功能。面临的第一个问题是:如何把与自动取款机相关的有形的、无形的方面抽象出来。

(1)关于用户帐号的类:Account

该类包含与卡号、密码、可用余额、总余额相关的字段和属性,比提供了存款和取款的方法。

namespace MyATM
{
    /// <summary>
    /// 用户帐号
    /// </summary>
    public class Account
    {
        private int accountNumber; //卡号
        private int pin;//用来验证
        private decimal availableBalance;//可用余额
        private decimal totalBalance;//总余额
        public Account(int theAccountNumber, int thePIN, decimal theAvailableBalance, decimal theTotalBalance)
        {
            accountNumber = theAccountNumber;
            pin = thePIN;
            availableBalance = theAvailableBalance;
            totalBalance = theTotalBalance;
        }
        //卡号 只读属性
        public int AccountNumber
        {
            get { return accountNumber; }
        }
        //可提取余额 只读属性
        public decimal AvailableBalance
        {
            get { return availableBalance; }
        }
        //总余额 只读属性
        public decimal TotalBalance
        {
            get { return totalBalance; }
        }
        //验证输入密码是否正确
        public bool ValidatePIN(int userPIN)
        {
            return (userPIN == pin);
        }
        //存款
        public void Credit(decimal amount)
        {
            totalBalance += amount;
        }
        //取款
        public void Debit(decimal amount)
        {
            availableBalance -= amount;
            totalBalance -= amount;
        }
    }
}

(2)关于银行数据库的类:BankDatabase

该类维护着一个Account类型的数组,并提供验证用户,查询余额,存款、取款等方法。

namespace MyATM
{
    /// <summary>
    /// 银行数据库
    /// </summary>
    public class BankDatabase
    {
        private Account[] accounts;
        public BankDatabase()
        {
            accounts = new Account[2];
            accounts[0] = new Account(12345,54321,1000.00M, 1200.00M);
            accounts[1] = new Account(98765, 56789, 200.00M, 200.00M);
        }
        //根据用户银行卡号获取该用户帐号
        private Account GetAccount(int accountNumber)
        {
            foreach (Account currentAccount in accounts)
            {
                if (currentAccount.AccountNumber == accountNumber)
                {
                    return currentAccount;
                }
            }
            return null;
        }
        //验证用户,根据卡号和密码
        public bool AuthenticateUser(int userAccountNumber, int userPIN)
        {
            //先根据卡号获取帐号
            Account userAccount = GetAccount(userAccountNumber);
            if (userAccount != null)
            {
                return userAccount.ValidatePIN(userPIN);
            }
            else
            {
                return false;
            }
        }
        //返回可提取的余额,根据卡号
        public decimal GetAvailableBalance(int userAccountNumber)
        {
            Account userAccount = GetAccount(userAccountNumber);
            return userAccount.AvailableBalance;
        }
        //返回所有余额
        public decimal GetTotalBalance(int userAccountNumber)
        {
            Account userAccount = GetAccount(userAccountNumber);
            return userAccount.TotalBalance;
        }
        //给用户存款
        public void Credit(int userAccountNumber, decimal amount)
        {
            Account userAccount = GetAccount(userAccountNumber);
            userAccount.Credit(amount);
        }
        //给用户取款
        public void Debit(int userAccountNumber, decimal amount)
        {
            Account userAccount = GetAccount(userAccountNumber);
            userAccount.Debit(amount);
        }
    }
}

(3)关于ATM屏幕显示的类:Screen

该类提供了分行显示、不分行显示、显示金额这3个方法。

using System;
namespace MyATM
{
    /// <summary>
    /// 屏幕
    /// </summary>
    public class Screen
    {
        //显示不分行的信息
        public void DisplayMessage(string message)
        {
            Console.Write(message);
        }
        //显示分行的信息
        public void DisplayMessageLine(string message)
        {
            Console.WriteLine(message);
        }
        //显示金额
        public void DisplayDollarAmmount(decimal amount)
        {
            Console.Write("{0:c}", amount);
        }
    }
}

(4)关于ATM键盘的类:Keypad

该类的职责很明确,就是把输入的数字返回。

using System;
namespace MyATM
{
    /// <summary>
    /// 输入键盘
    /// </summary>
    public class Keypad
    {
        //根据用户输入,返回一个整型
        public int GetInput()
        {
            return Convert.ToInt32(Console.ReadLine());
        }
    }
}

(5)关于进钞、出钞口的类:DepositSlot

该类主要是确认进钞、出钞口是否收到钱,默认返回true。

namespace MyATM
{
    /// <summary>
    /// 存款槽
    /// </summary>
    public class DepositSlot
    {
        //判断是否收到钱
        public bool IsMoneyReceived()
        {
            return true;
        }
    }
}

(6)关于ATM出钱的类:CashDispendser

就像在现实生活中,ATM中肯定会预先存放一些人民币,出钱的时候首先要判断余额是否足够,如果足够就把ATM中当前的票数做适当的减法。

namespace MyATM
{
    /// <summary>
    /// ATM取款
    /// </summary>
    public class CashDispendser
    {
        private const int INITIAL_COUNT = 500;//初始票数
        private int billCount;//当前取款机内票数
        public CashDispendser()
        {
            billCount = INITIAL_COUNT;
        }
        //出钱
        public void DispenseCash(decimal amount)
        {
            int billsRequired = ((int)amount) / 20;
            billCount -= billsRequired;
        }
        //判断是否有余额
        public bool IsSufficientCashAvailable(decimal amount)
        {
            //假设取款机内钞票的面值是20
            int billsRequired = ((int) amount)/20;
            return (billCount >= billsRequired);
        }
    }
}

(7)关于事务的基类:Transaction

我们可以回想一下,现实生活中,ATM的主要功能包括:查询余额,取款,存款等。虽然执行的过程不尽相同,但所有的这些事务包含相同的部分:比如说,必须有屏幕必须针对卡号一定和数据库打交道,等等。于是,我们先抽象出一个有关事务的基类,这个基类是不需要被实例化的,所以把它定义成抽象类。如下:

namespace MyATM
{
    /// <summary>
    /// ATM事务
    /// </summary>
    public abstract class Transaction
    {
        private int accountNumber;//卡号
        private Screen userScreen;//屏幕
        private BankDatabase database;//银行数据库
        public Transaction(int userAccount, Screen theScreen, BankDatabase theDatabase)
        {
            accountNumber = userAccount;
            userScreen = theScreen;
            database = theDatabase;
        }
        //银行卡号属性 只读
        public int AccountNumber
        {
            get { return accountNumber; }
        }
        //用户使用的屏幕属性 只读
        public Screen UserScreen
        {
            get { return userScreen; }
        }
        //用户使用的数据库 只读
        public BankDatabase Database
        {
            get { return database; }
        }
        //抽象方法 子类必须重写
        public abstract void Execute();
    }
}

以上,在其它有关事务的派生类中都可以访问到基类的只读属性,并且子类必须重写抽象基类的Execute方法。

(8)关于查询的事务类:BalanceInquiry

该类调用Database类的方法查询可用余额和总余额。

namespace MyATM
{
    /// <summary>
    /// ATM余额查询事务
    /// </summary>
    public class BalanceInquiry : Transaction
    {
         public BalanceInquiry(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase) : base(userAccountNumber, atmScreen, atmBankDatabase){}
        public override void Execute()
        {
            //获取可用余额
            decimal availableBalance = Database.GetAvailableBalance(AccountNumber);
            //获取总余额
            decimal totalBalance = Database.GetTotalBalance(AccountNumber);
            //打印信息
            UserScreen.DisplayMessageLine("\n余额信息为:");
            UserScreen.DisplayMessage(" -可用余额为:");
            UserScreen.DisplayDollarAmmount(availableBalance);
            UserScreen.DisplayMessage("\n -总余额为:");
            UserScreen.DisplayDollarAmmount(totalBalance);
            UserScreen.DisplayMessageLine("");
        }
    }
}

(9)关于取款的事务类:Withdrawl

当用户输入取款的金额,该类必须要做的事情是:在用户的银行数据库中和ATM上做相应的减法,还必须考虑什么时候退出循环,用户是否按了取消键,用户账户上是否有余额,以及ATM中是否有余额。

namespace MyATM
{
    /// <summary>
    /// ATM取款事务
    /// </summary>
    public class Withdrawl : Transaction
    {
        private decimal amount;//取款金额
        private Keypad keypad;//键盘
        private CashDispendser cashDispenser;//出钱
        private const int CANCELED = 6;//对应菜单中的取消
        public Withdrawl(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase, Keypad atmKeypad,
            CashDispendser atmCashDispenser) : base(userAccountNumber, atmScreen, atmBankDatabase)
        {
            keypad = atmKeypad;
            cashDispenser = atmCashDispenser;
        }
        public override void Execute()
        {
            bool cashDispensed = false; //表示还没出钱
            bool transactionCanceled = false; //表示不取消事务
            do
            {
                int selection = DisplayMenuOfAmounts();
                if (selection != CANCELED)//如果用户没有按取消
                {
                    amount = selection; //确定取款金额
                    //根据卡号获取可用余额
                    decimal availableBalance = Database.GetAvailableBalance(AccountNumber);
                    if (amount <= availableBalance)//如果取款金额小于可用余额
                    {
                        if (cashDispenser.IsSufficientCashAvailable(amount))//如果ATM余额足够
                        {
                            Database.Debit(AccountNumber, amount);//账户扣款
                            cashDispenser.DispenseCash(amount);//ATM扣款
                            cashDispensed = true;//跳出循环
                            UserScreen.DisplayMessageLine("\n您可以拿着钱离开了~~");
                        }
                        else//如果ATM余额不够
                        {
                            UserScreen.DisplayMessageLine("\n ATM余额不足." + "\n\n请提取更小的金额~~");
                        }
                    }
                    else
                    {
                        UserScreen.DisplayMessageLine("\n 账户余额不足." + "\n\n请提取更小的金额~~");
                    }
                }
                else //如果用户按了取消,提示正在退出并跳出循环
                {
                    UserScreen.DisplayMessageLine("\n正在取消......");
                    transactionCanceled = true;
                }
            } while ((!cashDispensed) && (!transactionCanceled));
        }
        /// <summary>
        /// 显示提款金额
        /// </summary>
        /// <returns></returns>
        private int DisplayMenuOfAmounts()
        {
            int userChoice = 0; //默认提款金额
            int[] amounts = {0, 20, 40, 60, 100, 200};
            while (userChoice ==0)
            {
                //显示菜单
                UserScreen.DisplayMessageLine("\nWithdrawal options:");
                UserScreen.DisplayMessageLine("1-20元");
                UserScreen.DisplayMessageLine("2-40元");
                UserScreen.DisplayMessageLine("3-60元");
                UserScreen.DisplayMessageLine("4-100元");
                UserScreen.DisplayMessageLine("5-200元");
                UserScreen.DisplayMessageLine("6-取消操作");
                UserScreen.DisplayMessage("\n输入数字(1-6),选择选项:");
                int input = keypad.GetInput();
                switch (input)
                {
                    case 1: case 2: case 3: case 4: case 5:
                        userChoice = amounts[input];
                        break;
                    case CANCELED:
                        userChoice = CANCELED;
                        break;
                    default:
                        UserScreen.DisplayMessageLine("\n输入无效数,请重试~~");
                        break;
                }

            }
            return userChoice;
        }
    }
}

以上,
维护的amount变量表示的是取款金额,在每次用户输入提款金额后为该变量赋值。

Keypad类型的变量kepad和CashDispendser类型的变量cashDispenser需要在构造函数中为其赋初值,而这2个因素是在取款时特有的,在事务的抽象基类中不需要考虑这2个因素。

通过DisplayMenuOfAmounts方法,会向用户显示一些面值,以及对应的数字键,然后根据用户按下的数字键返回对应的、int类型的面值。

在Execute方法中,首先循环的2个条件是用户没有按取消键和还没出钱的时候。然后把DisplayMenuOfAmounts方法的返回值赋值给表示取款金额的amount变量,据此判断用户账户的余额是否足够,判断ATM的余额是否足够,最后在用户账户和ATM中分别扣款。这期间,如果用户按了取消键,就把表示取消事务的变量transactionCanceled设置为true以跳出循环,完成扣款后把表示扣款完成的变量cashDispensed设置为true以跳出循环。

(10)关于存款的事务类:Deposit

该类最终是使用Database属性把用户输入的金额保存到用户账户上。另外需要考虑的是:用户在存款的时候是否按了取消键。

namespace MyATM
{
    /// <summary>
    /// ATM存款事务
    /// </summary>
    public class Deposit : Transaction
    {
        private decimal amount;
        private Keypad keypad;
        private DepositSlot depositSlot;
        private const int CANCELED = 0;
        public Deposit(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase, Keypad atmKeypad,
            DepositSlot atmDepositSlot) : base(userAccountNumber, atmScreen, atmBankDatabase)
        {
            keypad = atmKeypad;
            depositSlot = atmDepositSlot;
        }
        public override void Execute()
        {
            //确定存款金额
            amount = PromptForDepositAmount();
            if (amount != CANCELED)
            {
                UserScreen.DisplayMessage("\n请输入的存款金额为" + amount);
                //确认是否收到钱
                bool isReceived = depositSlot.IsMoneyReceived();
                if (isReceived)
                {
                    UserScreen.DisplayMessageLine("\n存款成功~~");
                    Database.Credit(AccountNumber, amount);//存款到账户
                }
                else
                {
                    UserScreen.DisplayMessageLine("\n存款时发生错误~~");
                }
            }
            else
            {
                UserScreen.DisplayMessageLine("\n正在取消交易......");
            }
        }
        /// <summary>
        /// 显示存款金额
        /// </summary>
        /// <returns></returns>
        private decimal PromptForDepositAmount()
        {
            UserScreen.DisplayMessage("\n请输入存款金额(输入0退出)");
            int input = keypad.GetInput();
            if (input == CANCELED)
            {
                return CANCELED;
            }
            else
            {
                return input;
            }
        }
    }
}

以上,
私有方法PromptForDepositAmount用来返回用户输入的金额,如果用户按取消键,就返回0。

(11)关于ATM本身的类:ATM

该类主要是提供给外部一个方法用来运行。

namespace MyATM
{
    public class ATM
    {
        private bool userAuthenticated;//表示用户是否验证通过
        private int currentAccountNumber;//当前交易的银行卡号
        private Screen screen;//屏幕
        private Keypad keypad;//键盘
        private CashDispendser cashDispendser;//出款
        private DepositSlot depositSlot;//存款
        private BankDatabase bankDatabase;//数据库
        //菜单选项枚举
        private enum MenuOption
        {
            BANLANCE_INQUIRY = 1,//余额查询
            WITHDRAWAL = 2,//取款
            DEPOSIT = 3,//存款
            EXIT_ATM = 4//退出
        }
        public ATM()
        {
            userAuthenticated = false;//默认验证不通过
            currentAccountNumber = 0;//默认卡号
            screen = new Screen();//默认屏幕
            keypad = new Keypad();//默认键盘
            cashDispendser = new CashDispendser();//默认出款帮助类
            bankDatabase = new BankDatabase();//默认银行数据库
            depositSlot = new DepositSlot();//默认存款帮助类
        }
        //运行
        public void Run()
        {
            while (true)
            {
                while (!userAuthenticated)//如果用户没有验证通过,就一直循环
                {
                    screen.DisplayMessageLine("\n欢迎");
                    AuthenticateUser();
                    PerormTransactions();
                    //重新设置一些参数
                    userAuthenticated = false;
                    currentAccountNumber = 0;
                    screen.DisplayMessageLine("\n谢谢,再见~~");
                }
            }
        }
        //验证用户
        private void AuthenticateUser()
        {
            screen.DisplayMessage("\n请输入卡号");
            int accountNumber = keypad.GetInput();
            screen.DisplayMessage("\n输入密码");
            int pin = keypad.GetInput();
            userAuthenticated = bankDatabase.AuthenticateUser(accountNumber, pin);
            if (userAuthenticated)
            {
                currentAccountNumber = accountNumber; //保存当前的用户卡号
            }
            else
            {
                screen.DisplayMessageLine("无效的卡号或密码,请重试~~");
            }
        }
        //执行交易
        private void PerormTransactions()
        {
            Transaction currenTransaction;
            bool userExited = false; //用户还没选择退出
            while (!userExited)
            {
                //确定选择的具体事务
                int mainMenuSelction = DisplayMainMenu();
                switch ((MenuOption)mainMenuSelction)
                {
                    case MenuOption.BANLANCE_INQUIRY:
                    case MenuOption.WITHDRAWAL:
                    case MenuOption.DEPOSIT:
                        currenTransaction = CreateTransaction(mainMenuSelction);
                        currenTransaction.Execute();
                        break;
                    case MenuOption.EXIT_ATM:
                        screen.DisplayMessageLine("\n正在退出系统......");
                        userExited = true;//退出循环
                        break;
                    default:
                        screen.DisplayMessageLine("\n无效选项,请重新选择~~");
                        break;
                }
            }
        }
        //显示菜单
        private int DisplayMainMenu()
        {
            screen.DisplayMessageLine("\n主菜单:");
            screen.DisplayMessageLine("1-查询余额");
            screen.DisplayMessageLine("2-提取现金");
            screen.DisplayMessageLine("3-存款");
            screen.DisplayMessageLine("4-退出\n");
            screen.DisplayMessage("请输入选择:");
            return keypad.GetInput();
        }
        //创建交易
        private Transaction CreateTransaction(int type)
        {
            Transaction temp = null;
            switch ((MenuOption)type)
            {
                case MenuOption.BANLANCE_INQUIRY:
                    temp = new BalanceInquiry(currentAccountNumber, screen, bankDatabase);
                    break;
                case MenuOption.WITHDRAWAL:
                    temp = new Withdrawl(currentAccountNumber, screen, bankDatabase, keypad, cashDispendser);
                    break;
                case MenuOption.DEPOSIT:
                    temp = new Deposit(currentAccountNumber, screen, bankDatabase, keypad, depositSlot);
                    break;
            }
            return temp;
        }
    }
}

以上,
向外部提供了一个Run方法,客户端只要调用该实例方法就可以了。在Run方法内部又实现了对用户的验证和进行用户选择的事务。

私有方法DisplayMainMenu用来显示主菜单项,并返回用户的选择。

在PerormTransactions方法中,根据用户的选择,使用CreateTransaction(int type)方法创建具体的事务,并最终执行。并需要考虑用户按退出按钮的情况。

(12)运行

using System;
namespace MyATM
{
    class Program
    {
        static void Main(string[] args)
        {
            ATM theATM = new ATM();
            theATM.Run();
            Console.ReadKey();
        }
    }
}

总结:ATM案例很好地体现了面向对象的一些特点,尤其是:当我们面对一个看似复杂的案例时,首先需要一种对有形和无形事物抽象的能力,其次要尽可能地把代码中一些重复的部分提炼到基类中去,就像本案例中有关事务的抽象基类。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C#泛型集合类型实现添加和遍历

    在"C#中List<T>是怎么存放元素的"中,分析了List<T>的源码,了解了List<T>是如何存放元素的.这次,就自定义一个泛型集合类型,可实现添加元素,并支持遍历 该泛型集合类型一定需要一个添加元素的方法,在添加元素的时候需要考虑:当添加的元素超过当前数组的容量,就让数组扩容:为了支持循环遍历,该泛型集合类型必须提供一个迭代器(实现IEnumerator接口). public class MyList<T> { T[] items

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

    账户类Account:Id:账户号码PassWord:账户密码Name:真实姓名PersonId:身份证号码Email:客户的电子邮箱Balance:账户余额 Deposit:存款方法,参数是double型的金额Withdraw:取款方法,参数是double型的金额 银行的客户分为两种类型:储蓄账户(SavingAccount)和信用账户(CreditAccount)两者的区别是储蓄账户不许透支,而信用账户可以透支,并允许用户设置自己的透支额度(使用ceiling表示) Bank类,属性如下(1

  • C#中数组扩容的几种方式介绍

    假设有一个规定长度的数组,如何扩容呢?最容易想到的是通过如下方式扩容: class Program { static void Main(string[] args) { int[] arrs = new[] {1, 2, 3, 4, 5}; arrs[5] = 6; } } 报错:未处理IndexOutOfRanageException,索引超出了数组界限. 创建一个扩容的临时数组,然后赋值给原数组,使用循环遍历方式 static void Main(string[] args) { int[

  • C#实现观察者模式(Observer Pattern)的两种方式

    在观察者模式中有2个要素:一个是被观察对象,另一个是观察者.但被观察对象的状态发生改变会通知观察者. 举例:把订阅报纸的人看作是观察者,把报纸看作被观察对象.每当有新的新闻就要通知订阅报纸的人.本篇分别用实现接口和使用委托事件的方式来实现. 通过实现接口实现 观察者接口,把接收到的新闻显示出来. public interface IObserver { void Update(string news); } 被观察对象接口,提供3个方法:注册观察者,取消观察者,通知观察者. public int

  • C#抽象类的用法介绍

    假设有2个类,一个类是主力球员,一个类是替补球员. public class NormalPlayer { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public decimal WeekSalary { get; set; } public string GetFullName() { return this.FirstName +

  • C#中使用Microsoft Unity记录日志

    需要记录日志的地方包括:进入方法的时候,传参的时候,统计执行时间,方法返回参数的时候,退出语句块的时候,出现异常的时候,等等.先来体验不使用Micirosoft Unity进行日志记录. class Program { static void Main(string[] args) { Add(1, 2); Console.ReadKey(); } private static int Add(int a, int b) { int result = 0; string temp = strin

  • C#中的yield关键字详解

    在"C#中,什么时候用yield return"中,我们了解到:使用yield return返回集合,不是一次性加载到内存中,而是客户端每调用一次就返回一个集合元素,是一种"按需供给".本篇来重温yield return的用法,探秘yield背后的故事并自定义一个能达到yield return相同效果的类,最后体验yield break的用法. 回顾yield return的用法 以下代码创建一个集合并遍历集合. class Program { static Ran

  • C# 设置Chart的X轴为时间轴​​​​​​​详情

    目录 前言 界面设计 效果展示 代码逻辑 前言 将Chart的X轴设置为时间轴是一个说简单不简单的问题,说难也不难的问题,你用过之后呢就感觉很容易,你没用过呢,就比较难,所以这个是很值得我们学习的,我看了别的社区也没有具体讲,所以我想分享一下,万一我自己忘记了,也可以翻这篇文章去复习,我们一起来学习一下吧,虽然这篇文章比较简单,也是值得学习的,创作不易,点赞关注评论收藏,谢谢大家啦!!! 界面设计 对界面的设计,使用timer定时器按照每秒循环生成随机数添加进Chart里面,使我们实现每秒添加值

  • C#实现模拟ATM自动取款机功能

    目录 (1)关于用户帐号的类:Account (2)关于银行数据库的类:BankDatabase (3)关于ATM屏幕显示的类:Screen (4)关于ATM键盘的类:Keypad (5)关于进钞.出钞口的类:DepositSlot (6)关于ATM出钱的类:CashDispendser (7)关于事务的基类:Transaction (8)关于查询的事务类:BalanceInquiry (9)关于取款的事务类:Withdrawl (10)关于存款的事务类:Deposit (11)关于ATM本身的

  • C语言实现ATM自动取款机系统的示例代码

    目录 基于C语言的ATM自动取款机系统项目设计与开发 一.ATM自动取款机系统功能分析与介绍 二.开发ATM自动取款机系统的工具以及创建项目的过程 ATM自动取款机系统的设计与开发的步骤 一.设计登入页面的显示功能 二.设计登入页面退出功能 三.设计登入页面登入和系统主页面显示的功能 四.设计主页面修改用户密码的功能 五.设计主页面查询用户余额的功能 六.设计主页面用户取款的功能 七.设计主页面用户存款的功能 八.返回登入页面的功能 总结 基于C语言的ATM自动取款机系统项目设计与开发 一.AT

  • JavaWeb使用Cookie模拟实现自动登录功能(不需用户名和密码)

    其中包含两个jsp文件,分别为login.jsp和index.jsp 代码如下: login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

  • Python使用Selenium模拟浏览器自动操作功能

    概述 在进行网站爬取数据的时候,会发现很多网站都进行了反爬虫的处理,如JS加密,Ajax加密,反Debug等方法,通过请求获取数据和页面展示的内容完全不同,这时候就用到Selenium技术,来模拟浏览器的操作,然后获取数据.本文以一个简单的小例子,简述Python搭配Tkinter和Selenium进行浏览器的模拟操作,仅供学习分享使用,如有不足之处,还请指正. 什么是Selenium? Selenium是一个用于Web应用程序测试的工具,Selenium测试直接运行在浏览器中,就像真正的用户在

  • Python模拟百度自动输入搜索功能的实例

    如下所示: # 访问百度,模拟自动输入搜索 # 代码中引入selenium版本为:3.4.3 # 通过Chrom浏览器访问发起请求 # Chrom版本:59 ,chromdriver:2.3 # 需要对应版本的Chrom和chromdriver # 请联系QQ:878799579 from selenium import webdriver # 引入Keys类包 发起键盘操作 from selenium.webdriver.common.keys import Keys import time

  • java模拟ATM功能(控制台连接Mysql数据库)

    本文实例为大家分享了java模拟ATM功能的具体代码,供大家参考,具体内容如下 有三个类:Test.java.Customer.java.CustomerDAO.java.ATMSystem.java ATMSystem.java实现模拟ATM的功能 Customer.java创建一个用户对象 CustomerDAO.java实现连接数据库 Test为主程序 ATMSystem.java: package ATM; import java.util.Scanner; public class A

  • C语言简单实现银行ATM存取款功能

    这里使用的运行工具是DEV C++.老铁们一定要看仔细了.是DEV C++ 一.课程设计的目的 掌握C语言程序设计的基础知识.基本理论.原理和实现技术. 二.课程设计的题目 银行ATM存取款系统 三.设计内容(主要技术关键的分析.解决思路和方案比较等) 银行ATM存取款系统 银行ATM存取款系统业务描述如下: 银行ATM存取款系统能为用户提供存款.取款.查询.转账和修改密码的功能.为了模拟真实的ATM业务环境,本系统必须实现存款.取款.查询.转账.修改密码以及开户的功能.用户通过开户业务在本系统

  • js实现form自动完成功能

    最近我做一个员工注册页面, 有一项是注册公司, 但是如果公司已经被注册, 要求公司名称写的完全一样, 不能有大小写区别等, 所以我打算使用Javascript写一个模拟自动完成的功能, 样式仿照了IE7的, 还有很多不足, 希望大家支持. www.jb51.net 我们 自动完成功能 Test: a.value.length) { y[q] = z[p]; q++; } } if(y.length > 0) { b.innerHTML = ''; for(var r = 0; r b.child

  • 分步解析JavaScript实现tab选项卡自动切换功能

    本文分享一个能够实现自动切换的选项卡功能,并给出它的具体实现过程. 关于选项卡大家一定不会陌生,应用非常的频繁,通常选项卡都是需要点击或者划过才能够实现切换. 代码实例如下: <html> <head> <meta charset=" utf-8"> <title>tab切换</title> <style type="text/css"> body,h2,p{ margin:0px; paddi

  • php模拟用户自动在qq空间发表文章的方法

    本文实例讲述了php模拟用户自动在qq空间发表文章的方法.分享给大家供大家参考.具体分析如下: 我们这里是一个简单的利用php来模拟登录后再到QQ空间发送文章的一个简单的程序,有需要的朋友可以参考,或改进可以给我意见,代码如下: 复制代码 代码如下: <?php //模拟get post请求函数 /* 函数说明: 功能:请求方式可以get,post,可以发送的cookie,保存的cookiefile文件 参数:$url-----请求url    $referer---来源url    $post

随机推荐