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. [seaborn] seaborn学习笔记2-散点图Scatterplot

    2 散点图Scatterplot(代码下载) 散点图能够显示2个维度上2组数据的值.每个点代表一个观察点.X(水平)和Y(垂直)轴上的位置表示变量的值.研究这两个变量之间的关系是非常有用的.在seab ...

  2. 真正“搞”懂HTTP协议07之body的玩法(实践篇)

    我真没想到这篇文章竟然写了将近一个月,一方面我在写这篇文章的时候阳了,所以将近有两周没干活,另外一方面,我发现在写基于Node的HTTP的demo的时候,我不会Node,所以我又要一边学学Node,一 ...

  3. ABC193F Engines

    简要题意 给出 \(n\) 个向量,求其子集的和的最大模长. \(1 \leq n \leq 100\) 思路 先说结论:选出的几个向量,一定是极角排序后的某一段(环形)区间. 这个不难感性理解,比如 ...

  4. windows使用管理员权限安装软件

    安装步骤 系统搜索 cmd 点击右键,使用管理者方式运行 输入用户名密码 成功以管理员身份运行 cd 到软件存储的目录 输入软件执行文件名, 按回车键,成功开始安装

  5. 【分析笔记】Linux gpio_wdt.c 看门狗设备驱动源码分析

    基本原理 该看门狗的设备驱动实现原理很简单,比较主要的有两点: 一.定时器喂狗 通过定时器根据配置文件配置的喂狗方式(如脉冲切换.电平切换),对指定的 gpio 进行脉冲切换或电平切换实现喂狗. 脉冲 ...

  6. 12月19日内容总结——Q查询进阶、ORM查询优化、ORM事务、ORM常用字段类型和字段参数、Ajax介绍、数据编码格式、Ajax携带文件数据

    目录 一.Q查询进阶操作 二.ORM查询优化 三.ORM事务操作 四.ORM常用字段类型 五.ORM常用字段参数 六.Ajax AJAX简介 应用场景 AJAX的优点 语法实现 七.数据编码格式(Co ...

  7. 【HMS Core】一张图片带你玩转机器学习服务

    ​1.介绍 总览 Cloud DB(云数据库)是一款端云协同的数据库产品,提供端云数据的协同管理.统一的数据模型和丰富的数据管理API接口等能力.在保证数据的可用性.可靠性.一致性,以及安全等特性基础 ...

  8. 用ksweb+Android做服务器,搭建WordPress博客环境

    旧的安卓手机不要仍,安装上ksweb给wordpress做服务器,隔壁小孩都馋哭了. 为了能在自己的安卓手机服务器上写博客,首先我们来了解一下WordPress和ksweb: WordPress是使用 ...

  9. el-input 限制只能输入正整数

    1.前端页面 <el-row :gutter="20"> <el-col :span="20"> <el-form-item la ...

  10. boot-repair

    sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update sudo apt-get insta ...