多用户ATM机(面向对象编程)
let readline = require('readline-sync');
// 清屏函数
let clear = () => process.stdout.write(process.platform === 'win32' ? '\x1Bc' : '\x1B[2J\x1B[3J\x1B[H');
class Person {
constructor(userID, userName, userPwd) {
this.id = userID;
this.name = userName;
this.pwd = userPwd;
}
}
class ATM {
constructor() {
this.arr = [];
}
// 注册
signAccount(Person) {
let isflag = true;
for (let i of this.arr) {
if (i.id == Person.id) {
isflag = false;
break;
}
}
if (isflag) {
this.arr.push({ id: Person.id, name: Person.name, pwd: Person.pwd, totalMoney: 0 });
return true;
} else {
return false;
}
}
// 登录
loadAccount(userID, userPwd) {
let isflag = '';
for (let i of this.arr) {
if (i.id == userID && i.pwd == userPwd) {
isflag = i.name;
}
}
return isflag;
}
// 查询
searchMoneyFunc(userID) {
for (let i of this.arr) {
if (i.id == userID) {
return i.totalMoney;
}
}
}
// 取钱
outMoneyFunc(userID, outMoney) {
if (outMoney < 0) {
return `非法金额!`;
}
for (let i of this.arr) {
if (i.id == userID) {
if (i.totalMoney < outMoney) {
return `余额不足!`;
} else {
i.totalMoney -= outMoney;
return `钱已取出,当前余额为:${i.totalMoney}`;
}
}
}
}
// 存钱
saveMoneyFunc(userID, saveMoney) {
if (saveMoney < 0) {
return `非法金额`;
}
for (let i of this.arr) {
if (i.id == userID) {
i.totalMoney += saveMoney;
return `钱已存入,当前余额为:${i.totalMoney}`;
}
}
}
// 转账
transferMoneyFunc(userID, transferID, transferMoney) {
if (transferMoney < 0) {
return `非法金额`;
}
let userMoney = this.searchMoneyFunc(userID);
if (userMoney < transferMoney) {
return `余额不足!`;
}
let isflag = false;
for (let i of this.arr) {
if (i.id == transferID) {
isflag = true;
i.totalMoney += transferMoney;
break;
}
}
if (isflag) {
for (let i of this.arr) {
if (i.id == userID) {
i.totalMoney -= transferMoney;
return `转账成功,当前余额为${i.totalMoney}`;
}
}
} else {
return `没有此用户!`;
}
}
}
let atm = new ATM();
let action = true;
while (action) {
clear();
console.log('请输入您要进行的操作:1.用户登录 2.用户注册 0.退出');
let choose = ~~readline.question('');
switch (choose) {
// 用户登录
case 1: {
console.log('请输入您的账户:');
let account = readline.question('');
console.log('请输入您的密码:');
let password = ~~readline.question('');
let login = atm.loadAccount(account, password); // 登录
if (login != '') {
console.log(`欢迎您!${login}`);
let act = true;
while (act) {
clear();
console.log('请输入您要操作的程序:1、查询 2、取款 3、存款 4、转账 0、退出');
let chooseNum = ~~readline.question('');
switch (chooseNum) {
// 查询
case 1: {
let totalMoney = atm.searchMoneyFunc(account);
console.log(`当前余额为:${totalMoney}`);
console.log('按回车键继续~~');
readline.question('');
break;
}
// 取款
case 2: {
console.log('请输入您的取款金额:');
let outMoney = ~~readline.question('');
console.log(atm.outMoneyFunc(account, outMoney));
console.log('按回车键继续~~');
readline.question('');
break;
}
// 存款
case 3: {
console.log('请输入您的存款金额:');
let saveMoney = ~~readline.question('');
console.log(atm.saveMoneyFunc(account, saveMoney));
console.log('按回车键继续~~');
readline.question('');
break;
}
// 转账
case 4: {
console.log('请输入您要转入的账户ID:');
let transferID = readline.question('');
console.log('请输入您的转款金额:')
let transferMoney = ~~readline.question('');
console.log(atm.transferMoneyFunc(account, transferID, transferMoney));
console.log('按回车键继续~~');
readline.question('');
break;
}
// 退出
case 0: {
act = false;
break;
}
// 输入有误
default:
console.log('您的操作不符合规范');
console.log('按回车键继续~~');
readline.question('');
break;
}
}
} else {
console.log(`账户或密码错误!按回车键继续~~`);
readline.question('');
}
break;
}
// 用户注册
case 2: {
console.log('请输入您的姓名:');
let userName = readline.question('');
console.log('请输入您的ID:');
let userID = readline.question('');
console.log('请输入您的密码:');
let userPwd = readline.question('');
let person = new Person(userID, userName, userPwd);
let account = atm.signAccount(person);
if (account) {
console.log('账户创建成功!');
console.log('按回车键继续~~');
readline.question('');
// console.log(atm.arr);
} else {
console.log('该账户已被人抢先注册啦,账户创建失败了呢!');
console.log('按回车键继续~~');
readline.question('');
}
break;
}
// 退出
case 0: {
console.log('系统已退出,感谢使用!');
action = false;
break;
}
// 输入错误
default: {
console.log('输入有误!');
console.log('按回车键继续~~');
readline.question('');
break;
}
}
}
在多用户ATM机这个案例中,功能比较复杂的算是转账了。用面向对象编程思想来写,思路是比较清晰的。本案例用了ES6的class类来实现。
多用户ATM机(面向对象编程)的更多相关文章
- 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系
Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...
- [.net 面向对象编程基础] (18) 泛型
[.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...
- 模拟ATM机银行系统
淄博汉企Java基础考核项目 模拟银行自助终端系统 一. 本系统模拟银行用户使用ATM机开户.查询.存款.取款功能,要求使用java语言编程实现. 说明: 1. 对于数据输入异常,可使用java异常处 ...
- JAVA的面向对象编程--------课堂笔记
面向对象主要针对面向过程. 面向过程的基本单元是函数. 什么是对象:EVERYTHING IS OBJECT(万物皆对象) 所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么 ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- 学习面向对象编程OOP 第一天
面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...
- MVC实战之排球计分软件(深入了解面向对象编程)
在此篇博客之前,我已经写了一个实战系列的博客,虽然不太成熟但是相对比较实用,在这篇博客我将继续使用mvc编程此软件. 此篇博客会在一定的时间内完成,此次完成的软件的一个需求是提供给运动员的使用.我将在 ...
- 铁乐学python_day22_面向对象编程4
以下内容大部分摘自博客http://www.cnblogs.com/Eva-J/ 封装 [封装]隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 将变化隔离: 便于使用: 提高复用性: 提 ...
随机推荐
- C/C++变量命名规则,个人习惯总结【转载】
C_C++变量命名规则 原文地址:http://blog.sina.com.cn/s/blog_8a7012cf01017h9p.html 变量命名规则是为了增强代码的可读性和容易维护性.以下为C++ ...
- oracle中merge的用法,以及各版本的区别 Create
Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key. Oracle在9i引入了merge命令,通过这个merge你能够在一个SQL语句中对一个 ...
- LeetCode第二题:Add Two Numbers
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- 记录启用HTTPS的全过程
因为 https 采用 ssl 加密,所以部署 https 时需要申请证书,证书的作用就是对浏览器和Web服务器双方的身份验证. 步骤1:申请证书 我们采用Let's Encrypt签发的免费证书,虽 ...
- [译] SystemTap
SystemTap 什么是system Tap ? SystemTap 提供环境用来获得更多关于内核几乎所有组件的信息,用以被进一步分析.SystemTap也可以被当作一种工具,为用户研究和监控内核详 ...
- Cassandra 学习一
一 什么是Cassandra? Cassandra 是一个来自 Apache 的分布式数据库,具有高度可扩展性,可用于管理大量的结构化数据.它提供了高可用性,没有单点故障. 是一种NoSQL类型的数 ...
- 【转】href="#"与"javascript:void(0);"的区别
在工作中,如果我们想把a标签中的链接置成空链接,我们一般会用两种方法: 1 <a href="#" target="_blank"></a&g ...
- 50 states of America
美国州名 州名英文 州名音标 简写 首府 首府 阿拉巴马州 Alabama [ˌæləˈbæmə] AL 蒙哥马利 Montgomery[mənt'gʌməri] 阿拉斯加州 Alaska [ ...
- 10-12C#基础--运算符
10-12C#基础--运算符 课前作业:班级内人数的姓名和年龄,分别写出之后并汇总. 一.运算符的分类 1.数学运算符(7个) 1)+(加号) 例: 2)-(减号) 例: 3)*(乘号) 例: 4)/ ...
- 用UltraISO把硬盘文件制作成ISO格式
转自:https://wenku.baidu.com/view/0052c88dcc22bcd126ff0cbf.html 用UltraISO把硬盘文件制作成ISO格式方法: 制作硬盘ISO文件步骤一 ...