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. appium基本使用(Android)

    一.环境搭建 详情可见:https://www.cnblogs.com/lihongtaoya/p/16971096.html 二.元素定位 详情可见:https://www.cnblogs.com/ ...

  2. (8)go-micro微服务Mysql配置

    目录 一 gorm介绍 二 gorm安装 1.1 下载依赖 1.2 使用MySQL驱动 三 CURD操作 1. 查询 1.1 单行查询 1.2 多行查询 2. 插入数据 3. 更新数据 4. 删除数据 ...

  3. [cocos2d-x]关于动画

    声明一下:看见这篇文章总结的已经非常好了,没必要再去自己到处东翻西找了,链接:http://shahdza.blog.51cto.com/2410787/1546998 [唠叨] 基本动画制作需要用到 ...

  4. wkhtmltopdf 目录对象使用 及 目录样式分享

    最近又是更新了报告模板的样式新使用了目录对象 因为直接生成的目录样式比较丑所以这边使用的是自定义xsl 直接生成的目录样式 自定义样式 因为需求所以写了些特殊判断 <xsl:if test=&q ...

  5. 如何在 Nuxt 3 中使用 wavesurfer.js

    安装 wavesurfer.js 在项目中安装 wavesurfer.js npm install --save wavesurfer.js 常规方式引入 如果你的根目录中没有 components ...

  6. spark RPC超时造成任务异常 Attempted to get executor loss reason for executor id 17 at RPC address 192.168.48.172:59070, but got no response. Marking as slave lost.

    日志信息如下 Attempted to get executor loss reason for executor id 17 at RPC address 192.168.48.172:59070, ...

  7. webpack 中 loader 和 plugin 的区别

    通俗点讲loader是转换,plugin是执行比转换更复杂的任务,比如合并压缩等 loader:让webpack能够处理非js文件,然后你就可以利用 webpack 的打包能力,对它们进行处理. 例如 ...

  8. dapr本地托管的服务调用体验与Java SDK的Spring Boot整合

    1 简介 之前在文章<dapr入门与本地托管模式尝试>中介绍了dapr和本地托管,本文我们来介绍如果在代码中使用dapr的服务调用功能,并把它整合到Spring Boot中. Dapr服务 ...

  9. MyBatis的使用八(动态SQL)

    本主要讲述mybatis处理动态sql语句 一. 问题引入 前端展示的数据表格中,查询条件可能不止一个,如何将用户输入的多个查询条件,拼接到sql语句中呢? DynamicMapper接口声明如下 p ...

  10. 朋友圈那串神秘字符背后的开源项目「GitHub 热点速览」

    ​如果你这周没刷到类似 "npub1sg6plzptd64u62a878hep2kev88swjh3tw00gjsfl8f237..." 的一串字符,那就说明本期 GitHub T ...