C++模拟ATM机存取款管理系统设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

WORD文档
温馨提示
程序语言:C、C++、C#、Python(红色字体表示本课设使用的程序设计语言)
图形功能选项:Win32控制台程序(黑框、文本界面)、Win32 程序、MFC、WinForm 、DirectX10 (黑体标明表示本课设的程序图形类别,默认为非图形界面Win32控制台程序)
数据结构:基础类型、数组、链表、双向链表、搜索树(非平衡二叉树)、平衡二叉树、链表与
平衡二叉树相结合、堆栈、队列、串、图(黑体标明表示本课设使用的数据结构)C++语言项:STL库(黑体标明表示使用C++的STL库)
编译环境:Windows 7 64 位旗舰版(Linux及其他环境请谨慎下载)
集成开发环境:Visual C++ 6.0、DEVC++、CodeBlocks、Visual Studio 2015 均可通过编译。

(浅蓝色字体表示需要运行修改后的版本,请用户自行选择源代码测试)
分多头文件编译:否(所有代码基本都包含在一个文件内,如需试验头文件功能,请自行参考
相关文献)
内容说明:
1、课设题目及预览内容将在第二页开始展示。

2、代码行数:241行
3、目录所示内容,本文基本涵盖,如无内容,会在本页进行说明。

4、附录绝对包含用户使用手册及程序完整源代码和详细注释。

5、如需下载其他头文件(例如DirectX需另行配置),本文会在此进行说明。

6、本文撰写内容仅供学习参考,另外,由于本人水平有限,编写之处难免存在错误和纰漏,
恳请各位老师或同学批评指正。

WORD文档
《面向对象程序设计》课程设计报告书
设计题目:模拟ATM 机存取款管理系统设计
指导老师:
学生班级:
学生学号:
学生姓名:
同组人员:
时间:2017.12.
课程设计任务书
题目模拟ATM 机存取款管理系统设计
一、设计内容及要求
(1)卡号、密码输入最多三次,否则直接退出系统。

(2)取款功能:取款金额受卡余额、机单笔最大取款金额及机当前剩余金额的限制。

(3)查询功能:实现查询余额功能。

(4)更改密码:实现密码更改功能,对于密码要有 2 次验证。

(5)锁卡功能:实现卡被锁的功能。

(6)退卡功能:实现退出系统功能。

二、设计原始资料
三、设计完成后提交的成果及其相关资料。

四、主要参考资料
《c++程序设计(第二版)》
五、进程安排
12.25:类的设计
12.26:模块4.2 、4.3 的设计
12.27:模块4.4 、4.5 的设计
12.28:完成课程设计报告
第一章概述
使用ATM柜员机可以节约人力资源,方便用户进行简单常用的操作,并且为用户全天候的服务,提高银行效率,给人们提供了非常大
的便利。

本文就以C++语言设计一项简单的模拟ATM柜员机程序。

运行程序时,当输入给定的卡号和密码(初始卡号和密码都为123456)后,系统就能登录ATM柜员机系统,用户可以进入功能实现界面,有查询余额,取款,存款,修改密码等功能。

设计要点:使用文本命令行界面。

当输入给定的卡号和密码(初始卡
号和密码为123456)时,系统能登录ATM柜员机系统,用户可以按照以下规则进行:
查询余额:初始余额为10000 元
ATM取款:每次取款金额为100 的倍数,总额不超过5000元,支取金额不允许透支。

ATM存款:不能出现负存款。

修改密码:新密码长度不小于6位,不允许出现6位完全相同的情况,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以
成功修改密码。

12.29功能:
设计一个模拟ATM柜员机的程序,输入你需要的操作(选择相对的括号里的阿拉伯数字)程序具体功能有:
(1)查询余额
(2)ATM取款
(3)ATM存款
(4)修改密码
(5)退出系统
12.30操作:
本程序通过键盘操作。

在运行过程中,当用户输入正确的账号和密码时,会出现一个功能界面,按照功能界面操作。

只需输入所需操
作的序号,便可执行其中相应的功能。

但是需要小心的是如果输错密码三次,便会锁卡,这时将无法操作。

12.31 模块化设计
为实现系统功能,本程序主要分为六个模块。

它们分别为:主界面、查询余额、ATM取款、ATM存款、修改密码、退出系统。

这六个函数再通过主函数调用分别得以实现。

主函数,首先提供了程序运行时的友好界面,提供客户选择的菜单。

然后,通过执行多分支选择语句——switch 语句,分别实现其它各个函数的调用功能。

其它各个函数的功能分别如下:
ATM() 构造函数
face() 构造函数
checkout() 检验卡号密码
lock() 锁卡
checkmoney() 查询余额
getmoney() ATM取款
savemoney() ATM存款
change() 修改密码
exitsystem() 退出系统
show() 打印界面
12.32程序运行示意图
主界面
输入卡号、密码
退出系统查询余额修改密码
取款存款
4
第四章详细设计
12.33 类的设计
设计了两个类,ATM类和face 类。

ATM类完成ATM柜员机的模拟,包括:验证卡号密码,查询余额,修改密码,取款,存款,退出系统
等功能。

face 类完成显示登陆界面的功能,显示查询余额,修改密
码,取款,存款,退出系统的选项。

ATM类的设计:
class ATM
{
protected :
string card;
string password;
float money;
static int times;
public :
ATM(string c, string p, float m)// 构造函数
{
card= c;
password=p;
money=m;
}
int checkout();// 验证卡号密码
void lock();/ / 锁卡
void checkmoney();// 查询余额
void getmoney();// 取款
void savemoney();// 存款
void change();// 修改密码
void exitsystem();// 退出系统
};
face 类的设计
class face : public ATM
{
protected :
int x;
public :
face( string c, string p, float m): A TM( c, p, m)// 构造函数
{
}
void show();// 显示界面
};
12.34 ATM 柜员机的登陆
在main 主函数中实例化一个face 类的对象,卡号密码都为123456,默认余额为10000.在程序运行中输入卡号密码,若都正确
即可进入主界面,选择ATM柜员机的功能。

程序运行首先要求用户输入卡号和密码,卡号和密码首先由main 主函数构造默认,然后用checkout()函数判断卡号密码是否一致,
一致则登陆,如果连续 3 次输入错误,则用lock ()函数锁定卡号密码。

相关代码:
void ATM::lock()
{
if (times==3)
{
cout<< " 输入密码3次错误,该卡已被锁" <<endl;
exitsystem();
}
}
int ATM::checkout()
{
string a;
string b;
while (1)
{
cout<< " 请输入您的卡号:" ;
cin>>a;
cout<< " 请输入您的密码:" ;
cin>>b;
if (card!=a||password!=b)
{
times++;
lock();
cout<< " 卡号或密码有误,请重新输入" <<endl;
}
else
{
break ;
}
}
return 1;
}
12.35 ATM 柜员机修改密码功能
新密码长度不小于 6 位,不允许出现 6 位完全相同的情况,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才能成功修改密码。

输入正确卡号密码后,或者实现其他功能退回主界面后都可以选
择柜员机的修改密码功能,在运行过程中先要求用户输入旧密码,判断用户输入的旧密码是否与默认密码相同,若相同则继续运行,若不
同则需要重新输入。

验证旧密码正确后系统会要求用户定义新密码,新密码要重复输入两次,要求两次必须重复正确且新密码符合要求才能修改成功。

相关代码:
void ATM::change()
{
int count=0,i,j,flag=1;
string secondpassword;
string newpassword;
string oldpassword;
cout<< "请输入旧密码:" ;
cin>>oldpassword;
if (password==oldpassword)
{
cout<< " 请输入新密码:" ;
cin>>newpassword;
if (newpassword.size()>=6)
{
for (i=0;i<newpassword.size();i++)
{
for (j=i+1;j<newpassword.size();j++)
{
if (newpassword[i]==newpassword[j])
{
count++;
}
}
}
if (count<6)
{
while (flag)
{
cout<< "请再次输入新密码:" ;
cin>>secondpassword;
if (newpassword==secondpassword)
{
cout<< " 密码修改成功!" <<endl;
flag=0; }
else
{
8
cout<< " 两次密码输入不一样, 请重新输入" <<endl;
flag=1;
}
}
}
else
{
cout<< " 修改密码失败,请重新修改" <<endl;
}
}
else
{
cout<< " 修改密码失败,请重新修改" <<endl;
}
}
else
{
cout<< " 修改密码失败,请重新修改" <<endl;
}
}
12.36 ATM 柜员机存款取款功能
输入正确卡号密码后,即可登录柜员机主界面,其中可以选择取款,存款功能。

取款功能要求用户输入取钱金额,取钱功能用if 语句判断金额是否是100 的倍数且金额是否大于5000 或小于0,若符合要求,则顺利运行。

用getmoney() 函数实现更新用户余额,余额为账户余额减
去取钱金额,当取钱成功时,系统会提示用户是否继续取钱,若输入“Y”则继续,若输入“N”则退回主界面,若输入其他字符则要重新输入。

存款功能要求用户不能输入负值的金额,用if 语句判断,若符合条件,则成功取款,并且用savemoney()函数更新余额,余额为账
户余额加上存款金额,当成功存款时,系统会提示是否继续存款,若输入“Y”则继续,若输入“N”则退回主界面,若输入其他字符则要重新输入。

存款功能代码:
void ATM::savemoney()// 存款
{
char ch;
float save;// 存入金额
do
{
cout<< " 请输入存款金额:" ;
cin>>save;
if (save<0)
{
cout<< " 存款金额有误,请重新输入" <<endl;
}
else
{
cout<< " 正在存款中,请稍候......" <<endl;
money=money+save;
cout<< " 交易成功!" <<endl;
}
cout<< " 请问是否继续存款?(Y/N)" <<endl;
cin>>ch;
while (ch!= 'Y' &&ch!='N' )
{
cout<< " 该操作无效,请重新输入:" <<endl;
cin>>ch;
}
} while (ch== 'Y' );
}
取款功能代码:
void ATM::getmoney()// 取款
{
int get;// 取款金额
char ch;
do
{
cout<< " 请输入取款金额:" ;
cin>>get;
if (get>5000||get<0||get%100!=0)
{
cout<< " 支取金额有误,请重新输入" <<endl;
}
else if ((money-get)<0)
{
cout<< " 对不起,您的余额不足,请重新输入" <<endl;
}
else
{
cout<< " 正在取款中,请稍候......" <<endl;
money=money-get;
cout<< " 取款成功!" <<endl;
}
cout<< " 请问是否继续取款?(Y/N)" <<endl;
cin>>ch;
while (ch!= 'Y' &&ch!='N' )
{
cout<< " 该操作无效,请重新输入:" <<endl;
cin>>ch;
}
} while (ch== 'Y' );
}
12.37 ATM柜员机查询余额功能
输入正确卡号密码后,即可登录柜员机主界面,其中可以选择查询余额功能。

余额主要调用checkmoney() 函数。

代码如下:
void ATM::checkmoney()// 查询余额
{
cout<< "余额:" <<money<<endl;
cout<< "查询余额成功!" <<endl;
}
第五章调试与测试
12.38 调试过程中的主要问题
由于本程序的运行是当输入卡号密码成功后登陆主界面,在主界面中执行完一个功能后再次回到主界面进行操作,而程序大体上是没问题的,但是还是有一些小问题:
当执行完存款或取款后,没有提示是否继续执行此操作,而是直
接退回主界面,这是一处不善人意的地方,但是经过修改,已将此功
能加入程序。

12.39 具体测试过程
(1)检验卡号密码(如下图)
(2)卡号密码输入成功(如下图)
(3)卡号密码输入有误(如下图)(4)查询余额(如下图)
(5) ATM 取款成功(如下图)
(6) ATM 取款不成功(如下图)
(7) ATM 存款成功(如下图)
(8) ATM 存款不成功(如下图)
(9) 修改密码成功(如下图)
(10) 修改密码失败(如下图)(11)退出系统(如下图)
第六章心得体会
经过一个学期对《C++程序设计》的学习,我学习到了基本的理论知识,了
解到了C++语言程序设计的思想,这些知识都为我的课程实践和进一步的学习打下了坚实的基础。

在为期近两周的C++课程设计中,我体会颇多,学到了很多东西。

我加强了对C++程序设计这门课程的认识,并且复习了自己以前学习到的
知识。

这些都使得我对计算机语言的学习有了更深入的认识! 总之,通过这次课程设计,我收获颇丰,相信会为自己以后的学习和工作带来很大的好处。

像职工信息表这样的程序设计,经历了平时在课堂和考试中不会出现的问题和考验。

而这些问题,这并不是我们平时只靠课本,就可以轻易解决的。

所以,锻炼了我们
挑战难题,学会用已掌握的知识去解决具体问题的能力,进一步培养了独立思考问题和解决问题的能力。

特别是学会了在Visual C++中如何调试程序的方法。

当然,老师的指导和同学的帮助也是不可忽视的,他们给了我许多提示和帮助,
教会了我编译复杂程序的方法。

在老师和同学的帮助下,通过自己的努力,终于完成了这次职工信息表的简单课程设计。

我经过这段时间的编程,对其中的艰辛,我是深有体会。

从刚开始
的选择程序、理解程序到后来的调试程序以及改进程序这个过程中,我遇到了各种各样的困难和挫折。

但是我坚定信念,对自己充满了信心,想尽一切办法克服重重困难。

通过课程设计的训练,我进一步学习和掌握了对程序的设计和编写,从中体会到了面向对象程序设计的方便和巧妙。

懂得了在进行编写一个程序之前,要有明确的目标和整体的设计思想。

另外某些具体的细节内容也是相当的重要。

这些
宝贵的编程思想和从中摸索到的经验都是在编程的过程中获得的宝贵财富。

这些经验对我以后的编程会有很大的帮助的,我要好好利用。

虽然这次课程设计是在参考程序的基础之上进行的,但是我觉得对自己是一个挑战和锻炼。

我很欣慰自己能在程序中加入自己的想法和有关程序内容,也就是对它的程序改进了一番改进,并有创新。

但是我感觉自己的创新还不够典型,
总之还不是很满意。

另外由于时间的紧迫和对知识的了解不够广泛,造成了系统中还存在许多不足,功能上还不够完善。

以后我会继续努力,大胆创新,争取能
编写出透射着自己思想的程序。

这次课程设计让我充分认识到了自己的不足, 认识到了动手能力的重要性。

我会在以后的学习中更加努力锻炼自己,提高自己,
让自己写出更好更完善的程序,为以后的编程打好基础!
附录
用户使用手册
1、卡号:123456 密码:123456
2、根据提示,输入指定内容即可。

程序源代码
//#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <conio.h>
#include <iomanip>
#include <Windows.h>
#pragma warning ( disable :4996)
using namespace std;
/*************************** 类******************************/
class ATM
{
protected :
string card;
string password;
float money;
static int times;
public :
ATM(string c, string p, float m):card( c), password( p), money( m){} // 构造函数
int checkout(); // 验证卡号密码
void lock(); // 锁卡
void checkmoney(); // 查询余额
void getmoney(); // 取款
void savemoney(); // 存款
void change(); // 修改密码
void exitsystem(); // 退出系统
};
int ATM::times = 0;
class face : public ATM
{
protected :
int x;
public :
face( string c,string p, float m): ATM( c, p, m){} // 构造函数void show(); // 显示界面
};
void face ::show()
{
cout << endl << "**********************" << endl;
cout << "1. 查询余额" << endl;
cout << "2.ATM 取款" << endl;
cout << "3.ATM 存款" << endl;
cout << "4. 修改密码" << endl;
cout << "5. 退出" << endl;
cout << "**********************" << endl;
cout << " 请输入您需要查询的信息:" ;
}
void ATM::lock()
{
if (times == 3)
{
cout << " 输入密码3次错误,该卡已被锁" << endl;
exitsystem();
}
}
int ATM::checkout()
{
string a;
string b;
while (1)
{
cout << " 请输入您的卡号:" ;
cin >> a;
cout << " 请输入您的密码:" ;
cin >> b;
if (card != a || password != b)
{
times++;
lock();
cout << "卡号或密码有误,请重新输入" << endl;
}
else
break ;
}
return 1;
}
void ATM::change()
{
int count = 0, i, j, flag = 1;
string secondpassword;
string newpassword;
string oldpassword;
cout << " 请输入旧密码:" ;
cin >> oldpassword;
if (password == oldpassword)
{
cout << " 请输入新密码:" ;
cin >> newpassword;
if (newpassword.size() >= 6)
{
for (i = 0; i<newpassword.size(); i++)
{
for (j = i + 1; j<newpassword.size(); j++)
{
if (newpassword [ i ] == newpassword [ j ] )
{
count++;
}
}
}
if (count<6)
{
while (flag)
{
cout << " 请再次输入新密码:" ;
cin >> secondpassword;
if (newpassword == secondpassword)
{
cout << " 密码修改成功!" << endl;
flag = 0;
}
else
{
cout << " 两次密码输入不一样, 请重新输入" << endl;
flag = 1;
}
}
}
else
cout << " 修改密码失败,请重新修改" << endl;
}
else
cout << "修改密码失败,请重新修改" << endl;
}
else
cout << " 修改密码失败,请重新修改" << endl;
}
void ATM::exitsystem()
{
exit(0);
}
void ATM::savemoney() // 存款
{
char ch;
float save; // 存入金额
do
{
cout << " 请输入存款金额:" ;
cin >> save;
if (save<0)
cout << "存款金额有误,请重新输入" << endl;
else
{
cout << "正在存款中,请稍候......" << endl;
money = money + save;
cout << "交易成功!" << endl;
}
cout << " 请问是否继续存款?(Y/N)" << endl;
cin >> ch;
while (ch != 'Y' &&ch != 'y' &&ch != 'n' &&ch != 'N' )
{
cout << "该操作无效,请重新输入:" << endl;
cin >> ch;
}
} while (ch == 'Y' || 'y' == ch);
}
void ATM::getmoney() // 取款
{
int get; // 取款金额
char ch;
do
{
cout << " 请输入取款金额:" ;
cin >> get;
if (get>5000 || get<0 || get % 100 != 0)
cout << "支取金额有误,请重新输入" << endl;
else if ((money - get)<0)
cout << "对不起,您的余额不足,请重新输入" << endl;
else
{
cout << "正在取款中,请稍候......" << endl;
money = money - get;
cout << "取款成功!" << endl;
}
cout << " 请问是否继续取款?(Y/N)" << endl;
cin >> ch;
while (ch != 'Y' &&ch != 'y' &&ch != 'n' &&ch != 'N' )
{
cout << "该操作无效,请重新输入:" << endl;
cin >> ch;
}
} while (ch == 'Y' &&ch == 'y' );
};
void ATM::checkmoney() // 查询余额
{
cout << " 余额:" << money << endl;
cout << " 查询余额成功!" << endl;
}
/********************************************************************/
/*********************************************************************/
int main( int argc , char * argv [])
{
char select = '1' ;
face f( "123456" , "123456" , 10000);
cout << "*****************************************" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "* 欢迎使用ATM机*" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "*****************************************" << endl;
if (f.checkout());
do {
f.show();
cin >> select;
switch (select)
{
case '1' :f.checkmoney();
break ;
case '2' :f.getmoney();
break ;
case '3' :f.savemoney();
break ;
case '4' :f.change();
break ;
case '5' :
cout << endl << "***************** 谢谢您的使用******************" << endl;
cout << "************ 请取卡,收好您的银行卡*************" << endl;
break ;
}
} while ( '5' != select);
return 0;
}
附件
1、直接在word 文件双击打开
2、不要另存到桌面,这样文件会损失,数据不全,要在word 里双击打开再【另存为】,才能保证文件的完整性。

模拟ATM机存取款管理系统设计VC6.0++ 项目.zip main.cpp
24.
WORD文档专业资料。

相关文档
最新文档