课程设计任务书
课程名称:C++程序设计课程设计
设计题目: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向用户显示欢迎词及其他提示信息。
2. 功能要求:
(1)插卡功能(用卡号模拟);
(2)取款功能;
(3)查询余额功能;
(4)验证帐号功能;
(5)更改密码功能;
(6)退卡功能;
(7)锁卡功能。
3. 界面要求:
用户界面设计不做统一规定,但应做到界面友好,易于操作。
4. 技术要求:
要求所有用户的信息以密文形式保存在数据文件中,加密算法为:字节各位取反,然后高半字节和低半字节交换位置。用户输入密码时不能以明文形式显示在屏幕上,应以“*”号代替来显示用户密码的输入。
要求利用面向对象的方法以及C++的编程思想来完成系统的设计;在设计的过程中,建立清晰的类层次; 在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;要求运用面向对象的机制来实现系统功能。要求主函数(或图形界面下的主调函数)很“干净”,只有一些类对象的定义和某个类对象的一个成员函数的调用。
5. 课程设计时间:15周、16周 6. 课程设计的考核方式及评分方法 1) 考核方式
课程设计结束时,在机房当场验收。
教师提供测试数据,检查运行结果是否正确。
回答教师提出的问题。
学生提交课程设计文档(A4纸打印)
2) 评分方法
上机检查 :书面报告:答辩=6 :3 :1,没有通过上机检查的其成绩直接记录不及格
指导教师签名: 日期:
教研室主任签名: 日期:
系主任签名: 日期:
摘要
本实验设计说明书编写的是一个ATM取款机模拟程序。日常生活中,我们常使用ATM取款机,对它的操作过程和功能有一定的了解。因此在该设计书中我们模拟的就是ATM取款机的属性和行为,主要包括插卡,取款,查询余额,更改密码,退卡,锁卡功能。
本书主要内容分为三个部分,第一部分主要是阐述该程序的设计内容和要求,设计的题目以及设计出的程序应有哪些实用功能。第二部分是对该问题的整体描述,对问题进行深入的分析,设计,到最后编写出程序并进行测试。第三部分为该书的总结,主要是写在编写程序的时候所遇到的问题,解决方法以及心得。
最后,程序设计是一个创作的过程,解决问题的方法不是唯一的。所以独立思考问题,多想想解决方法,才更有助于程序设计水平的提高。
关键词:链表;面向对象方法;ATM取款模拟;文件和流;类和对象
目录
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) 用户查询余额,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流程图
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界面设计
该程序的界面设计总的来说是体现了对用户的友好性。首先是欢迎界面,看起来非常美观,还有欢迎语句:欢迎使用本银行ATM机。在用户每次输入前,都有输出语句提醒用户,同时在用户进行完每步操作后都循环输出提示信息,用户可自行选择继续或退出。
当用户操作有误或交易失败时,界面上会输出出错信息告知用户,三次密码输入错误即锁卡。最后用户退出时,输出语句:谢谢使用,欢迎下次光临。同时提醒用户取卡。界面的设计体现了程序设计的友好性,同时易于操作。
欢迎界面:
出错提醒界面:
5
用户退出时输出界面:
6
2.6测试
测试该程序的主函数十分简单,只有一些提示信息的输出和功能函数的调用。主函数首先调用创建链表的函数进行创建,同时每创建一个节点就从文件中读出一条信息初始化数据成员。创建完后输出欢迎信息,然后进入程序让用户输入卡号,调用验证卡号的函数,如果正确则进行后面的操作,输入错误则退出程序。接下来是输出提示信息让用户输入卡号的密码,再调用验证密码的功能函数,正确则可进行取款等操作,错误再提示用户重新输入,三次输入错误就锁卡。若用户卡号和密码都输入正确,则输出菜单让用户选择操作。菜单中有五个选项,取款,查询余额,转账,更改密码,退卡。定义一个变量接收用户从键盘输入的数据,后面有五个if语句,根据用户输入的数据来判断执行哪个if语句中的函数,这些函数的功能和菜单中提供的操作是相对应。用户输入1表示取款,2表示查询余额,3表示转账,4表示更改密码,5表示退出,调用完功能函数后再调用一个函数将修改后的信息存进文件中,用户下次进入时将会显示修改后的信息。同时在退出每一个if程序块后又再一次输出菜单选项供用户选择,菜单的循环输出可以方便用户连续进行不同的操作。若用户选择退出则输出:谢谢使用,欢迎下次光临。同时还有输出语句提醒用户取卡。
以下是测试函数的一部分代码:
cout<<\"请选择您需要的操作:\";
int r;
cin>>r;
if(r==1)
{
cout<<\"【取款】\"< save(listhead); } if(r==2) { cout<<\"【查询余额】\"< save(listhead); if(r==3) { cout<<\"【转帐】\"< save(listhead); } if(r==4) { cout<<\"【更改密码】\"< save(listhead); } 测试后得到的结果正确,说明功能函数实现了预定的功能。 7 3.总结 该课程设计的题目是设计一个ATM模拟程序。在设计任务中,为尽可能把它模拟得跟真实的ATM接近一些,要求要具有以下功能:取款,查询余额,转帐,更改密码,退卡,锁卡等。同时要求界面要美观,友好,易操作。在技术上要把所有用户的信息以密文形式保存在数据文件中,且用户输入密码时不能以明文形式显示在屏幕上。由于这次课程 设计有两个星期的时间,所以时间还算充足。但在编写过程中也遇到了不少的困难。 首先,由于要保存用户的帐号,密码,余额等个人信息,所以考虑用类来实现,将这三种信息设计为类的数据成员。文件中保存的也不止一个人的信息,而这些用户的信息又都访问,所以在类的基础上再构建链表。通过返回链表的头结点,外部函数只要遍历链表则可访问文件中所有用户的信息。为安全起见,用户的信息是加密后再存入数据文件中的,在这个地方就要用到加密的函数。所以总的来说,这个程序是将类,链表,文件这三大块的知识结合在一起,只要将这些条理理清楚,这个任务可以说已经完成一半了。这是分析设计这个程序的过程。 接下来,就是写程序,实现函数功能的过程了。在实现过程中实现了取款,查询余额,转帐,更改密码,退卡,锁卡等功能函数,通过主函数调用这些函数来完成相应的功能。在每个功能函数中都有错误提醒和相应的操作,退出程序或重新输入。该部分也有涉及到算法。由于要实现的功能比较多,所以函数的代码也比较长。编写的过程中难免会出现错误,在同学和老师的帮助下解决了出现的问题。 最后是界面的设计以及测试的过程。考虑到对用户的友好性,在每次输入前都有提醒语句,同时在用户选择操作前也有菜单输出以提示用户。用户三次输入错误ATM取款机即锁卡。总的来说,界面还算美观,易于操作。测试主要是测试功能函数是否能达到预定的要求,还有就是错误测试。当用户的输入出错或者进行错误的操作时,该程序能提醒拥护所出现的错误,并对不同的错误采取不同的解决方案。测试是程序设计中必不可少的步骤,因为这是验证程序是否能达到某些功能的最好方法。测试也有助与我们发现程序中的缺点,从而帮助我们完善程序,编写出更健壮,功能更强大的程序。 在这次课程设计中,更深入地理解了链表,类以及文件,并掌握了如何综合利用它们 去编写程序。同时,程序设计能力和设计风格也有很大程度的提高。 8 参考文献 王挺,周会平,贾丽丽,徐锡山。C++程序设计(第二版)。北京:清华大学出版社,2004 Bruce Eckel。C++编程思想(第二版,影印版)。北京:机械工程出版社,2002 Bjarne Stroustrup。C++程序设计语言(特别版,影印版)。北京:高等教育出版社,2001 谭浩强。C程序设计(第二版)。北京:清华大学出版社,2000 齐治昌,谭庆平,宁洪。软件工程(第二版)。北京:高等教育出版社,2004 9 附录A源代码 #include #include #include 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<<\"★☆★☆★☆★☆★☆欢迎使用本银行ATM取款机☆★☆★☆★☆★☆★\"< char p[10]; 10 cin>>p; temp=findnum(p,listhead); if(temp) { while(times<3) { cout<<\"请输入您的密码:\"; int q; cin>>q; if(findcode(q,temp)==0) { cout<<\"您输入的密码有误,请重新输入!\"< } else { for(int i=0; ;i++) { cout<<\"本机可办理以下业务:\"< int r; cin>>r; if(r==1) { cout<<\"【取款】\"< save(listhead); } if(r==2) { cout<<\"【查询余额】\"< save(listhead); } if(r==3) { cout<<\"【转帐】\"< 11 save(listhead); } if(r==4) { cout<<\"【更改密码】\"< save(listhead); } if(r==5) { exit(); goto end; } } } } if(times==3) lock(); } else cout<<\"对不起,您输入的卡号不存在,请查正后再输!\"< 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\ 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 temp=new node; 12 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; 13 } void fetchmoney(node *head) { cout<<\"请输入取款金额:\"; double s; cin>>s; if(head->cod->money<0) cout<<\"请输入正确的数字!\"< { head->cod->money=(head->cod->money)-s; cout<<\"交易成功,请收好钱!\"< else { cout<<\"对不起,您的余额不足!\"< } void search(node *head) { cout<<\"您的帐户余额为:\"< 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<<\"交易成功!\"< hold->cod->money=(hold->cod->money)+d; } else cout<<\"对不起,您的余额不足!\"< 14 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<<\"密码修改成功,请牢记!\"< else cout<<\"您两次输入的密码不一致,操作失败!\"< else cout<<\"原密码输入错误,操作失败!\"< void exit() { cout<<\"谢谢使用,欢迎下次光临!\"< void lock() { cout<<\"对不起,由于您三次密码输入错误,卡已被锁!\"< void save(node *head) { ofstream outfile(\"outfile.txt\ while(head) { outfile< } outfile.close(); } 15 \"< 因篇幅问题不能全部显示,请点此查看更多更全内容