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机(面向对象编程)的更多相关文章

  1. 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

    Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...

  2. Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系

    Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...

  3. [.net 面向对象编程基础] (18) 泛型

    [.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...

  4. 模拟ATM机银行系统

    淄博汉企Java基础考核项目 模拟银行自助终端系统 一. 本系统模拟银行用户使用ATM机开户.查询.存款.取款功能,要求使用java语言编程实现. 说明: 1. 对于数据输入异常,可使用java异常处 ...

  5. JAVA的面向对象编程--------课堂笔记

    面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么 ...

  6. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  7. 学习面向对象编程OOP 第一天

    面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...

  8. MVC实战之排球计分软件(深入了解面向对象编程)

    在此篇博客之前,我已经写了一个实战系列的博客,虽然不太成熟但是相对比较实用,在这篇博客我将继续使用mvc编程此软件. 此篇博客会在一定的时间内完成,此次完成的软件的一个需求是提供给运动员的使用.我将在 ...

  9. 铁乐学python_day22_面向对象编程4

    以下内容大部分摘自博客http://www.cnblogs.com/Eva-J/ 封装 [封装]隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 将变化隔离: 便于使用: 提高复用性: 提 ...

随机推荐

  1. ORACLE显式授权

    同一数据库 两个不同用户 user1 user2 user1里面有一张表 table1 在user2里面创建synonymcreate synonym sy1 for user1.table1; 创建 ...

  2. Celery-4.1 用户指南: Debugging (调试)

    远程调试任务(pdb) 基础 celery.contrib.rdb 是 pdb 的一个扩展版本,它支持不通过终端访问就可以远程调试进程. 示例: from celery import task fro ...

  3. system中有空格怎么办

    原始路径: C:\\Program Files\\putty\\putty.exe 改为: char *cmd="C:\\\"Program Files\"\\putty ...

  4. SUSE 开启ssh、telnet

    SSH 1. /etc/ssh/sshd_config [SSH的配置文件] 2. SuSEfirewall2 stop #关闭防火墙 如图,输入命令 vi /etc/ssh/sshd_config ...

  5. Python之函数目录(自定义函数,内置函数,装饰器,迭代器,生成器)

    1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数 9.函数相关定义 10.三元表达式.列表推导式.生成器表达式 11.函数与方法的区别  

  6. Shell编程进阶 1.8 for循环

    产生序列的命令 seq 1 2 3 4 5 6 7 8 9 10 seq 1 3 5 7 9  (从1开始增加2显示这个数字,到10结束) seq - 10 8 6 4 2 seq - 10 9 8 ...

  7. ES6中变量的解析赋值的用途

    变量的解构赋值用途很多. (1)交换变量的值 let x = 1; let y = 2; [x, y] = [y, x]; 上面代码交换变量x和y的值,这样的写法不仅简洁,而且易读,语义非常清晰. ( ...

  8. iOS 添加Empty Application模板

    在Apple最新的XCode6.x中没有了Empty Application模板,好在XCode可以添加模板,而且可以自定义模板. 首先可以到XCode5.x中复制 Empty Application ...

  9. iOS 地图(添加大头针)

    首先在工程中导入MapKit.framework库文件 #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <U ...

  10. 什么是FastCGI, PHP-FPM

    CGI,FastCGI都是一套接口标准:是编程语言(比如php,python; python里面也有wsgi)与web服务器(比如Nginx)的通信标准(比如你跟老外交流,那么FastCGI就相当于是 ...