多用户ATM机(面向对象编程)

时间:2022-09-19 22:56:26
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. &lbrack;&period;net 面向对象编程基础&rsqb; &lpar;18&rpar; 泛型

    [.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&lowbar;day22&lowbar;面向对象编程4

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

随机推荐

  1. pandas 时间序列resample

    resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数据条目进行统计 函数原型:DataFrame.resample(rule, how=None ...

  2. 每天一个linux命令(20):linux chmod命令

    chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...

  3. Jquery鼠标滚动到页面底部自动加载更多内容&comma;使用分页

    index.php代码   [html] view plaincopy <!DOCTYPE html PUBLIC ;}                .single_item{padding: ...

  4. Nginx 配置文件模板

    user www www; worker_processes 2; error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/loc ...

  5. 12个有趣的C语言问答(详解)

    本文参照博文<12个有趣的C语言问答>,在原文的基础上增加来对应的知识点的详细介绍. 1 gets()方法 Q:下面的代码有一个被隐藏的问题,你能找到它吗? #include <st ...

  6. &lbrack;wikioi&rsqb;多源最短路

    http://wikioi.com/problem/1077/ Floyd算法.精华是三层循环,if (dist(i,k) + dist(k,j) < dist(i,j)) then dist( ...

  7. 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前

    题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初 ...

  8. mysql INSERT &period;&period;&period; ON DUPLICATE KEY UPDATE语句

    网上关于INSERT ... ON DUPLICATE KEY UPDATE大多数文章都是同一篇文章转来转去,首先这个语法的目的是为了解决重复性,当数据库中存在某个记录时,执行这条语句会更新它,而不存 ...

  9. 基元用户模式构造--互锁构造 Interlocked 实现的异步web请求实例

    using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...

  10. CentOS 7提示:ERROR unsupported format character &&num;39&semi;&lpar;0xffffffe7&rpar; at&sol;域安装失败,您可以运行下列命令重启您的域:

    别理会,直接装即可,这个错误不影响使用.