c#控制台应用程序ATM银行操作实例。主要介绍了设计的方法;使用的类介绍;具体的运行界面;程序代码。代码直接写在一起放在Programm.cs中,拷贝可直接运行。

一、设计

1、原则上采用三层:(1)操作界面层;(2)银行管理中间层;(3)底层账户

2、操作界面层 到 银行中间层 到底层账户

二、三个类

1、ATM类:界面类,显示各种操作界面

2、Bank类:银行账号存储及操作,如删除账户、寻找账号、获得所有账号等等

3、Account类:存储某个账户的数据及操作,如收入、支出、获得余额、获得所有存取记录

三、主要运行界面

四、具体代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;

namespace ATMApp
{  
    [Serializable]
    
    class ATM
    {
        public static Bank icbcbank = new Bank("ICBC");
        
        static void Main(string[] args)
        {
            LoadIcbcBankInfo();
            string code = "";
            do
            {
                Console.Clear();
                Console.Title = "ATM";
                Console.WriteLine("    " + icbcbank.bankName + "模拟ATM");
                Console.WriteLine("---------------------");
                Console.WriteLine("1.登录 2.开户 0.退出");
                Console.WriteLine("--------------------");
                Console.Write("请选择:");
                code = Console.ReadLine();
                if (code == "1")
                    ATMLoginAccountUI();
                else if (code == "2")
                    ATMOpenAccountUI();
                else if (code == "3")
                {
                    foreach (Account account in icbcbank.GetAllAccounts())
                    {
                        Console.WriteLine(account.accountNo);
                    }
                    Console.ReadKey();
                }
            } while (code != "0");
            SaveIcbcBankInfo();
            Console.WriteLine("按一下任意键退出系统...");
        }
        
        public static void ATMLoginAccountUI()
        {
            Console.Clear();
            Console.WriteLine("登录");
            Console.WriteLine("--------------");
            Console.Write("输入你的账号:");
            string accNo = Console.ReadLine();
            Console.Write("输入你的密码:");
            string pwd = Console.ReadLine();
            if (!icbcbank.LoginAccount(accNo, pwd))
            {
                Console.WriteLine("无账号或密码不对!");
                Console.ReadKey();
                return;          //返出该方法
            }
            else
            {
                ShowMenuUI(accNo);
            }
        }
        
        public static void ShowMenuUI(string accNo)
        {
            do
            {
                Console.Clear();
                Console.WriteLine("   交易菜单");
                Console.WriteLine("--------------");
                Console.WriteLine("账号:" + accNo);
                Console.WriteLine("--------------");
                Console.WriteLine("1.查余额");
                Console.WriteLine("2.取  款");
                Console.WriteLine("3.存  款");
                Console.WriteLine("4.转  账"); // 转账功能还没有做
                Console.WriteLine("5.查交易");
                Console.WriteLine("6.改密码");
                Console.WriteLine("7.销账号");
                Console.WriteLine("0.退  出");
                Console.WriteLine("---------------");
                Console.Write("请选择:");
                switch (Console.ReadLine())
                {
                    case "1":
                        DisplayBalanceUI(accNo);
                        break;
                    case "2":
                        WithdrawUI(accNo);
                        break;
                    case "3":
                        depositUI(accNo);
                        break;
                    case "6":
                        ChangePasswordUI(accNo);
                        break;
                    case "5":
                        QueryAccountTransUI(accNo);
                        break;
                    case "7":
                        DelAccountUI(accNo);
                        break;
                    case "0":
                        return;
                }
            } while (true);
        }
        
        public static void DelAccountUI(string AccNo)
        {
            Console.Write("是否真的要销户(y/n)?");
            string answer = Console.ReadLine();
            if ("y" == answer)
            {
                if (!icbcbank.DelAccountById(AccNo))
                {
                    Console.WriteLine("账户余额为不为0,不能销户!");
                    Console.ReadKey();
                }
                else
                {
                    Console.WriteLine("销户成功,欢迎再来!");
                    Console.ReadKey();
                    SaveIcbcBankInfo();//别忘,因为是非正常退出应用程序                  
                    Environment.Exit(0);//直接强制退出应用程序.有点暴力哦,哈哈哈—老猪新作。
                }
            }
        }
        
        public static void QueryAccountTransUI(string AccNo)
        {
            Console.WriteLine("\t   所有交易记录");
            Console.WriteLine("\t   ——————");

            Console.WriteLine("{0,-14}\t{1,-10}", "交易时间", "  交易金额");
            Console.WriteLine();
            foreach (var item in icbcbank.GetAccountRecords(AccNo))
            {
                Console.WriteLine("{0,-14}\t{1,10}", item.Key.ToString("yyyy/MM/dd HH:mm"), item.Value.ToString("+#.##;-#.##;0"));        //大写HH是24小时制
                Console.WriteLine("—————————————————");
            }
            Console.WriteLine("{0,-14}\t{1,10}", "目前余额", icbcbank.GetBalanceByAccountNo(AccNo).ToString("+#.##;-#.##;0"));

            Console.ReadKey();
        }
        
        public static void ChangePasswordUI(string AccNo)
        {
            Console.Write("输入老的密码:");
            string oldpwd = Console.ReadLine();
            Console.Write("输入新的密码:");
            string newpwd = Console.ReadLine();
            if (icbcbank.ChangePasword(AccNo, oldpwd, newpwd))
            {
                Console.WriteLine("成功修改");
            }
            else
                Console.WriteLine("成功不修改");
            Console.ReadKey();
        }
        
        public static void depositUI(string AccNo)
        {
            Console.Write("输入存款金额:");
            double amount = Convert.ToDouble(Console.ReadLine());
            if (!icbcbank.DepositAccount(AccNo, amount))
            {
                Console.WriteLine("存款不成功");
            }
            else
                Console.WriteLine("存款成功");
            Console.ReadKey();
        }
        
        public static void WithdrawUI(string AccNo)
        {
            Console.Write("输入取款金额:");
            double amount = Convert.ToDouble(Console.ReadLine());
            if (!icbcbank.WithdrawAccount(AccNo, amount))
            {
                Console.WriteLine("取款不成功,余额可能不足");
            }
            else
                Console.WriteLine("取款成功!,取款{0}元,余额{1}元", amount, icbcbank.GetBalanceByAccountNo(AccNo));
            Console.ReadKey();
        }
       
        public static void DisplayBalanceUI(string AccNo)
        {
            Console.Write("账户余额为:" + icbcbank.GetBalanceByAccountNo(AccNo));
            Console.ReadKey();
        }
        
        public static void ATMOpenAccountUI()
        {
            Console.Clear();
            Console.WriteLine("开户");
            Console.WriteLine("--------------");
            Console.Write("你要的账号:");
            string accNo = Console.ReadLine();
            Console.Write("你设的密码:");
            string pwd = Console.ReadLine();
            if (accNo == "" || pwd == "")
            {
                Console.WriteLine("用户名密码不能为空,开户失败!");
                Console.ReadKey();
                return;
            }
            if (!icbcbank.OpenAccount(accNo, pwd))
            {
                Console.WriteLine("可能已经存在,开户错误!");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("开户成功!");
            Console.ReadKey();
            ShowMenuUI(accNo);
        }
        
        static void LoadIcbcBankInfo()
        {
            ///1、文件存在不
            ///2、读文件
            ///3、二进制
            ///4、反序列读到当前静态银行bank
            if (File.Exists("bank.dat"))
            {
                FileStream fs = new FileStream("bank.dat", FileMode.Open, FileAccess.Read);
                BinaryFormatter bf = new BinaryFormatter();
                icbcbank = bf.Deserialize(fs) as Bank;
                fs.Close();
            }
        }
        
        static void SaveIcbcBankInfo()
        {
            ///1、建立bank
            ///2、二进制化
            ///3、序列化
            FileStream fs = new FileStream("bank.dat", FileMode.Create, FileAccess.Write);
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, icbcbank);
            fs.Close();
        }
    }
    
    class Bank
    {
        public string bankName;         //存放银行对象名称变量
        public ArrayList accounts;      //用ArrayList类型,存放银行所有账户对象变量
        public double rateinterest;

        public Bank(string bankname)
        {
            this.bankName = bankname;
            accounts = new ArrayList();
            rateinterest = 0.005;
        }

        public bool OpenAccount(string id, string pwd)
        {
            foreach (Account acc in accounts)
            {
                if (acc.accountNo == id)
                {
                    return false;
                }
            }
            Account account = new Account(id, pwd);
            accounts.Add(account);
            return true;
        }

        public ArrayList GetAllAccounts()
        {
            return accounts;
        }
        
        public Account Find(string AccNo)
        {
            foreach (Account item in accounts)
            {
                if (item.accountNo == AccNo)
                    return item;
            }
            return null;
        }

        internal bool LoginAccount(string AccNo, string pwd)
        {
            Account account = Find(AccNo);
            if (account != null && account.Login(AccNo, pwd))  //如果账号null。所以加account!=null
                return true;
            else
                return false;
        }

        public double GetBalanceByAccountNo(string AccountNo)
        {
            Account account = Find(AccountNo);
            return account.GetBalance();
        }

        internal bool WithdrawAccount(string AccNo, double amount)
        {
            Account account = Find(AccNo);
            return account.Withdraw(amount);
        }

        internal bool DepositAccount(string AccNo, double amount)
        {
            Account account = Find(AccNo);
            return account.Deposit(amount);
        }

        internal bool ChangePasword(string accNo, string oldpwd, string newpwd)
        {
            Account account = Find(accNo);
            return account.ChangePasword(oldpwd, newpwd);
        }

        internal Dictionary<DateTime, double> GetAccountRecords(string accNo)
        {
            Account account = Find(accNo);
            return account.GetRecords();
        }

        internal bool DelAccountById(string AccNo)
        {
            Account account = Find(AccNo);
            if (account.GetBalance() == 0)
            {
                accounts.Remove(account);
                return true;
            }
            return false;
        }
    }

    class Account
    {
        public string accountNo;
        public string password;
        public double balance;
        public DateTime createdTime;
        public Dictionary<DateTime, double> dicRecords; //存放账户所有交易记录字段:交易(存或取)一次记一次

        public Account(string no, string pwd)
        {
            accountNo = no;
            password = pwd;
            balance = 0;
            createdTime = DateTime.Now;
            dicRecords = new Dictionary<DateTime, double>();
            dicRecords[createdTime] = balance;//下面也可以 dicRecords.Add(createdTime,balance);//开户
        }

        public bool Withdraw(double amount)
        {
            if (amount > balance || amount <= 0)
            {
                return false;
            }
            balance -= amount;
            dicRecords.Add(DateTime.Now, -amount);
            return true;
        }

        public bool Deposit(double amount)
        {
            if (amount < 0)
                return false;
            else
            {
                balance += amount;
                dicRecords.Add(DateTime.Now, +amount);
                return true;
            }
        }

        public double GetBalance()
        {
            return balance;
        }

        public bool Login(string no, string pwd)
        {
            if (this.accountNo == no && this.password == pwd)
                return true;
            else
                return false;
        }

        public bool ChangePasword(string oldPwd, string newPwd)
        {
            if (oldPwd != password)
            {
                return false;
            }
            password = newPwd;
            return true;
        }

        public Dictionary<DateTime, double> GetRecords()
        {
            return dicRecords;
        }
    }
}

面向对象基础之基础—控制台C#模拟银行ATM存取操作实例的更多相关文章

  1. java线程基础巩固---采用多线程方式模拟银行排队叫号以及Runnable接口存在的必要性

    采用多线程模拟银行排队叫号: 关于银行拿排队号去叫号的过程我想不必过多解释了,就是有几个业务窗口,并行的处理业务,每处里完一个人,则会叫下一个排队的号去处理业务,一个人是不会被多个窗口工作人员叫号的, ...

  2. 实验01——java模拟银行ATM系统

    用java写的一个模拟银行系统,比较初级. ATM.java package cn.tedu.yinhang; import java.util.Scanner; /** * @author 赵瑞鑫 ...

  3. 模拟银行ATM系统(基础版)

    Account类 package ATM; public class Account {//定义Account类 private String accountID;//用于存储学生的用户账号(由八位数 ...

  4. Java基础面试操作题:线程同步代码块 两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。

    package com.swift; public class Bank_Customer_Test { public static void main(String[] args) { /* * 两 ...

  5. JavaScript 面向对象开发知识基础总结

    JavaScript 面向对象开发知识基础总结 最近看了两本书,书中有些内容对自己还是很新的,有些内容是之前自己理解不够深的,所以拿出来总结一下,这两本书的名字如下: JavaScript 面向对象精 ...

  6. [.net 面向对象编程基础] (3) 基础中的基础——数据类型

    [.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...

  7. [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换

    [.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...

  8. [.net 面向对象编程基础] (5) 基础中的基础——变量和常量

    [.net面向对象编程基础]  (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...

  9. [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式

    [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式 说起C#运算符和表达式,小伙伴们肯定以为很简单,其实要用好表达式,不是一件容易的事.一个好的表达式可以让你做事半功倍的效果,比如 ...

  10. [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句

    [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...

随机推荐

  1. 【分析笔记】全志平台 gpio_wdt 驱动应用和 stack crash 解决

    使用说明 第一次遇到看门狗芯片是通过切换电平信号来喂狗,如 SGM706 芯片,之前也比较少会用到看门狗芯片.原本打算参考 sunxi-wdt.c 的框架,利用定时器自己写一个,无意中发现内核已经有 ...

  2. python学习第八周总结

    多进程实现TCP服务端并发 之前我们学习了用socket模块进行文字以及文件的传输,但是之前的操作一个服务端只能与一个客户端进行交互,如果要想实现多个客户端与服务端交互的并发效果,我们需要进行如下操作 ...

  3. HTTPS基础原理和配置-3

    书接上文:HTTPS 基础原理和配置 - 2,接下来介绍: 配置 NGINX 后端 HTTPS 检查配置 配置 HSTS OCSP Stapling 重要部分来了.如何使用这些选项并配置NGINX? ...

  4. fiddler的简单使用

    一.fiddler接口测试介绍 二.fiddler过滤器的使用 fiddler可以指定只抓哪些包,通过filters实现 如果需要抓取多个网站,各个需要抓取的网站之间用分号隔开 三.fiddler抓取 ...

  5. JS 格式化时间字符串

    // 格式时间字符串 formatDateTimeStr(date, type) { if (date === '' || !date) { return '' } var dateObject = ...

  6. ctfshow_web入门 sql注入(web171~248)

    sql注入 这是算是学习+做题+记录的一个笔记吧,而且基本都是看着Y4师傅的博客做的 由于是做过sqli靶场,所以这个就记录快点了.如果靶场没遇到的,也会做笔记. union 联合注入 web171 ...

  7. ctfshow_web入门 PHP特性

    PHP特性 这里以半做题,半学习为主,所以就显得比较啰嗦 阿巴阿巴,但是实际上,写得比较水,等过一段时间再总结一下 比较深刻的印象是:下一个手册,多看手册 从web135还是几开始,就是看的这个师傅的 ...

  8. JZOJ 100019.A

    \(\text{Problem}\) \(\text{Solution}\) 把形如 \((a,ka)\) 的路径提出来 那么覆盖这些路径的路径为不合法路径 如果能不重不漏的找出这些路径,然后用总路径 ...

  9. JZOJ 3226. 【HBOI2013】ALO

    题目 网上自己搜 解析 区间异或很容易想到可持久化字典树 但本题的关键是如何高效率求出以某个数为区间最大值时这个区间的范围 依题我们知道区间最长可到比它第二大的位置(开区间) 所以我们如果能找到每个数 ...

  10. 代码随想录算法训练营day23 | leetcode 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

    LeetCode 669. 修剪二叉搜索树 分析1.0 递归遍历树时删除符合条件(不在区间中)的节点-如何遍历如何删除 如果当前节点大于范围,递归左树,反之右树 当前节点不在范围内,删除它,把它的子树 ...