面向对象基础之基础—控制台C#模拟银行ATM存取操作实例
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存取操作实例的更多相关文章
- java线程基础巩固---采用多线程方式模拟银行排队叫号以及Runnable接口存在的必要性
采用多线程模拟银行排队叫号: 关于银行拿排队号去叫号的过程我想不必过多解释了,就是有几个业务窗口,并行的处理业务,每处里完一个人,则会叫下一个排队的号去处理业务,一个人是不会被多个窗口工作人员叫号的, ...
- 实验01——java模拟银行ATM系统
用java写的一个模拟银行系统,比较初级. ATM.java package cn.tedu.yinhang; import java.util.Scanner; /** * @author 赵瑞鑫 ...
- 模拟银行ATM系统(基础版)
Account类 package ATM; public class Account {//定义Account类 private String accountID;//用于存储学生的用户账号(由八位数 ...
- Java基础面试操作题:线程同步代码块 两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。
package com.swift; public class Bank_Customer_Test { public static void main(String[] args) { /* * 两 ...
- JavaScript 面向对象开发知识基础总结
JavaScript 面向对象开发知识基础总结 最近看了两本书,书中有些内容对自己还是很新的,有些内容是之前自己理解不够深的,所以拿出来总结一下,这两本书的名字如下: JavaScript 面向对象精 ...
- [.net 面向对象编程基础] (3) 基础中的基础——数据类型
[.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...
- [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换
[.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...
- [.net 面向对象编程基础] (5) 基础中的基础——变量和常量
[.net面向对象编程基础] (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...
- [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式
[.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式 说起C#运算符和表达式,小伙伴们肯定以为很简单,其实要用好表达式,不是一件容易的事.一个好的表达式可以让你做事半功倍的效果,比如 ...
- [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句
[.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...
随机推荐
- [seaborn] seaborn学习笔记1-箱形图Boxplot
文章目录 1 箱形图Boxplot 1. 基础箱形图绘制 Basic boxplot and input format 2. 自定义外观 Custom boxplot appearance 3. 箱型 ...
- UOJ33 [UR#2] 树上 GCD
UOJ33 [UR#2] 树上 GCD 简要题意: 给定一棵有根树,对于每个 \(i \in [1,n)\),求出下式的值: \[Ans[i] = \sum_{u<v} \gcd({\rm{di ...
- 由char和byte的关系引申出去——总结一下java中的字符编码相关知识
由char和byte的关系引申出去--总结一下java中的字符编码相关知识 一.字符编码 手持两把锟斤拷,口中直呼烫烫烫 在文章伊始,先来复习一下计算机中关于编码的一些基础知识,着重理清以下几 ...
- C++获取含有中文字符的string长度
:前言 造车轮的时候要用到中文字符串的长度辨别,发现char的识别不准,进行了一番研究. > 开始研究 在Windows下,中文字符在C++中的内存占用为2字节,此时采用字符串长度获取函数得到的 ...
- Echarts自适应屏幕,无需刷新网页,可根据屏幕大小完美展现,内有详细代码注释,我可真是个小机灵~~O(∩_∩)O哈哈~
Echarts自适应屏幕,无需刷新网页,可根据屏幕大小完美展现 效果如图 随意拖拉,无惧检验 ~ ~ ~ ~ 下面上代码 里边有详细解释 <template> <div class= ...
- 线上代码已变更,客户没有刷新浏览器,导致点击菜单后找不到相对路由js文件无法加载XXX路由,解决办法如下
1,reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当 ...
- Angular8中共享模块,共享组件的写法(anular其他模块组件引用方法)
Angular8中共享模块,共享组件的写法(anular其他模块组件引用方法) 第一步:全局创建一个共享的module 这里示例创建一个模块common-share 创建完成后,会生成两个文件 文件1 ...
- 重写Object类的equals方法-Objects类的equals方法
重写Object类的equals方法 Object类的equals方法默认比较的是两个对象的地址值,没有意义所以我们学要重写equals方法,比较两个对象的属性值(name,age) 对象的属性值一样 ...
- Jenkins搭建与数据迁移实践
概述 本文主要介绍内容如下: 1.使用Docker搭建Jenkins 2.迁移原Jenkins数据到新搭建的Jenkins中 3.在Jenkins容器内部配置Maven的私服配置 4.在Jenkins ...
- KingbaseES在线wal日志
KingbaseES数据库日志文件记录数据库的历史操作信息, 包含恢复数据库中的所有事务所需的信息. KingbaseES在线WAL日志: WAL日志: 预写式日志(Write-Ahead Loggi ...