ATM取款机模拟程序的设计说明书Word文档下载推荐.docx
《ATM取款机模拟程序的设计说明书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ATM取款机模拟程序的设计说明书Word文档下载推荐.docx(17页珍藏版)》请在冰点文库上搜索。
![ATM取款机模拟程序的设计说明书Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/5619859c-7c1f-4daa-bad7-98b39b14b2fc/5619859c-7c1f-4daa-bad7-98b39b14b2fc1.gif)
3>
技术要求:
要求所有用户的信息以密文形式保存在数据文件中,加密算法为:
字节各位取反,然后高半字节和低半字节交换位置。
用户输入密码时不能以明文形式显示在屏幕上,应以“*”
.专业.专注.
号代替来显示用户密码的输入。
要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
在设计的过程中,建立清晰的类层次;
在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;
要求运用面向对象的机制来实现系统功能。
要求主函数(或图形界面下的主调函数)很“干净”,只有一些类对象的定义和某个类对象的一个成员函数的调用。
1
2.设计说明
2.1问题描述与功能设计
问题描述
功能设计
该程序应具有以下功能:
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机。
在用户每次输入前,都有输出语句提醒用户,
同时在用户进行完每步操作后都循环输出提示信息,用户可自行选择继续或退出。
当用户操作有误或交易失败时,界面上会输出出错信息告知用户,三次密码输入错误即锁卡。
最后用户退出时,输出语句:
谢谢使用,欢迎下次光临。
同时提醒用户取卡。
界面的设计体现了程序设计的友好性,同时易于操作。
欢迎界面:
2.6测试
测试该程序的主函数十分简单,只有一些提示信息的输出和功能函数的调用。
主函数首
.专业.专注.先调用创建链表的函数进行创建,同时每创建一个节点就从文件中读出一条信息初始化数据成员。
创建完后输出欢迎信息,然后进入程序让用户输入卡号,调用验证卡号的函数,如果正确则进行后面的操作,输入错误则退出程序。
接下来是输出提示信息让用户输入卡号的密码,再调用验证密码的功能函数,正确则可进行取款等操作,错误再提示用户重新输入,三次输入错误就锁卡。
若用户卡号和密码都输入正确,则输出菜单让用户选择操作。
菜单中有五个选项,取款,查询余额,转账,更改密码,退卡。
定义一个变量接收用户从键盘输入的数据,后面有五个if语句,根据用户输入的数据来判断执行哪个if语句中的函数,这些函数的功能和菜单中提供的操作是相对应。
用户输入1表示取款,2表示查询余额,3表示转账,4表示更改密码,5表示退出,调用完功能函数后再调用一个函数将修改后的信息存进文件中,用户下次进入时将会显示修改后的信息。
同时在退出每一个if程序块后又再一次输出菜单选项供用户选择,菜单的循环输出可以方便用户连续进行不同的操作。
若用户选择退出则输出:
同时还有输出语句提醒用户取卡。
以下是测试函数的一部分代码:
cout<
"
请选择您需要的操作:
;
intr;
cin>
>
r;
if(r==1){
cout<
【取款】"
endl;
fetchmoney(temp);
save(listhead);
}if(r==2){
【查询余额】"
endl;
search(temp);
save(listhead);
if(r==3)
{cout<
【转帐】"
zhuan(temp,listhead);
if(r==4)
【更改密码】"
change_code(temp);
}测试后得到的结果正确,说明功能函数实现了预定的功能。
7
3.总结
该课程设计的题目是设计一个ATM模拟程序。
在设计任务中,为尽可能把它模拟得跟真
.专业.专注.实的ATM接近一些,要求要具有以下功能:
取款,查询余额,转帐,更改密码,退卡,锁卡等。
同时要求界面要美观,友好,易操作。
在技术上要把所有用户的信息以密文形式保存在数据文件中,且用户输入密码时不能以明文形式显示在屏幕上。
由于这次课程设计有两个星期的时间,所以时间还算充足。
但在编写过程中也遇到了不少的困难。
首先,由于要保存用户的帐号,密码,余额等个人信息,所以考虑用类来实现,将这三种信息设计为类的数据成员。
文件中保存的也不止一个人的信息,而这些用户的信息又都访问,所以在类的基础上再构建链表。
通过返回链表的头结点,外部函数只要遍历链表则可访问文件中所有用户的信息。
为安全起见,用户的信息是加密后再存入数据文件中的,在这个地方就要用到加密的函数。
所以总的来说,这个程序是将类,链表,文件这三大块的知识结合在一起,只要将这些条理理清楚,这个任务可以说已经完成一半了。
这是分析设计这个程序的过程。
接下来,就是写程序,实现函数功能的过程了。
在实现过程中实现了取款,查询余额,转帐,更改密码,退卡,锁卡等功能函数,通过主函数调用这些函数来完成相应的功能。
在每个功能函数中都有错误提醒和相应的操作,退出程序或重新输入。
该部分也有涉及到算法。
由于要实现的功能比较多,所以函数的代码也比较长。
编写的过程中难免会出现错误,在同学和老师的帮助下解决了出现的问题。
最后是界面的设计以及测试的过程。
考虑到对用户的友好性,在每次输入前都有提醒语句,同时在用户选择操作前也有菜单输出以提示用户。
用户三次输入错误ATM取款机即锁卡。
总的来说,界面还算美观,易于操作。
测试主要是测试功能函数是否能达到预定的要求,还有就是错误测试。
当用户的输入出错或者进行错误的操作时,该程序能提醒拥护所出现的错误,并对不同的错误采取不同的解决方案。
测试是程序设计中必不可少的步骤,因为这是验证程序是否能达到某些功能的最好方法。
测试也有助与我们发现程序中的缺点,从而帮助我们完善程序,编写出更健壮,功能更强大的程序。
在这次课程设计中,更深入地理解了链表,类以及文件,并掌握了如何综合利用它们去编写程序。
同时,程序设计能力和设计风格也有很大程度的提高。
8
参考文献
2004
2001
王挺,周会平,贾丽丽,徐锡山。
C++程序设计(第二版)。
北京:
清华大学出版社,BruceEckel。
C++编程思想(第二版,影印版)。
机械工程出版社,2002BjarneStroustrup。
C++程序设计语言(特别版,影印版)。
高等教育出版社,谭浩强。
C程序设计(第二版)。
清华大学出版社,2000齐治昌,谭庆平,宁洪。
软件工程(第二版)。
高等教育出版社,2004
9
附录A源代码
#include<
iostream.h>
string.h>
fstream.h>
money=c;
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);
★☆★☆★☆★☆★☆欢迎使用本银行ATM取款机☆★☆★☆★☆★☆★
请输入您的卡号:
charp[10];
p;
temp=findnum(p,listhead);
if(temp)
while(times<
3)
请输入您的密码:
intq;
cin>
q;
if(findcode(q,temp)==0)
您输入的密码有误,请重新输入!
times++;
}else
for(inti=0;
;
i++)
"
本机可办理以下业务:
取款"
查询余额"
5>
转帐"
4>
更改密码"
退出"
请选择您需要的操作
intr;
if(r==1)
取款】"
elseif(r==2)
elseif(r==3)
zhuan(temp,listhead);
elseif(r==4)
elseif(r==5)
exit();
gotoend;
else
输入错误,请重新输入"
if(times==3)
lock();
对不起,您输入的卡号不存在,请查正后再输!
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)
Nomemoryavailable!
returnNULL;
head->
cod=newCard(x,y,z);
next=NULL;
tail=head;
i<
n-1;
temp=newnode;
if(temp==NULL)
returnhead;
while(!
infile.eof())infile>
infile.close();
temp->
temp->
tail->
next=temp;
tail=temp;
node*findnum(charm[10],node*head)
while(head)
if((strcmp(head->
num,m))==0)
head=head->
next;
intfindcode(intq,node*head)
if(head->
code==q)
return0;
voidfetchmoney(node*head)
请输入取款金额:
doubles;
s;
if(s<
0)
请输入正确的数字!
if((head->
money)>
s)
money=(head->
money)-s;
交易成功,请收好钱!
对不起,您的余额不足!
voidsearch(node*head)
您的帐户余额为:
money<
!
voidzhuan(node*head,node*curnode)
请输入对方卡号:
chart[10];
t;
node*hold=findnum(t,curnode);
if(hold)
请输入转帐金额:
doubled;
d;
if((head->
d)
交易成功!
head->
money)-d;
hold->
money=(hold->
money)+d;
voidchange_code(node*head)
请输入您的原密码:
inte,f,g;
e;
code)==e)
请输入您的新密码:
f;
请再次输入您的新密码:
g;
if(f==g)
(head->
code)=g;
密码修改成功,请牢记!
您两次输入的密码不一致,操作失败!
原密码输入错误,操作失败!
voidexit()
谢谢使用,欢迎下次光临!
请取回卡!
return;
voidlock()
对不起,由于您三次密码输入错误,卡已被锁!
}voidsave(node*head)
{ofstreamoutfile("
out);
code<
outfile<
num<
outfile.close();