面向对象基础之基础—控制台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) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...
随机推荐
- [深度学习] ImageAI库使用笔记
ImageAI是一个Python库,旨在使开发人员,研究人员和学生能够使用简单的几行代码来构建具有独立的深度学习和计算机视觉功能的应用程序和系统. ImageAI的官方GitHub存储库为https: ...
- js取不到iframe元素
跨域 iframe 请绕道,下文是针对非跨域 iframe 的问题排除 1.iframe 取不到值的问题的原因 1. 父页面未加载完成 2. iframe 未加载完成 3. 语法使用错误 4. 跨域( ...
- 软件安装——tortoiseGit安装和配置
Tortoisegit安装指南 TortoiseGit是一个开放的Git版本控制系统的源客户端,它是Git和Windows资源管理器的整合,提供了Git的图形化操作界面 一.软件安装 1.进入tort ...
- JUC源码学习笔记5——1.5w字和你一起刨析线程池ThreadPoolExecutor源码,全网最细doge
源码基于JDK8 文章1.5w字,非常硬核 系列文章目录和关于我 一丶从多鱼外卖开始 话说,王多鱼给好友胖子钱让其投资,希望亏得血本无归.胖子开了一个外卖店卖国宴,主打高端,外卖小哥都是自己雇佣,并且 ...
- ZROI3
题解 ZROI3 T1 与<滑动窗口>类似,用单调队列维护 #include <queue> #include <cstdio> #include <cstr ...
- 【随笔记】T507 Android10 EC200U-CN 4G Cat1 移植
基本信息 硬件信息 硬件平台:T507 (Android 10 Linux 4.9) 模组型号:EC200U-CN(Cat1)(展讯芯片) 相关文件 代理提供 longan/kernel/linux- ...
- 【动画笔记】数据结构-AVL树的插入操作
本笔记前置知识: 二叉搜索(排序)树及其插入操作. 本文主要围绕AVL树的平衡因子.纸上做题思路.失衡类型(LL/RR/LR/RL).失衡调整方法.插入后回溯这几部分知识点展开. 注: 本笔记中的平衡 ...
- @Slf4j -- lombok.extern.slf4j.Slf4j;
@Log4j:注解在类上:为类提供一个 属性名为log 的 log4j 日志对像 package com.atguigu.springcloud.controller; import com.atgu ...
- JAVA虚拟机04---对象的创建
主要是针对HotSpot虚拟机来说的 1.对象的创建过程-new 对象() 1.1检查类是否被加载 检查创建的这个对象的类是否能在常量池中找到类的符号引用,并检查这个类是否被加载.解析和初始化.如果没 ...
- redis georadius源码分析与性能优化
原文地址: https://blog.fanscore.cn/a/51/ 背景 最近接到一个需求,开发中使用了redis georadius命令取附近给定距离内的点.完工后对服务进行压测后发现geor ...