面向对象基础之基础—控制台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) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...
随机推荐
- appium基本使用(Android)
一.环境搭建 详情可见:https://www.cnblogs.com/lihongtaoya/p/16971096.html 二.元素定位 详情可见:https://www.cnblogs.com/ ...
- (8)go-micro微服务Mysql配置
目录 一 gorm介绍 二 gorm安装 1.1 下载依赖 1.2 使用MySQL驱动 三 CURD操作 1. 查询 1.1 单行查询 1.2 多行查询 2. 插入数据 3. 更新数据 4. 删除数据 ...
- [cocos2d-x]关于动画
声明一下:看见这篇文章总结的已经非常好了,没必要再去自己到处东翻西找了,链接:http://shahdza.blog.51cto.com/2410787/1546998 [唠叨] 基本动画制作需要用到 ...
- wkhtmltopdf 目录对象使用 及 目录样式分享
最近又是更新了报告模板的样式新使用了目录对象 因为直接生成的目录样式比较丑所以这边使用的是自定义xsl 直接生成的目录样式 自定义样式 因为需求所以写了些特殊判断 <xsl:if test=&q ...
- 如何在 Nuxt 3 中使用 wavesurfer.js
安装 wavesurfer.js 在项目中安装 wavesurfer.js npm install --save wavesurfer.js 常规方式引入 如果你的根目录中没有 components ...
- 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, ...
- webpack 中 loader 和 plugin 的区别
通俗点讲loader是转换,plugin是执行比转换更复杂的任务,比如合并压缩等 loader:让webpack能够处理非js文件,然后你就可以利用 webpack 的打包能力,对它们进行处理. 例如 ...
- dapr本地托管的服务调用体验与Java SDK的Spring Boot整合
1 简介 之前在文章<dapr入门与本地托管模式尝试>中介绍了dapr和本地托管,本文我们来介绍如果在代码中使用dapr的服务调用功能,并把它整合到Spring Boot中. Dapr服务 ...
- MyBatis的使用八(动态SQL)
本主要讲述mybatis处理动态sql语句 一. 问题引入 前端展示的数据表格中,查询条件可能不止一个,如何将用户输入的多个查询条件,拼接到sql语句中呢? DynamicMapper接口声明如下 p ...
- 朋友圈那串神秘字符背后的开源项目「GitHub 热点速览」
如果你这周没刷到类似 "npub1sg6plzptd64u62a878hep2kev88swjh3tw00gjsfl8f237..." 的一串字符,那就说明本期 GitHub T ...