ATM模拟程序

2024-01-08 14:58
文章标签 atm 模拟程序

本文主要是介绍ATM模拟程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  我估计看了以下该模拟程序的要求可能会有一些人会怀疑是不是和我一个学校的,没错,咱们就是一个学校的,当初大一的时候看到这个实验整个人都懵了,完全不会玩,因此最后也是求助别人,但是其实也没看懂别人几百行的代码。前一段时间也是听导师说这个程序是教我们C++的一个经典的实验,自学了Java之后对类的使用和理解也才算真正是入门了。个人觉得这个实验值得一做,所以就去看了当时的实验要求并开始写这个程序。整个程序大概写了四五小时左右。

  代码主要使用类来进行实现,因为面向对象设计嘛。由于要实现一个账户转账给另一个账户转账,从银行的角度来设计需要用到数据库了,这里并不要求我们这么麻烦,所以在写了LoanAccount借款账户之后马上实例化了一个对象,因为会在DepositAccount存款账户中需要用到。基本信息储存在account.in文件中,操作之后其中的数据也会随之改变,当然你要是想保留数据可以把运行后的数据输出到另一个文本文档中。

  这个程序最关键的是先做需求分析,一个ATM需要具有哪些功能(当初自己这点就完全没想,所以啥也写不出来)。如果你是大佬觉得代码不行请跳过,如果你还属于小白无法写出这个程序,我希望本文能对您有所帮助,切勿题都不看直接copy,博主不希望你没有实质性的收获,因为代码较长,可能会上传有误,若发现代码运行不成功,请评论留言,同时欢迎讨论,下面是实验要求。

ATM模拟程序能够完成ATM的主要功能,包括:

1.显示欢迎词及提示信息;

2.用户插卡,ATM验证用户账号及密码有效性,输入错误3次即被锁卡;

3.用户的帐户有两类,一类是存款帐户,一类是借款帐户,存款帐户里的钱是用户自己的钱, 借款帐户无余额只有信用额度和已借银行的钱.。

4.存款帐户的可以查询余额:初始余额为10000元;

5.借款帐户的可以查询当前欠银行的钱的数量和信用额度;

6.存款帐户和借款帐户都可以取款,每次取款额为100的整数倍,有单笔和单日金额限制,存款帐户的余额不能为负,借款帐户欠的钱不能超过信用额度;

7.存款帐户的可以转账,可将本账户中的存款转入其它账户,转入账户账号需两次输入确认;

8.借款帐户的可以接受还款(转账),接收其它存款账户将钱转入本账户;

9.修改密码:密码为6位数字,新密码需要两次输入确认;

10.退卡。

设计实现命令行界面,界面应友好、方便操作。参考界面如图1所示。

程序所涉及到的用户资料、银行帐户、存取款记录等信息保存在数据文件中。其中银行账户的格式如下:
在这里插入图片描述

Account.h头文件

#ifndef Atmprogram
#define Atmprogram#include <iostream>
#include <string>
using namespace std;class Account
{
private:string userAccount;  //用户账号string userName;     //用户姓名string idCard;       //用户身份证string userPassword; //用户密码public:Account(string account, string name, string id, string pwd){userAccount = account;userName = name;idCard = id;userPassword = pwd;}void setAccount(string account){userAccount = account;}void setName(string name){userName = name;}void setId(string id){idCard = id;}void setPassword(string pwd){userPassword = pwd;}string getAccount(){return userAccount;}string getName(){return userName;}string getId(){return idCard;}string getPassword(){return userPassword;}void getCard() //插卡交互界面{cout << "----------------------欢迎来到中国银行----------------------" << endl;cout << "请插入您的银行卡" << endl;cout << "请稍等,系统正在确认..." << endl;cout << "请输入你的密码(温馨提示:输入错误3次即被锁卡):";string password;for (int i = 0; i < 3; i++){cin >> password;if (password == getPassword()){cout << "恭喜您登陆成功" << endl;operate();break;}else if (i == 2)cout << "您已经输错密码三次,系统自动锁卡,请于次日凭身份证领卡" << endl;elsecout << "您的密码有误,请重新输入(您还有" << 2 - i << "次重输机会):";}cout << "----------------------期待下次为您服务----------------------" << endl;}void changePassword() //修改密码{string pwd1, pwd2;cout << "请输入新的密码:";while (true){cin >> pwd1;if (pwd1 == getPassword())cout << "新密码不能与旧密码相同,请重新输入新的密码:";elsebreak;}cout << "请确认新的密码:";cin >> pwd2;if (pwd1 == pwd2){setPassword(pwd1);cout << "密码修改成功\n"<< endl;}elsecout << "前后密码不一致,修改失败\n"<< endl;}virtual void operate(){};virtual void withdraw(){};
};class LoanAccount : public Account //借款账户
{
private:int credit; //信用额度int debt;   //当前欠款
public:LoanAccount(string account, string name, string id, string pwd, int cre, int dt) : Account(account, name, id, pwd){credit = cre;debt = dt;}int getCredit(){return credit;}int getDebt(){return debt;}void setCredit(int cre){credit = cre;}void setDebt(int dt){debt = dt;}void operate(){cout << "此账户为借款账户,以下为您的基本信息" << endl;cout << "-------------------------------------" << endl;cout << "账号   " << getAccount() << endl;cout << "姓名   " << getName() << endl;cout << "身份证  " << getId() << endl;cout << "密码   " << getPassword() << endl;cout << "信用额度  " << getCredit() << endl;cout << "当前欠款  " << getDebt() << endl;cout << "-------------------------------------" << endl;cout << "----------------------本机提供以下服务----------------------" << endl;int num;while (true){cout << "1.还款  2.取款  3.查询欠款  4.查询信用额度  5.修改密码  6.退卡" << endl;cout << "请根据提示栏输入对应数字进入相应服务:";cin >> num;switch (num){case 1:repayment();break;case 2:withdraw();break;case 3:checkDebt();break;case 4:checkCredit();break;case 5:changePassword();break;case 6:cout << "您已经退卡" << endl;return;default:cout << "无效的输入,执行退卡" << endl;return;}}}void repayment() //还款{if (getDebt() == 0)cout << "您欠款已经还清,无需还款" << endl;else{cout << "您目前待还" << getDebt() << "元" << endl;int money;cout << "请将您的存款整理好放入ATM机中并输入还款金额:";cin >> money;cout << "系统正在处理中..." << endl;setDebt(getDebt() - money);if (getDebt() == 0)cout << "您本次还款" << money << "元,欠款已经还清,即将返回主界面...\n"<< endl;elsecout << "您本次还款" << money << "元,还有" << getDebt() << "元待还,即将返回主界面...\n"<< endl;}}void repayment(int money) //转账还款{setDebt(getDebt() - money);}void withdraw() //取款{int remain = getCredit() - getDebt();if (remain < 100)cout << "您的额度不足,无法进行取款" << endl;else{cout << "请输入取款金额:";int money;static int withdraw2 = 0;while (true){cin >> money;if (money % 100 == 0){if (remain - money < 0){cout << "您的余额不足,当前还可取" << remain << "元,请重新输入取款金额:";}else if (money > 5000){cout << "单笔取款最大限额为5000元,请重新输入取款金额:";}else{if (withdraw2 + money > 14000){cout << "单日最大取款金额为14000元,您今日还可以取" << 14000 - withdraw2 << "元,请重新输入取款金额:";}else{cout << "请稍等,系统正在处理中..." << endl;setDebt(getDebt() + money);withdraw2 += money;cout << "取款成功,即将返回主界面...\n"<< endl;return;}}}elsecout << "每次取款额为100的整数倍,请重新输入取款金额:";}}}void checkDebt() //查询欠款{if (getDebt() == 0)cout << "您的欠款已经还清" << endl;else{cout << "您当前欠款:" << getDebt() << "元" << endl;cout << "即将返回主界面...\n"<< endl;}}void checkCredit() //查询信用额度{cout << "您当前的信用额度为:" << getCredit() << "元" << endl;cout << "即将返回主界面...\n"<< endl;}
};LoanAccount loan("", "", "", "", 0, 0); //实例化一个借款账户,因为需要在存款账户的转账中用到class DepositAccount : public Account //存款账户
{
private:int balance; //用户余额
public:DepositAccount(string account, string name, string id, string pwd, int bal) : Account(account, name, id, pwd){balance = bal;}int getBal(){return balance;}void setBal(int bal){balance = bal;}void operate(){cout << "此账户为存款账户,以下为您的基本信息" << endl;cout << "-------------------------------------" << endl;cout << "账号   " << getAccount() << endl;cout << "姓名   " << getName() << endl;cout << "身份证  " << getId() << endl;cout << "密码   " << getPassword() << endl;cout << "余额  " << getBal() << endl;cout << "-------------------------------------" << endl;cout << "----------------------本机提供以下服务----------------------" << endl;int num;while (true){cout << "1.存款   2.取款   3.转账   4.查询余额   5.修改密码   6.退卡" << endl;cout << "请根据提示栏输入对应数字进入相应服务:";cin >> num;switch (num){case 1:deposit();break;case 2:withdraw();break;case 3:transfer();break;case 4:checkBalances();break;case 5:changePassword();break;case 6:cout << "您已经退卡" << endl;return;default:cout << "无效的输入,执行退卡" << endl;return;}}}void deposit() //存款{int money;cout << "请将您的存款整理好放入ATM机中并输入存款金额:" << endl;cin >> money;cout << "系统正在处理中..." << endl;setBal(getBal() + money);cout << "存款成功,即将返回主界面...\n"<< endl;}void withdraw() //取款{if (getBal() < 100)cout << "您的余额不足,无法进行取款" << endl;else{cout << "请输入取款金额:";int money;static int withdraw1 = 0;while (true){cin >> money;if (money % 100 == 0){if (getBal() - money < 0){cout << "您的余额不足,请重新输入取款金额:";}else if (money > 1000){cout << "单笔取款最大限额为1000元,请重新输入取款金额:";}else{if (withdraw1 + money > 5000){cout << "单日最大取款金额为5000元,您今日还可以取" << 5000 - withdraw1 << "元,请重新输入取款金额:";}else{cout << "请稍等,系统正在处理中..." << endl;setBal(getBal() - money);withdraw1 += money;cout << "取款成功,即将返回主界面...\n"<< endl;return;}}}elsecout << "每次取款额为100的整数倍,请重新输入取款金额:";}}}void transfer() //转账{while (true){string account1, account2;cout << "请输入转入账户账号:";cin >> account1;cout << "请确认转入账户账号:";cin >> account2;if (account1 == account2){cout << "请耐心等待系统确认..." << endl;cout << "确认完毕,请输入转账金额(取消转账请输入0):";int money;while (true){cin >> money;if (money == 0){cout << "请稍等,系统正在取消转账..." << endl;cout << "成功取消转账,即将返回主界面...\n"<< endl;return;}else if (money > getBal()){cout << "您的转账金额超出了您的余额!" << endl;cout << "若您想继续转账,请重新输入金额(取消转账请输入0):";}else if (loan.getAccount() == account1){cout << "系统正在处理中..." << endl;if (money > loan.getDebt()){cout << "你所转账的借款账户只欠了" << loan.getDebt() << "元" << endl;cout << "如果您同意只转账" << loan.getDebt() << "元请按1,按0重新输入金额:";int flag;cin >> flag;if (flag == 1){money = loan.getDebt();loan.repayment(money);setBal(getBal() - money);cout << "转账成功,即将返回主界面...\n"<< endl;return;}else{cout << "请重新输入金额(取消转账请输入0):" << endl;}}else{loan.repayment(money);setBal(getBal() - money);cout << "转账成功,即将返回主界面...\n"<< endl;return;}}else{cout << "系统正在处理中..." << endl;setBal(getBal() - money);cout << "转账成功,即将返回主界面...\n"<< endl;return;}}break;}elsecout << "两次账号输入不一致,请重新输入" << endl;}}void checkBalances() //查询余额{cout << "您的余额为:" << getBal() << "元" << endl;cout << "即将返回主界面...\n"<< endl;}
};DepositAccount depo("", "", "", "", 0); //反正已经实例化了一个借款账户,顺便把存款账户也实例化了#endif

ATM.cpp源文件

#include "Account.h"
#include <fstream>void initDepo(DepositAccount &de, string str[4], int bal) //初始化存款账户
{de.setAccount(str[0]);de.setName(str[1]);de.setId(str[2]);de.setPassword(str[3]);de.setBal(bal);
}void initLoan(LoanAccount &lo, string str[], int cre, int debt) //初始化借款账户
{lo.setAccount(str[0]);lo.setName(str[1]);lo.setId(str[2]);lo.setPassword(str[3]);lo.setCredit(cre);lo.setDebt(debt);
}void printDepo(DepositAccount de)
{cout << de.getAccount() << " ";cout << de.getName() << " ";cout << de.getId() << " ";cout << de.getPassword() << " ";cout << de.getBal() << endl;
}void printLoan(LoanAccount lo)
{cout << lo.getAccount() << " ";cout << lo.getName() << " ";cout << lo.getId() << " ";cout << lo.getPassword() << " ";cout << lo.getCredit() << " ";cout << lo.getDebt() << endl;
}int main()
{ifstream ifs;ifs.open("account.in", ios::in);string str[4];int bal, cre, debt;for (int i = 0; i < 4; i++)ifs >> str[i];ifs >> bal;initDepo(depo, str, bal);for (int i = 0; i < 4; i++)ifs >> str[i];ifs >> cre >> debt;initLoan(loan, str, cre, debt);ifs.close();depo.getCard();cout << endl;loan.getCard();freopen("account.in", "w", stdout);printDepo(depo);printLoan(loan);return 0;
}

测试文件account.in

1234567891234567891 Peter 510225199908141234 123456 8000
2691843158321816816 Bob   500381199908141234 123456 20000 7000

这篇关于ATM模拟程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/583850

相关文章

JavaSwing项目ATM自动提款机(mysql数据库)+详细报告

目  录 第一章 引言... 1 1.1 设计目的... 1 1.2 相关开发工具介绍... 1 第二章 数据库需求分析... 2 2.1 系统功能分析... 2 2.2 功能模块设计... 2 第三章 数据库概念结构设计... 3 3.1 概念模型... 3 3.2 E-R图... 3 第四章 数据库逻辑结构设计... 4 4.1 关系模型设计... 4 4.2 数据模型的优化... 4 第五

Lesson_for_java_day21--java的多线程练习(ATM存取款机、多窗口卖票系统、5人赛跑)

一、ATM存取款机: package sonyi;//取款机存取钱练习:public class TestATM {public static void main(String[] args) {//开户Account1 a = new Account1(11111, 100);System.out.println(a);//存取钱new Thread(new ATMWindow(a, 1,

mysql数据库中模拟程序循环执行sql命令快速造数命令

解决复杂问题不可能通过一个 SQL 语句完成,我们需要执行多个 SQL 操作。流程控制语句的作用就是控 制存储过程中 SQL 语句的执行顺序,是我们完成复杂操作必不可少的一部分。只要是执行的程序,流程 就分为三大类: 顺序结构 :程序从上往下依次执行 分支结构 :程序按条件进行选择执行,从两条或多条路径中选择一条执行 循环结构 :程序满足一定条件下,重复执行一组语句 针对于MySQL 的流程控制语

Python购物流程结合ATM接口实现

简介 ATM购物作业要求: 额度15000¥或自定义实现购物商城,买东西加入购物车,调用信用卡接口结账可以提现,手续费5%每月22号出账单,每月10号为还款日,过期未还,按欠款总额的万分之5,每日计息支持多账户登录支持账户间转账记录每月日常消费流水记录提供还款接口ATM记录操作日志提供管理接口,包括添加账户、用户额度、冻结账户等 程序要求: 分级目录,包含以下文件夹: bin可执行文件

CR80通用清洁卡:证卡打印机、ATM机、POS机、读卡器等卡片设备清洁维护的好助手!

随着科技的进步,ATM机、POS终端、门禁系统、证卡打印机、读卡器等卡片设备在我们的日常生活中扮演着越来越重要的角色,些设备在长时间使用和环境因素的影响下,容易积聚油脂、灰尘和其他污染物,从而对其性能和功能产生负面影响。 深圳美迪帝CR80清洁卡 为了解决卡片设备因长时间使用和环境因素导致的污垢和污染物积聚问题,CR80通用清洁卡应运而生。它是一种专门设计用于卡片设备清洁除尘的工具耗材,具

用C语言控制台程序模拟一个ATM 机存取款流程

//// main.c//// Created by lanqs on 14/12/17.// Copyright (c) 2014年 All rights reserved.//#include <stdio.h>#include "haha.h"struct Zhanghu{char name[20];//姓名int num;//账户int password;//密码do

js简单综合案例之简易ATM取款机、渲染表格案例、封装时间函数

这里写目录标题 简易ATM取款机要求代码实现 渲染表格案例要求代码实现 封装时间函数要求代码实现 简易ATM取款机 要求 1.弹出弹窗,让用户输入数字选择操作 2.初始值金额为100,计算每次操作后的剩余金额变化 3.一直弹出弹窗直到用户输入4,跳出 代码实现 <!DOCTYPE html><html lang="en"><head><meta cha

Java的简易ATM系统

大纲    ATM 机系统                    1.注册(账户(系统随机生成 15 位) - 密码(6位) - 余额)                    2.登录                   4.修改密码                   3.查询余额                   4.存钱 -(显示操作完成后的余额)

JAVA版本的ATM编程问题记录

前段时间用C语言写了个银行ATM系统,还写了一篇文章记录了一些,C语言的ATM文章。后来又用IDEA写了一个JAVA版本的银行ATM。有人就会问为啥浪费这个时间写ATM呢?🧐其实是我本科代码没学好,所以现在想利用比较熟悉的ATM系统来训练一下代码思维。下面是我用JAVA语言写银行ATM时遇到的一些有意思的问题和知识点,方便我之后学习回顾,便记录了下来。 MVC模式构建项目 学生管理系统的项

从ATM机到机房收费中 我理解的面向对象

真正开始纠结这个问题是在用UML画类图的时候。我们常说vb是基于面向对象对象的程序设计,而c++ java是真正的面向对象。 面向对象的理解     以第一遍敲机房收费系统的思路来画UML一定是不对的。vb的基于对象是指其对一些控件 按钮之类的这些界面对象的处理。比如,我们可以说,按钮,属性有(名称,大小,颜色,样式等),方法(单击,双击,move等)。回想下我们敲机房收费系统时的