ATM取款机模拟程序的设计说明书.docx

上传人:b****7 文档编号:9884845 上传时间:2023-02-07 格式:DOCX 页数:20 大小:70.64KB
下载 相关 举报
ATM取款机模拟程序的设计说明书.docx_第1页
第1页 / 共20页
ATM取款机模拟程序的设计说明书.docx_第2页
第2页 / 共20页
ATM取款机模拟程序的设计说明书.docx_第3页
第3页 / 共20页
ATM取款机模拟程序的设计说明书.docx_第4页
第4页 / 共20页
ATM取款机模拟程序的设计说明书.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

ATM取款机模拟程序的设计说明书.docx

《ATM取款机模拟程序的设计说明书.docx》由会员分享,可在线阅读,更多相关《ATM取款机模拟程序的设计说明书.docx(20页珍藏版)》请在冰豆网上搜索。

ATM取款机模拟程序的设计说明书.docx

ATM取款机模拟程序的设计说明书

ATM取款机模拟程序设计说明书

1.设计容和要求

设计容

课题的任务是设计一个ATM取款机的模拟程序。

日常生活中,我们常使用ATM取款机,对它的操作过程有所了解。

这里我们要模拟的是用户所见的ATM取款机的属性和行为,ATM机与网络连接的部分不包括在这个任务中。

设计中应尽可能把它模拟得与真实的ATM接近一些,我们抽象出下列问题:

(1)用户插卡,ATM验证用户信息。

(2)用户首次操作须验证密码。

(3)用户查询余额,ATM显示余额。

(4)用户取款,ATM操作交易过程。

(5)用户转账,ATM请求插入转入卡,然后操作交易过程。

(6)用户更改密码,ATM受理此业务。

(7)用户退卡。

ATM清理现场。

(8)所有用户信息保存在文件中。

(9)对于一个在线用户,如果超过一定时间用户没有任何操作,ATM锁机,直到用户退卡为止。

(10)ATM向用户显示欢迎词及其他提示信息。

设计要求

<1>功能要求:

(1)插卡功能(用卡号模拟);

(2)取款功能;

(3)查询余额功能;

(4)验证功能;

(5)更改密码功能;

(6)退卡功能;

(7)锁卡功能。

<2>界面要求:

用户界面设计不做统一规定,但应做到界面友好,易于操作。

<3>技术要求:

要求所有用户的信息以密文形式保存在数据文件中,加密算法为:

字节各位取反,然后高半字节和低半字节交换位置。

用户输入密码时不能以明文形式显示在屏幕上,应以“*”号代替来显示用户密码的输入。

要求利用面向对象的方法以及C++的编程思想来完成系统的设计;在设计的过程中,建立清晰的类层次;在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;要求运用面向对象的机制来实现系统功能。

要求主函数(或图形界面下的主调函数)很“干净”,只有一些类对象的定义和某个类对象的一个成员函数的调用。

1

2.设计说明

2.1问题描述与功能设计

问题描述

课题的任务是设计一个ATM取款机的模拟程序。

日常生活中,我们常使用ATM取款机,对它的操作过程有所了解。

这里我们要模拟的是用户所见的ATM取款机的属性和行为,ATM机与网络连接的部分不包括在这个任务中。

设计中应尽可能把它模拟得与真实的ATM接近一些,我们抽象出下列问题:

(1)用户插卡,ATM验证用户信息。

(2)用户首次操作须验证密码。

(3)用户查询余额,ATM显示余额。

(4)用户取款,ATM操作交易过程。

(5)用户转账,ATM请求插入转入卡,然后操作交易过程。

(6)用户更改密码,ATM受理此业务。

(7)用户退卡。

ATM清理现场。

(8)所有用户信息保存在文件中。

(9)对于一个在线用户,如果超过一定时间用户没有任何操作,ATM锁机,直到用户退卡为止。

(10)ATM向用户显示欢迎词及其他提示信息。

功能设计

该程序应具有以下功能:

(1)插卡功能(用卡号模拟);

(2)取款功能;

(3)查询余额功能;

(4)验证功能;

(5)更改密码功能;

(6)退卡功能;

(7)锁卡功能。

 

2.2流程图

33

2.3类定义和链表

classCard{

public:

Card(chara[10],intb,doublec)

{

strcpy(num,a);

code=b;

money=c;

}

charnum[10];

intcode;

doublemoney;

};

structnode

{

Card*cod;

node*next;

};

在该程序中定义了类Card,,同时声明了3个数据成员。

该类有一个构造函数,用来给数据成员赋值。

3个数据成员用来保存用户的信息,包括卡号,密码,余额。

链表中声明了一个Card类类型的指针,以通过链表中的结点访问该指针,从而访问到定义在类中的数据成员,即用户信息。

函数要访问数据成员时,都用这种指向方式,如head->cod->num。

而另外一个node指针的数据成员,指向当前结点的下一个结点,利用这种方法遍历链表。

将类定义和链表结合起来,可以简化该问题,在一定程度上减少了程序代码。

然后再将文件里的信息依次读到链表的各个结点中,就完成了数据成员即用户信息的初始化,使问题变得简单。

这就是用类定义和链表的好处所在。

2.4界面设计

该程序的界面设计总的来说是体现了对用户的友好性。

首先是欢迎界面,看起来非常美观,还有欢迎语句:

欢迎使用本银行ATM机。

在用户每次输入前,都有输出语句提醒用户,同时在用户进行完每步操作后都循环输出提示信息,用户可自行选择继续或退出。

当用户操作有误或交易失败时,界面上会输出出错信息告知用户,三次密码输入错误即锁卡。

最后用户退出时,输出语句:

谢谢使用,欢迎下次光临。

同时提醒用户取卡。

界面的设计体现了程序设计的友好性,同时易于操作。

欢迎界面:

出错提醒界面:

5

用户退出时输出界面:

 

2.6测试

测试该程序的主函数十分简单,只有一些提示信息的输出和功能函数的调用。

主函数首先调用创建链表的函数进行创建,同时每创建一个节点就从文件中读出一条信息初始化数据成员。

创建完后输出欢迎信息,然后进入程序让用户输入卡号,调用验证卡号的函数,如果正确则进行后面的操作,输入错误则退出程序。

接下来是输出提示信息让用户输入卡号的密码,再调用验证密码的功能函数,正确则可进行取款等操作,错误再提示用户重新输入,三次输入错误就锁卡。

若用户卡号和密码都输入正确,则输出菜单让用户选择操作。

菜单中有五个选项,取款,查询余额,转账,更改密码,退卡。

定义一个变量接收用户从键盘输入的数据,后面有五个if语句,根据用户输入的数据来判断执行哪个if语句中的函数,这些函数的功能和菜单中提供的操作是相对应。

用户输入1表示取款,2表示查询余额,3表示转账,4表示更改密码,5表示退出,调用完功能函数后再调用一个函数将修改后的信息存进文件中,用户下次进入时将会显示修改后的信息。

同时在退出每一个if程序块后又再一次输出菜单选项供用户选择,菜单的循环输出可以方便用户连续进行不同的操作。

若用户选择退出则输出:

谢谢使用,欢迎下次光临。

同时还有输出语句提醒用户取卡。

以下是测试函数的一部分代码:

cout<<"请选择您需要的操作:

";

intr;

cin>>r;

if(r==1)

{

cout<<"【取款】"<

fetchmoney(temp);

save(listhead);

}

if(r==2)

{

cout<<"【查询余额】"<

search(temp);

save(listhead);

if(r==3)

{cout<<"【转帐】"<

zhuan(temp,listhead);

save(listhead);

}

if(r==4)

{cout<<"【更改密码】"<

change_code(temp);

save(listhead);

}

测试后得到的结果正确,说明功能函数实现了预定的功能。

7

3.总结

 

该课程设计的题目是设计一个ATM模拟程序。

在设计任务中,为尽可能把它模拟得跟真实的ATM接近一些,要求要具有以下功能:

取款,查询余额,转帐,更改密码,退卡,锁卡等。

同时要求界面要美观,友好,易操作。

在技术上要把所有用户的信息以密文形式保存在数据文件中,且用户输入密码时不能以明文形式显示在屏幕上。

由于这次课程设计有两个星期的时间,所以时间还算充足。

但在编写过程中也遇到了不少的困难。

首先,由于要保存用户的,密码,余额等个人信息,所以考虑用类来实现,将这三种信息设计为类的数据成员。

文件中保存的也不止一个人的信息,而这些用户的信息又都访问,所以在类的基础上再构建链表。

通过返回链表的头结点,外部函数只要遍历链表则可访问文件中所有用户的信息。

为安全起见,用户的信息是加密后再存入数据文件中的,在这个地方就要用到加密的函数。

所以总的来说,这个程序是将类,链表,文件这三大块的知识结合在一起,只要将这些条理理清楚,这个任务可以说已经完成一半了。

这是分析设计这个程序的过程。

接下来,就是写程序,实现函数功能的过程了。

在实现过程中实现了取款,查询余额,转帐,更改密码,退卡,锁卡等功能函数,通过主函数调用这些函数来完成相应的功能。

在每个功能函数中都有错误提醒和相应的操作,退出程序或重新输入。

该部分也有涉及到算法。

由于要实现的功能比较多,所以函数的代码也比较长。

编写的过程中难免会出现错误,在同学和老师的帮助下解决了出现的问题。

最后是界面的设计以及测试的过程。

考虑到对用户的友好性,在每次输入前都有提醒语句,同时在用户选择操作前也有菜单输出以提示用户。

用户三次输入错误ATM取款机即锁卡。

总的来说,界面还算美观,易于操作。

测试主要是测试功能函数是否能达到预定的要求,还有就是错误测试。

当用户的输入出错或者进行错误的操作时,该程序能提醒拥护所出现的错误,并对不同的错误采取不同的解决方案。

测试是程序设计中必不可少的步骤,因为这是验证程序是否能达到某些功能的最好方法。

测试也有助与我们发现程序中的缺点,从而帮助我们完善程序,编写出更健壮,功能更强大的程序。

在这次课程设计中,更深入地理解了链表,类以及文件,并掌握了如何综合利用它们去编写程序。

同时,程序设计能力和设计风格也有很大程度的提高。

 

8

参考文献

王挺,周会平,贾丽丽,徐锡山。

C++程序设计(第二版)。

清华大学,2004

BruceEckel。

C++编程思想(第二版,影印版)。

机械工程,2002

BjarneStroustrup。

C++程序设计语言(特别版,影印版)。

高等教育,2001

谭浩强。

C程序设计(第二版)。

清华大学,2000

齐治昌,谭庆平,宁洪。

软件工程(第二版)。

高等教育,2004

 

9

附录A源代码

#include

#include

#include

classCard{

public:

Card(chara[10],intb,doublec)

{

strcpy(num,a);

code=b;

money=c;

}

charnum[10];

intcode;

doublemoney;

};

structnode

{

Card*cod;

node*next;

};

node*createlist(intn);//创建链表

node*findnum(charm[10],node*head);//核对卡号

intfindcode(intq,node*head);//核对密码

voidfetchmoney(node*head);//取款

voidsearch(node*head);//查询余额

voidzhuan(node*head,node*curnode);//转帐

voidchange_code(node*head);//更改密码

voidexit();//退卡

voidlock();//锁卡

voidsave(node*head);//保存信息

intmain()

{

node*temp,*listhead=NULL;

inttimes=0;

listhead=createlist

(2);

cout<<"★☆★☆★☆★☆★☆欢迎使用本银行ATM取款机☆★☆★☆★☆★☆★"<

cout<<"请输入您的卡号:

";

charp[10];

cin>>p;

temp=findnum(p,listhead);

if(temp)

{

while(times<3)

{

cout<<"请输入您的密码:

";

intq;

cin>>q;

if(findcode(q,temp)==0)

{

cout<<"您输入的密码有误,请重新输入!

"<

times++;

}

else

{

for(inti=0;;i++)

{

cout<<""<

cout<<""<

cout<<"本机可办理以下业务:

"<

cout<<"********************"<

cout<<"1>取款"<<""<<"2>查询余额"<

cout<<"3>转帐"<<""<<"4>更改密码"<

cout<<"5>退出"<

cout<<"********************"<

cout<<"请选择您需要的操作:

";

intr;

cin>>r;

cout<<""<

cout<<""<

if(r==1)

{

cout<<"【取款】"<

fetchmoney(temp);

save(listhead);

}

elseif(r==2)

{

cout<<"【查询余额】"<

search(temp);

save(listhead);

}

elseif(r==3)

{

cout<<"【转帐】"<

zhuan(temp,listhead);

save(listhead);

}

elseif(r==4)

{

cout<<"【更改密码】"<

change_code(temp);

save(listhead);

}

elseif(r==5)

{

exit();

gotoend;

}

else

cout<<"输入错误,请重新输入"<

}

}

}

if(times==3)

lock();

}

else

cout<<"对不起,您输入的卡号不存在,请查正后再输!

"<

return0;

end:

return1;

}

node*createlist(intn)

{

node*temp,*tail=NULL,*head=NULL;

head=newnode;

charx[10];

inty;

doublez;

ifstreaminfile("outfile.txt",ios:

:

in);

infile>>x>>y>>z;

if(head==NULL)

{

cout<<"Nomemoryavailable!

";

returnNULL;

}

else

{

head->cod=newCard(x,y,z);

head->next=NULL;

tail=head;

}

for(inti=0;i

{

temp=newnode;

charx[10];

inty;

doublez;

if(temp==NULL)

{

cout<<"Nomemoryavailable!

";

returnhead;

}

else

{

while(!

infile.eof())

infile>>x>>y>>z;

infile.close();

temp->next=NULL;

temp->cod=newCard(x,y,z);

tail->next=temp;

tail=temp;

}

}

returnhead;

}

node*findnum(charm[10],node*head)

{

while(head)

{

if((strcmp(head->cod->num,m))==0)

{

returnhead;

}

head=head->next;

}

returnNULL;

}

intfindcode(intq,node*head)

{

if(head->cod->code==q)

return1;

return0;

}

voidfetchmoney(node*head)

{

cout<<"请输入取款金额:

";

doubles;

cin>>s;

if(s<0)

cout<<"请输入正确的数字!

"<

if((head->cod->money)>s)

{

head->cod->money=(head->cod->money)-s;

cout<<"交易成功,请收好钱!

"<

}

else

{

cout<<"对不起,您的余额不足!

"<

}

}

voidsearch(node*head)

{

cout<<"您的余额为:

"<cod->money<<"!

"<

}

voidzhuan(node*head,node*curnode)

{

cout<<"请输入对方卡号:

";

chart[10];

cin>>t;

node*hold=findnum(t,curnode);

if(hold)

{

cout<<"请输入转帐金额:

";

doubled;

cin>>d;

if((head->cod->money)>d)

{

cout<<"交易成功!

"<

head->cod->money=(head->cod->money)-d;

hold->cod->money=(hold->cod->money)+d;

}

else

cout<<"对不起,您的余额不足!

"<

}

else

cout<<"对不起,您输入的卡号不存在,请查正后再输!

";

}

voidchange_code(node*head)

{

cout<<"请输入您的原密码:

";

inte,f,g;

cin>>e;

if((head->cod->code)==e)

{

cout<<"请输入您的新密码:

";

cin>>f;

cout<<"请再次输入您的新密码:

";

cin>>g;

if(f==g)

{

(head->cod->code)=g;

cout<<"密码修改成功,请牢记!

"<

}

else

cout<<"您两次输入的密码不一致,操作失败!

"<

}

else

cout<<"原密码输入错误,操作失败!

"<

}

voidexit()

{

cout<<"谢谢使用,欢迎下次光临!

"<

cout<<"请取回卡!

"<

return;

}

voidlock()

{

cout<<"对不起,由于您三次密码输入错误,卡已被锁!

"<

}

voidsave(node*head)

{ofstreamoutfile("outfile.txt",ios:

:

out);

while(head)

{

outfile<cod->num<<""<cod->code<<""<cod->money<

head=head->next;

}

outfile.close();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1