c++模拟ATM取款机的设计.docx
《c++模拟ATM取款机的设计.docx》由会员分享,可在线阅读,更多相关《c++模拟ATM取款机的设计.docx(30页珍藏版)》请在冰点文库上搜索。
c++模拟ATM取款机的设计
本科生课程设计论文
题目:
C++课程设计
——模拟ATM取款机的设计
学生姓名:
学号:
专业:
通信工程
班级:
指导教师:
前言
现今的社会发展迅速,ATM成为了人们在银行方面不可缺少的使用工具,使用ATM的人越来越多,所以ATM的数量也在迅速的增长着。
电信运营公司已向社会提供ATM的商用业务,ATM技术正在走向成熟。
一些传统电信公司在核心网络技术的选择上首选ATM,例如AT&T。
但是,近来高比特路由器的问世,使一些数据业务的运营公司眼前一亮,并正在开展有关IP直接在SONET或SDH上传送的业务。
Sprint公司使用Cisco12000路由器与SONETOC-12链路一起提供IPoverSONET业务。
MCI亦有计划提供类似的业务。
但是,这种方式与ATM相比,不足之处是尚不适于多业务平台,网络流量和拥塞控制能力差,也不能保证具有优先级的QOS,而ATM的可拓性及提供新业务的能力使得多数运营公司仍在积极地扩大ATM的服务范围。
本文将主要介绍ATM的特点。
ATM的发展情况及主要技术进展。
IATM的技术特点ATM的主要技术特点如下:
1.ATM是一种统计时分复用的技术。
ATM将一个物理通路划分为多个具有不同传输特性的虚通路提供给用户,实现网络资源的按需分配。
2.ATM利用硬件实现固定长度包的快速交换,具有时延小,实时性好的特点,能够满足多媒体数据传输的要求。
3.ATM是支持多种业务的传送平台,并提供服务质量的保。
第一章C++简介
1、C++语言的简介及发展
C++语言发展大概可以分为三个阶段:
第一阶段从80年代到1995年。
这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。
当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;
第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
2、C++语言的特点
20世纪80年代初期,美国AT&T贝尔实验室的本贾尼•斯特劳斯特卢普(BjarneStroustrup)博士发明并实现了C++(最初这种语言被称作“CwithClasses”)。
一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。
虚函数(virtualfunction)、运算符重载(operatoroverloading)、多重继承(multipleinheritance)、模板(template)、异常(exception)、RTTI、命名空间(namespace)逐渐被加入标准。
1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC1988-1998。
C++是具有国际标准的编程语言,通常称作ANSI/ISOC++。
1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准。
C++0x最终国际投票已于2011年8月10日结束,并且所有国家都投出了赞成票,C++0x已经毫无疑义地成为正式国际标准。
先前被临时命名为C++0x的新标准将被称为C++2011。
C++2011将取代现行的C++标准ISO/IEC14882,它公开于1998年并于2003年更新,通称C++98以及C++03。
国际标准化组织于2011年9月1日出版发布ISO/IEC14882:
2011,名称是:
Informationtechnology--Programminglanguages--C++Edition:
3。
C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。
C++设计成直接的和广泛的支持多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。
C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。
C++设计成尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。
C++避免平台限定或没有普遍用途的特性。
C++不使用会带来额外开销的特性。
C++设计成无需复杂的程序设计环境。
出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。
关于此类话题,BjarneStroustrup的《C++语言的设计和演化》(1994)里做了详尽的陈述。
3、C++的优点与缺点
C++在一定程度上可以和C语言很好的结合,甚至目前大多数C语言程序是在C++的集成开发环境中完成的。
C++相对众多的面向对象的语言,具有相当高的性能。
C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。
很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。
尽管C++语言有很强大的功能,但是在一些方面也存在争议。
C++由于语言本身过度复杂,这甚至使人类难于理解其语义。
更为糟糕的是C++的编译系统受到C++的复杂性的影响,非常难于编写,即使能够使用的编译器也存在了大量的问题,这些问题大多难于被发现。
由于本身的复杂性,复杂的C++程序的正确性相当难于保证。
也有人提出不支持多线程的原语等缺陷。
不过有如此多的知名人士提出了如此多的缺陷,正说明C++被广泛使用和成功。
C++语言由于过度的复杂性,以及与unix的文化相抵触,在unix/linux领域受到很多著名人士(比如Linux之父linustorvalds与著名黑客EricS.Raymond)的强烈批评与抵制。
第二章需求分析
软件设计的一个重要的环节就是需求分析。
本章在对ATM取款机管理系统的应用情况作了全面调查的基础上,确定系统目标,并对系统所需要的基础功能进行分析,从而确定用户的需求。
以下是ATM取款机管理系统所需要的需求分析。
ATM管理系统包括六个模块:
登录,挂失功能,修改密码,取款功能,转账功能,查询功能。
登录:
输入银行卡的账号,密码,验证银行卡的卡号,密码是否正确,之后进入主界面
挂失功能:
确认是否对银行卡进行挂失,挂失后账户无法操作
修改密码:
用户可自由对其银行卡密码进行修改,修改之后的新密码将会覆盖其原密码
取款功能:
用户可自由取得所持银行卡内的存款,所取款数必须在其原有账户余额之内
转账功能:
用户可将本账户中的存款转入其他账户,转账过程中,需要转入账户的账号
查询功能:
用户可查询用户信息,其中包括用户姓名、用户身份证号码、银行卡号以及存款余额
模拟ATM取款机的操作:
首先录入账户信息,格式如下
帐号
姓名
身份证
密码
余额
323401020056078
李四
150********8080088
123456
450.8
、登录功能:
输入帐号和密码进行登录,如密码错误提示重新输入密码,如帐号错误提示无此帐户。
、查询功能:
查询账户余额。
、取款功能:
取款,更新余额。
、挂失功能:
挂失后,该账户不能进行任何操作。
、修改密码:
输入原密码和新设置密码。
、转账功能:
输入转账的转出账户以及转账金额,进行转账。
第三章设计分析
3.1、ATM系统管理
3.1.1统基本功能
首先,确定系统中存在两种用户,一种是ATM,可以进行信息录入和后台管理。
另外一种是取款人,取款人主要是进行信息的查询,不能进行信息录入。
所以在创建类的时候,先创建一个ATM类,然后创建取款人类,并与ATM类形成有元,进而继承ATM的所有功能,并添加录入信息的功能。
基本功能:
登录功能---------输入帐号和密码进行登录,如密码错误提示重新输入密码,如帐号错误提示无此帐户。
查询功能---------查询账户余额。
取款功能---------取款,更新余额。
挂失功能---------挂失后,该账户不能进行任何操作。
修改密码---------输入原密码和新设置密码。
转账功能---------输入转账的转出账户以及转账金额,进行转账。
系统功能如图:
图3-1-1上图中所示为ATM系统的基本功能分类
3.1.2相关数据结构的说明
信息的载体用对象数组。
系统录入信息的操作非常枯燥,所以创建一个文件,把每次录入的信息保存入文件,在下一次进入系统是,它会默认读取文件原有的信息,当然也可以随时添加录入ATM信息。
然后系统的各个功能仅仅是通过查询找到具体对象的具体数据进行操作。
用户姓名:
Name字符型。
用户账号:
Num字符型。
用户密码:
Password字符型。
身份证号:
Id字符型。
存款数额:
Money实型。
3.1.3类的设计
1)、定义了一个ATM取款机类,类中包括以下几部分:
公有段:
依次为登陆界面,核对密码,挂失,修改密码,取款,转账,查询信息,退出系统,功能界面,锁机。
私有段:
记录密码输入次数以及变量j。
友元函数:
取款,转账,查询信息,账号,密码。
2、)定义了一个consumer类,类中包括以下几部分:
公有继承了consumer类
私有段:
用户密码,用户姓名,用户身份证号,卡号,存款钱数
保护段:
取得姓名,取得卡号,取得身份证号,取得密码,取得余额,设置密码,取钱
3.2系统流程图
利用流程图来说明系统各个部分之间如何协调来完成任务。
1)登录流程
图3-2-1图中显示的是登陆的基本流程:
2)查询功能
图3-2-2图中显示的是查询的基本流程:
3)挂失功能
图3-2-3图中显示的是挂失的基本流程:
4)修改密码
图3-2-4图中显示的是修改密码的基本流程:
5)取款功能
图3-2-5图中显示的是取款的基本流程:
6)转账功能
图3-2-6图中显示的是转账的基本流程:
3.3参数说明
全局变量,重要形式参数、全局变量局部变量等等,它们的命名及用途解释
boolj:
全局变量。
charm,t,ch:
全局变量。
inttimes:
重要形式参数。
第四章运行及测试结果
对运行及测试结果进行说明,并添加运行界面的截图。
4.1、登录主界面
上图1:
为主界面登录窗口
上图2:
图为登录主界面时,账号或密码出错时系统自动锁机
上图3:
图为成功登录后,主界面所显示的窗口
4.2、挂失功能
上图4:
根据所选代码进行挂失,挂失后系统将退出主界面
4.3、修改密码
上图5:
图为更改密码功能界面,更改后的密码为新密码
4.4、取款功能
上图6:
为图为取款功能界面,图中显示为成功取款
上图7:
图为取款失败后的功能界面
4.5、转账功能
上图8:
图为转账功能界面,图中显示为转账成功后的界面
上图9:
图为转账失败后的功能界面
4.6、查询功能
上图10:
图中所示为用户个人信息,包括用户姓名、身份证号、银行卡号以及存款余额
4.7、退出系统
上图11:
图为选择序号后系统退出的页面
第五章课程设计总结
课程设计旨在锻炼学生的实际动手能力和解决真实问题的能力。
并在其中掌握和熟练所学的知识,并能够运用所学知识解决比较简单的现实模拟问题。
本次课程设计在老师的帮助和自己的努力下终于能够成功运行,使我感到非常高兴以及提高了自己的编程信心,虽然这次课程设计的题目实现比较简单和不实用但毕竟是自己将近两个星期的努力地结果。
在期间我对编程的理念理解又加深了一点,课程设计使我明白好的算法或者是好的逻辑思维对编程的重要性,在调试期间我自卑过、高兴过、平静过。
可以说是我经历了比较大的情感波动。
当费很大劲才把程序调运行的时候那种感觉实在是太好了。
在本次课程设计活动中,我明显的感觉到自己知识的欠缺和实际动手能的差劲。
尤其是在传值传参的函数调用时更体现的非常明显,感觉自己的书本学的不透、学的不扎实。
有些地方更本就不会,不如说文件的操作,比如说系统时间的获取等以前在上课或作习题时更本就不会考虑的问题在课程设计当中完全暴露出来。
通过本次试验,主要加深了对于友元函数,友元类使用的熟练程度。
程序功能相对比较简单,没有设计复杂的继承和重载函数,完成的比较轻松!
附录
以下是程序的源代码,并且加上了详细的注释:
#include"iostream"
usingnamespacestd;
classconsumer;
classATM//ATM取款机类
{
public:
ATM(consumer&cn):
cnsm(cn)
{
j=true;
}
voidwelcome();//登陆界面
boolcheck_passwd(charn[],charpwd[]);//核对密码
boolcheck_zhang(charnum[]);//核对转入账号
boolgua();//挂失
voidchange_passwd();//修改密码
voidfetchmoney();//取款
voidzhuan();//转账
voidinformation();//查询信息
voidexitATM();//退出系统
voidfunctionshow();//功能界面
voidlock();//锁机
private:
boolj;
inttimes;//记录密码输入次数
consumer&cnsm;
};
classconsumer//用户类
{
public:
friendclassATM;
consumer(charName[],charNum[],charId[20],floatMoney,charPassword[]);
protected:
char*get_name();//取得姓名
char*get_num();//取得卡号
char*get_id();//取得身份证号
char*get_passwd();//取得密码
floatget_money();//取得余额
voidset_passwd(charpwd[]);//设置密码
voidset_money(floatm);//取钱
private:
charpasswd[8];//用户密码
charname[20];//用户姓名
charid[20];//用户身份证号
charnum[20];//
floatmoney;//
};
consumer:
:
consumer(charName[],charNum[],charId[20],floatMoney,charPassword[])
{
strcpy(name,Name);
strcpy(num,Num);
strcpy(id,Id);
money=Money;
strcpy(passwd,Password);
}
floatconsumer:
:
get_money()
{
returnmoney;
}
char*consumer:
:
get_name()//对于数组的返回操作返回指针
{
returnname;
}
char*consumer:
:
get_num()
{
returnnum;
}
char*consumer:
:
get_id()
{
returnid;
}
char*consumer:
:
get_passwd()
{
returnpasswd;
}
voidconsumer:
:
set_money(floatm)
{
money-=m;
}
voidconsumer:
:
set_passwd(charpwd[])
{
strcpy(passwd,pwd);
}
voidATM:
:
welcome()
{
times=0;
cout<<"欢迎使用银行ATM自动取款机"<charpwd[8],num1[20],ch;
inti=0;
do
{
i=0;
cout<";
do
{
cin.get(ch);//对于键盘字符串的接收!
num1[i++]=ch;
}
while(ch!
='\n');
num1[i-1]='\0';
i=0;
cout<<"请输入密码:
";
do
{
cin.get(ch);
pwd[i++]=ch;
}
while(ch!
='\n');
pwd[i-1]='\0';
if(!
check_passwd(num1,pwd))
{
cout<<"你输入的卡号或密码有误,请重新输入"<times++;
}
else
{
functionshow();
}
}
while(times<3);
lock();
}
boolATM:
:
check_passwd(charnum[],charpwd[])
{
if(strcmp(num,cnsm.get_num())==0&&strcmp(pwd,cnsm.get_passwd())==0)
returntrue;
else
returnfalse;
}
voidATM:
:
functionshow()
{
intn;
do
{
cout<<"本机可办理以下业务:
"<cout<<"********************"<cout<<""<cout<<"1>挂失"<<""<<"2>修改密码"<cout<<""<cout<<"3>取款"<<""<<"4>转账"<cout<<""<cout<<"5>查询余额"<<""<<"6>退出系统"<cout<<""<cout<<"********************"<cout<"<cin>>n;
while(n<1||n>6)
{
cout<<"请输入正确的操作序号!
"<cin>>n;
}
switch(n)
{
case1:
gua();break;
case2:
change_passwd();break;
case3:
fetchmoney();break;
case4:
zhuan();break;
case5:
information();break;
case6:
exitATM();break;
}
}
while(true);
}
boolATM:
:
gua()
{
chara;
do
{
cout<<"是否确认挂失:
(y/n)继续请按y退出请按n"<cin>>a;
if(a=='y')
{
cout<<"您已挂失成功!
"<exit
(2);
}
else
{
cout<<"您已选择退出!
"<}
}
while(a=='y');
returnj=true;
}
voidATM:
:
change_passwd()
{
charpwd[8],repwd[8];
times=0;
do
{
cout<";
cin>>pwd;
if(!
check_passwd(cnsm.get_num(),pwd))
times++;
else
break;
}
while(times<3);
if(times==3)
lock();
intt=1;
do
{
cout<<"请输入新密码:
";
cin>>pwd;
cout<<"请再输入一次新密码:
";
cin>>repwd;
t=strcmp(pwd,repwd);//相同返回0;
if(t!
=0)
cout<<"你输入的两次密码不一样,请重新输入!
"<}
while(t!
=0);
cnsm.set_passwd(pwd);
cout<<"密码修改成功,请牢记!
"<}
voidATM:
:
fetchmoney()
{
floatm;
charch;
do
{
cout<"<cin>>m;
while(m<=0)
{
cout<<"请输入正确的数字!
"<cin>>m;
}
if(cnsm.get_money()-m<0)
{
cout<<"对不起,你的余额不足!
"<}
else
{
cout<"<cnsm.set_money(m);
}
cout<<"是否要继续取款:
(y/n)"<cin>>ch;
}
while(ch=='y'||ch=='Y');
}
voidATM:
:
zhuan()
{
charz[20];
floatnum;
cout<<"请输入所转账号:
"<cin>>z;
cout<<"请输入所转钱数:
"<cin>>num;
cnsm.money-=num;
if(cnsm.money>0)
cout<<"转账成功!
"<<"您的余额:
"<else
cout<<"余额不足!
"<}
voidATM:
:
information()
{
cout<<"**********************************"<cout<<"*用户姓名:
"<cout<<"*身份证号:
"<cout<<"*银行卡号:
"<cout<<"*存款余额:
"<cout<<"*********************