面向对象基础之基础—控制台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) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...
随机推荐
- CentOS7下搭建JumpServer
JumpServer 部署架构图 JumpServer 功能架构图 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统. JumpServer 使用 Python ...
- 一问读懂Web3 架构
最近看了一些Web3.0的文章,总结了一些个人的理解: Web3.0 通过区块链基础设施管理用户数据,重构用户和互联网平台之间的关系和交互,重新定义了互联网应用的架构方式和交互模式. Web 1.0 ...
- P5380 [THUPC2019]鸭棋
题面 查看题面 题目背景 鸭棋是一种风靡鸭子界的棋类游戏.事实上,它与中国象棋有一些相似之处,但规则不尽相同.在这里,我们将为你介绍鸭棋的规则. 鸭棋在一个 \(10\times 9\)(\(10\) ...
- Gvim基础操作(正则表达式)-02
Gvim正则表达式 正则表达式在linux中使用非常广泛.主要是进行一些替换,在编写脚本的时候都会使用到.gvim.perl.sed.tcl中都会使用到. Gvim正则表达式的使用 搜索命令 /正则表 ...
- 万字详解,吃透 MongoDB!
本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.) 少部分内容参考了 MongoDB 官方文档的描述,在此说明一下. MongoDB ...
- .Net6 使用 Ocelot + Consul 看这篇就够了
前言 卯兔敲门,新的一年,祝大家前'兔'似锦!希望大家假后还能找到公司的大门 O(∩_∩)O !书接上文,我们使用了 Consul实现了服务注册与发现,对Consul不熟悉的同学可以先看看.这篇文章我 ...
- 新版Bing 搜索后台的.NET 技术栈
微软在今天在Redmond 线下举办媒体一场活动,发布了新版的微软必应,在桌面上推出了测试版,移动版也即将推出.微软首席执行官纳德拉称Al-powered搜索为公司自云15年以来最大的事情. 2023 ...
- 11月16日内容总结——OSI传输层之TCP与UDP协议、应用层简介、socket模块介绍及代码优化、半连接池的概念
目录 一.传输层之TCP与UDP协议 1.TCP协议(重要) 三次握手建链接(白话版) 三次握手专业版 四次挥手断连接(白话版) 四次挥手专业版 2.UDP协议 3.tcp和udp的对比 二.应用层简 ...
- C-05\函数的底层原理
一.程序运行时内存四大区 wres(内存属性): w:write(可写) r:read(可读) e:execute(可执行) s:share(可共享) 任何操作系统(windows.liunx.安卓. ...
- 真正“搞”懂HTTP协议13之HTTP2
在前面的章节,我们把HTTP/1.1的大部分核心内容都过了一遍,并且给出了基于Node环境的一部分示例代码,想必大家对HTTP/1.1已经不再陌生,那么HTTP/1.1的学习基本上就结束了.这两篇文章 ...