ATM取款机模拟程序 课程任务书

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

课程设计任务书
课程名称:C++程序设计课程设计
设计题目:ATM取款机模拟程序
已知技术参数和设计要求:
1. 问题描述:
课题的任务是设计一个ATM取款机的模拟程序。

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

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

设计中应尽可能把它模拟得与真实的ATM接近一些,我们抽象出下列问题:
(1) 用户插卡,A TM验证用户帐号信息。

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

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

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

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

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

(7) 用户退卡。

A TM清理现场。

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

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

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

2. 功能要求:
(1)插卡功能(用卡号模拟);
(2)取款功能;
(3)查询余额功能;
(4)验证帐号功能;
(5)更改密码功能;
(6)退卡功能;
(7)锁卡功能。

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

4. 技术要求:
要求所有用户的信息以密文形式保存在数据文件中,加密算法为:字节各位取反,然后高半字节和低半字节交换位置。

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

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

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

5. 课程设计时间:15周、16周
6. 课程设计的考核方式及评分方法
1)考核方式
⏹课程设计结束时,在机房当场验收。

⏹教师提供测试数据,检查运行结果是否正确。

⏹回答教师提出的问题。

⏹学生提交课程设计文档(A4纸打印)
2)评分方法
上机检查 :书面报告:答辩=6 :3 :1,没有通过上机检查的其成绩直接记录不及格
指导教师签名:日期:
教研室主任签名:日期:
系主任签名:日期:
摘要
本实验设计说明书编写的是一个ATM取款机模拟程序。

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

因此在该设计书中我们模拟的就是ATM取款机的属性和行为,主要包括插卡,取款,查询余额,更改密码,退卡,锁卡功能。

本书主要内容分为三个部分,第一部分主要是阐述该程序的设计内容和要求,设计的题目以及设计出的程序应有哪些实用功能。

第二部分是对该问题的整体描述,对问题进行深入的分析,设计,到最后编写出程序并进行测试。

第三部分为该书的总结,主要是写在编写程序的时候所遇到的问题,解决方法以及心得。

最后,程序设计是一个创作的过程,解决问题的方法不是唯一的。

所以独立思考问题,多想想解决方法,才更有助于程序设计水平的提高。

关键词:链表;面向对象方法;A TM取款模拟;文件和流;类和对象
目录
1设计内容与要求 (1)
2设计说明 (2)
2.1 问题描述与功能设计 (2)
2.2流程图 (2)
2.3 类定义和链表 (4)
2.4 界面设计 (5)
2.5 测试 (7)
3总结 (8)
参考文献 (9)
附录A 源代码 (10)
1.设计内容和要求
设计内容
课题的任务是设计一个ATM取款机的模拟程序。

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

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

设计中应尽可能把它模拟得与真实的ATM接近一些,我们抽象出下列问题:
(1) 用户插卡,ATM验证用户帐号信息。

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

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

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

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

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

(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) 用户查询余额,A TM显示余额。

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

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

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

(7) 用户退卡。

ATM清理现场。

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

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

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

功能设计
该程序应具有以下功能:
(1)插卡功能(用卡号模拟);
(2)取款功能;
(3)查询余额功能;
(4)验证帐号功能;
(5)更改密码功能;
(6)退卡功能;
(7)锁卡功能。

2.2流程图
2
33
2.3类定义和链表
class Card{
public:
Card(char a[10],int b,double c)
{
strcpy(num,a);
code=b;
money=c;
}
char num[10];
int code;
double money;
};
struct node
{
Card *cod;
node *next;
};
在该程序中定义了类Card,,同时声明了3个数据成员。

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

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

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

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

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

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

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

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

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

首先是欢迎界面,看起来非常美观,还有欢迎语句:欢迎使用本银行A TM机。

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

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

最后用户退出时,输出语句:谢谢使用,欢迎下次光临。

同时提醒用户取卡。

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

欢迎界面:
出错提醒界面:
5
用户退出时输出界面:
6
2.6测试
测试该程序的主函数十分简单,只有一些提示信息的输出和功能函数的调用。

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

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

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

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

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

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

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

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

若用户选择退出则输出:谢谢使用,欢迎下次光临。

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

以下是测试函数的一部分代码:
cout<<"请选择您需要的操作:";
int r;
cin>>r;
if(r==1)
{
cout<<"【取款】"<<endl;
fetchmoney(temp);
save(listhead);
}
if(r==2)
{
cout<<"【查询余额】"<<endl;
search(temp);
save(listhead);
if(r==3)
{ cout<<"【转帐】"<<endl;
zhuan(temp,listhead);
save(listhead);
}
if(r==4)
{ cout<<"【更改密码】"<<endl;
change_code(temp);
save(listhead);
}
测试后得到的结果正确,说明功能函数实现了预定的功能。

7
3.总结
该课程设计的题目是设计一个ATM模拟程序。

在设计任务中,为尽可能把它模拟得跟真实的ATM接近一些,要求要具有以下功能:取款,查询余额,转帐,更改密码,退卡,锁卡等。

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

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

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

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

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

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

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

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

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

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

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

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

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

该部分也有涉及到算法。

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

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

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

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

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

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

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

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

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

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

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

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

8
参考文献
王挺,周会平,贾丽丽,徐锡山。

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

北京:清华大学出版社,2004 Bruce Eckel。

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

北京:机械工程出版社,2002
Bjarne Stroustrup。

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

北京:高等教育出版社,2001 谭浩强。

C程序设计(第二版)。

北京:清华大学出版社,2000
齐治昌,谭庆平,宁洪。

软件工程(第二版)。

北京:高等教育出版社,2004
9
附录A源代码
#include<iostream.h>
#include<string.h>
#include<fstream.h>
class Card{
public:
Card(char a[10],int b,double c)
{
strcpy(num,a);
code=b;
money=c;
}
char num[10];
int code;
double money;
};
struct node
{
Card *cod;
node *next;
};
node *createlist(int n);//创建链表
node *findnum(char m[10],node *head);//核对卡号
int findcode(int q,node *head);//核对密码
void fetchmoney(node *head);//取款
void search(node *head);//查询余额
void zhuan(node *head,node *curnode);//转帐
void change_code(node *head);//更改密码
void exit();//退卡
void lock();//锁卡
void save(node *head);//保存信息
int main()
{
node *temp, *listhead=NULL;
int times=0;
listhead=createlist(2);
cout<<"★☆★☆★☆★☆★☆欢迎使用本银行A TM取款机☆★☆★☆★☆★☆★"<<endl;
cout<<"请输入您的卡号:";
char p[10];
cin>>p;
temp=findnum(p,listhead);
if(temp)
{
while(times<3)
{
cout<<"请输入您的密码:";
int q;
cin>>q;
if(findcode(q,temp)==0)
{
cout<<"您输入的密码有误,请重新输入!"<<endl;
times++;
}
else
{
for(int i=0; ;i++)
{
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"本机可办理以下业务:"<<endl;
cout<<"********************"<<endl;
cout<<"1>取款"<<" "<<"2>查询余额"<<endl;
cout<<"3>转帐"<<" "<<"4>更改密码"<<endl;
cout<<"5>退出"<<endl;
cout<<"********************"<<endl;
cout<<"请选择您需要的操作:";
int r;
cin>>r;
cout<<" "<<endl;
cout<<" "<<endl;
if(r==1)
{
cout<<"【取款】"<<endl;
fetchmoney(temp);
save(listhead);
}
else if(r==2)
{
cout<<"【查询余额】"<<endl;
search(temp);
save(listhead);
}
else if(r==3)
{
cout<<"【转帐】"<<endl;
zhuan(temp,listhead);
save(listhead);
}
else if(r==4)
{
cout<<"【更改密码】"<<endl;
change_code(temp);
save(listhead);
}
else if(r==5)
{
exit();
goto end;
}
else
cout<<"输入错误,请重新输入"<<endl;
}
}
}
if(times==3)
lock();
}
else
cout<<"对不起,您输入的卡号不存在,请查正后再输!"<<endl;
return 0;
end:
return 1;
}
node *createlist(int n)
{
node *temp, *tail=NULL, *head=NULL;
head=new node;
char x[10];
int y;
double z;
ifstream infile("outfile.txt",ios::in);
infile>>x>>y>>z;
if(head==NULL)
{
cout<<"No memory available!";
return NULL;
}
else
{
head->cod=new Card(x,y,z);
head->next=NULL;
tail=head;
}
for(int i=0;i<n-1;i++)
{
temp=new node;
char x[10];
int y;
double z;
if(temp==NULL)
{
cout<<"No memory available!";
return head;
}
else
{
while(!infile.eof())
infile>>x>>y>>z;
infile.close();
temp->next=NULL;
temp->cod=new Card(x,y,z);
tail->next=temp;
tail=temp;
}
}
return head;
}
node *findnum(char m[10],node *head)
{
while(head)
{
if((strcmp(head->cod->num,m))==0)
{
return head;
}
head=head->next;
}
return NULL;
}
int findcode(int q,node *head)
{
if(head->cod->code==q)
return 1;
return 0;
}
void fetchmoney(node *head)
{
cout<<"请输入取款金额:";
double s;
cin>>s;
if(s<0)
cout<<"请输入正确的数字!"<<endl;
if((head->cod->money)>s)
{
head->cod->money=(head->cod->money)-s;
cout<<"交易成功,请收好钱!"<<endl;
}
else
{
cout<<"对不起,您的余额不足!"<<endl;
}
}
void search(node *head)
{
cout<<"您的帐户余额为:"<<head->cod->money<<"!"<<endl; }
void zhuan(node *head,node *curnode)
{
cout<<"请输入对方卡号:";
char t[10];
cin>>t;
node *hold=findnum(t,curnode);
if(hold)
{
cout<<"请输入转帐金额:";
double d;
cin>>d;
if((head->cod->money)>d)
{
cout<<"交易成功!"<<endl;
head->cod->money=(head->cod->money)-d;
hold->cod->money=(hold->cod->money)+d;
}
else
cout<<"对不起,您的余额不足!"<<endl;
}
else
cout<<"对不起,您输入的卡号不存在,请查正后再输!";
}
void change_code(node *head)
{
cout<<"请输入您的原密码:";
int e,f,g;
cin>>e;
if((head->cod->code)==e)
{
cout<<"请输入您的新密码:";
cin>>f;
cout<<"请再次输入您的新密码:";
cin>>g;
if(f==g)
{
(head->cod->code)=g;
cout<<"密码修改成功,请牢记!"<<endl;
}
else
cout<<"您两次输入的密码不一致,操作失败!"<<endl;
}
else
cout<<"原密码输入错误,操作失败!"<<endl;
}
void exit()
{
cout<<"谢谢使用,欢迎下次光临!"<<endl;
cout<<"请取回卡!"<<endl;
return ;
}
void lock()
{
cout<<"对不起,由于您三次密码输入错误,卡已被锁!"<<endl;
}
void save(node *head)
{ ofstream outfile("outfile.txt",ios::out);
while(head)
{
outfile<<head->cod->num<<" "<<head->cod->code<<" "<<head->cod->money<<endl;
head=head->next;
}
outfile.close();
}。

相关文档
最新文档