ATM存取款系统的改进与完善程序设计.docx
《ATM存取款系统的改进与完善程序设计.docx》由会员分享,可在线阅读,更多相关《ATM存取款系统的改进与完善程序设计.docx(46页珍藏版)》请在冰豆网上搜索。
ATM存取款系统的改进与完善程序设计
长 沙 学 院
程序设计基础实验/实训报告
实训题目:
ATM存取款系统的改进与完善
系 部:
计算机科学与技术系
专业/年级:
计算机科学技术专业2011级
项目实训任务书
课程名称:
程序设计基础实验
课程编码:
JX020102
课程类别:
专业基础必修课
学分数:
1.5
学时数:
24
开课学期:
3
实训题目:
ATM存取款系统的改进与完善
一、已知技术参数和设计要求:
银行ATM存取款系统业务描述如下:
银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。
为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、转账、修改密码以及开户的功能。
用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。
本系统各个业务有如下注意点:
(1)登陆系统
用户登陆之前,必须在登陆界面输入其银行账户,通过其正确输入的银行账户登陆系统。
(2)开户业务
要使用本系统必须首先执行开户业务开立新的银行账户,并且将此新开的银行存储于文件当中。
同时,系统以身份证号码作为开户的充分条件,即一个身份证号码只能开立一次银行账户。
(3)存款业务
客户登陆系统后,选择存款业务,即可以将输入的存款金额存入相应的账户。
(4)取款业务
客户登陆系统后,选择取款业务,即可以将输入的取款金额从相应的银行账户取出,但是取款金额必须大于目前的账户余额。
(5)查询业务
客户登陆系统后,可以选择查询业务,查询账户余额。
(6)转账业务
客户登陆系统后,可以选择转账业务,进行转账。
注意的是转账的目的账户必须是本系统已经存在的银行账户。
(7)修改密码
客户登陆系统后,可以选择修改密码业务,进行密码修改。
二、各阶段具体要求:
1、系统总体设计阶段
(1)根据需求分析划分功能模块
(2)分析并设计各个功能模块之间的关系
(3)对于各个功能模块,设计相应的数据结构(必须使用链表完成全部功能)
(4)设计相应的算法(必须包括排序和检索功能,且基于链表进行排序和检索)
2、详细设计阶段
(1)对于每个功能模块,应划分成操作层和数据层
(2)对于每个操作层,应尽量考虑用户操作的简单,便捷
(3)对于每个数据层,必须使用链表进行管理
(4)在用链表进行管理时,必须用到链表检索和排序
(5)对于数据层的操作完的数据必须保存到文件中(包括文件读、写操作)
3、编码实现阶段
(1)完成代码编写
(2)要求代码编写规范(不得使用全局变量、所有功能模块必须使用函数封装主函数main()的行数不得超过代码总长度的25%)
(3)代码必须有相应的注释(注释行数不得少于代码的10%,函数功能、变量名、算法、重要的循环、分支都必须用注释说明)
4、系统测试阶段
(1)完成功能调试
(2)要求完成必要的测试工作
5、交付实施阶段
(1)提交可正常执行的系统,程序代码
(2)撰写项目实训报告书
(3)要求按照文档书写规范,严格地书写文档
(4)注意:
不允许使用代码、图片和表格填充报告空间。
代码、图片和表格在报告中的空间比重不得超过1/3。
要求使用文字清晰描述代码思想和逻辑,文字描述不得少于3000字(不包含注释文字)。
三、设计工作量:
(1)软件设计:
严格按照具体设计要求,完成问题陈述中所提到的所有需求功能。
(未使用链表实现的、代码少于300行的不及格,未使用链表排序的成绩不可以为优)
(2)设计报告:
要求撰写不少于3000个文字的文档,详细说明各阶段具体要求。
四、工作计划:
安排12周时间进行实训(每周2课时),软件开发步骤如下,在课程结束时必须完成所有任务,报告撰写同步进行;
序号
实践项目名称
内容提要
实践
时数
主要考察内容
考察方式与分数比重
1
实验1:
程序架构的描述
1、数据与逻辑分离
2、程序架构的描述
4
1、数据与逻辑分离
2、程序架构的描述
考察方式:
考查知识点在最终项目中的应用情况
分数比重:
约20%
2
实验2:
链表在工程中的应用
1、使用链表来构造ATM机的后台数据管理
2、实现常见的链表操作——插入、删除、修改、遍历以及创建链表
6
1、使用链表来构造ATM机的后台数据管理
2、实现常见的链表操作——插入、删除、修改、遍历以及创建链表
考察方式:
考查知识点在最终项目中的应用情况
分数比重:
约20%
3
实验3:
查找在项目中的应用
1、在使用链表的基础上引导学生完成1~2种主要查找——如条件查找和顺序查找
2、将这些算法结合到学生的工程应用题中
2
1、在使用链表的基础上引导学生完成1~2种主要查找——如条件查找和顺序查找
2、将这些算法结合到学生的工程应用题中
考察方式:
考查知识点在最终项目中的应用情况
分数比重:
约15%
4
实验4:
排序在项目中的应用
1、在使用链表的基础上引导学生完成2~3种主要排序——冒泡、选择和插入
2、将这些算法结合到学生的工程应用题中
6
1、在使用链表的基础上引导学生完成2~3种主要排序——冒泡、选择和插入
2、将这些算法结合到学生的工程应用题中
考察方式:
考查知识点在最终项目中的应用情况
分数比重:
约20%
5
实验5:
结构在文件中的应用
1、讨论不同结构的设计技巧,考虑在同一项目中使用自定义结构的必要性
2、考虑将复杂结构——双向链表、循环链表作为解决问题的一种途径与手段
2
1、讨论不同结构的设计技巧,考虑在同一项目中使用自定义结构的必要性
2、考虑将复杂结构——双向链表、循环链表作为解决问题的一种途径与手段
考察方式:
考查知识点在最终项目中的应用情况
分数比重:
约10%
6
实验6:
文件操作技巧
1、加强学生对文件操作的认识
2、考虑将复杂结构中的相关数据通过写入文件的方法作为长期记录保存的工具
3、并将此作为改进项目的手段
4
1、加强学生对文件操作的认识
2、考虑将复杂结构中的相关数据通过写入文件的方法作为长期记录保存的工具
3、并将此作为改进项目的手段
考察方式:
考查知识点在最终项目中的应用情况
分数比重:
约15%
五、注意事项
1)提交文档
课程实训任务书(每学生1份)
课程实验/实训报告(每学生1份)
2)成绩评定
学生成绩由指导老师负责考察评定,分为:
优、良、中、及格和不及格五档。
●以下情况可以判断成绩为不及格:
a、抄袭
b、代码量少于300行
c、未使用链表
d、报告不符合规范
●以下情况不可以判断成绩为优:
a、未使用链表排序
b、使用全局变量
c、大量代码集中在主函数main()中,而不是使用函数进行合理封装
d、功能不完善,有残缺
e、代码缺乏必要的注释
f、缺课
●其他情况由指导老师综合考虑给予成绩评定
●主要考察知识点与要求:
a、链表组织数据
b、排序(基于链表)
c、链表检索
d、文件保存和读取数据
e、函数封装及调用
f、代码缩进和注释等软件工程原则基本要求
g、文档
摘要
ATM机管理系统是银行业务流程过程中十分重要且必备的环节之一,在银行业务流程当中起着承上启下的作用,其重要性不言而喻。
但是,目前许多银行在具体的一些业务流程处理过程中仍然使用手工操作的方式来实施,不仅费时、费力,效率低下,而且无法达到理想的效果。
本文针对上述问题,采用软件工程的开发原理,依据软件流程过程规范,开发了一个银行ATM机管理系统。
银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。
为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、转账、修改密码以及开户的功能。
用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。
此程序设计目的在于便于学生更好的掌握C语言这门课程。
关键词:
ATM;系统;C语言
2.2.2登陆模块……………………………………………………………...……...4
2.2.3取款模块……………………………………………………..………………………..5
2.2.4存款模块………………………...……………………………………………….……6
2.2.5修改密码模块……………………………………………….……………..…………7
2.2.6转账模块………………………………………………………………..……..………8
2.2.7查询模块…………………………………………………………………..…..………9
第3章详细设计…………………………………………………………………………………11
3.1函数名………………………………………………………………………………………...11
3.2数据类型和结构……………………….…………………………………………………...11
第4章程序实现………………………………………………………………………….…..…12
4.1代码分析………………………..……………………………………………………………12
第5章测试………………………………………………………………….……..………………14
5.1测试结果…………………………………………………………..……….………………...14
第1章需求分析
1.1设计介绍
根据生活中ATM的业务要求及对客户的需求分析,这个系统需要实现注册,登录,存取款、查询、转账、修改密码等功能。
用户通过注册业务在本系统可以用身份账号注册一个银行账户,并在注册之后可以通过该银行账户登陆ATM系统,在系统中实现存,取款、查询账户信息、修改密码等操作。
1.2需求分析
1.ATM注册系统首先需要对所有注册用户的信息进行完整的保存与读取。
对这些信息的保存要有一定的技巧性,可以为之后用户的注册,以及所有用户的登录提供一个很好的检索条件。
在注册的时候要以身份证注册账号。
在进行密码输入的时候要人性化,要输入两次密码以确定密码,以防止用户输入含糊的密码。
为了实现这个,可以创建一个文件。
建立一条链表,链表中每个节点对各种数据类型进行保存。
2.ATM登录系统需要调取用户所有信息。
这个系统设计必须保证用户的安全性,一旦登录便可以完成登录后可以实现的功能。
只有在输入账户号以及密码的情况下才可以登录成功。
在登录时要检索所有已登录用户的信息,确保是登录时所输入的账号并且密码输入无误。
为了实现这个,可以直接调取文件中的信息进行核对,运用链表检索核对账号和密码的准确性。
3.ATM系统的存取款业务,要在登录的情况下才可以进行这个业务。
存取款时对用户在这个账户有的金额上进行正确的运算并在确定业务完成的情况下在退出时进行保存。
这个业务的实现可以直接运用C语言中的逻辑运算,同时也需要调取文件中的信息,最后在确定改变信息后用改后的信息覆盖之前的信息,退出后存到文件中。
4.ATM系统的查询业务,要在登录的情况下才可以进行这个业务。
查询信息时,直接根据账号调取文件中该账号的信息提示该用户的姓名,账号,以及账户中的余额。
可以运用链表检索从第一个节点检索到所需的账号所在的节点。
5.ATM系统的密码修改业务,要在登录的情况下才可以进行这个业务。
在输入原密码的情况下,再输入修改后的密码,再一次确认新密码后可以完成该业务。
这里需要对用户数据进行修改,并存入文件。
这里直接调取信息,修改链表中的数据然后再保存到文件即可。
6.ATM系统的转账业务,要在登录的情况下才可以进行这个业务。
要准确输入对方的账号并输入转账的金额,并确定后才能转账成功。
这里需要对两个用户数据进行修改并保存。
完成这个业务,可以输入对方账户进行查找与匹配,然后修改两个节点的值最后都进行一次保存即可。
第2章概要设计
2.1系统整体模块
依据需求分析,设计如下一个整体模块结构:
2.2系统模块设计
2.2.1注册模块
简要介绍:
要使用本系统必须先注册一个账号,保存到文件中。
流程图如下:
2.2.2登陆模块
简要介绍:
登录模块允许用户通过输入相关信息,使用strcmp()对账户与密码进行匹配。
如果用户信息匹配且符合要求则允许用户登录,否则则提示用户错误信息,提醒用户是重新输入还是退出。
用链表指针检索并可以确保有该账号并且密码输入无误。
此模块可以实现在准确输入账号密码后成功登陆。
流程图如下:
2.2.3取款模块
简要介绍:
取款模块可以实现用户的取款,同时调取文件中的信息,并可以针对用户取款的金额在原有的余额上进行正确修改。
流程图如下:
2.2.4存款模块
简要介绍:
存款模块可以实现用户的取款,同时调取文件中的信息,并可以针对用户存款的金额在原有的余额上进行正确修改。
流程图如下:
2.2.5修改密码模块
简要介绍:
修改密码模块实现的是用户对密码的修改,在输入原有的密码后就可以输入新的密码,再次确定后便可以修改成功。
流程图如下:
2.2.6转账模块
简要介绍:
转账模块可以实现在准确输入对方的账号并输入转账的金额,确认后转账成功。
能够对两个用户数据进行修改并保存。
完成这个业务,输入对方账户进行查找与匹配,最后保存到数组中。
流程图如下:
2.2.7查询模块
简要介绍:
查询模块可以实现的是在选择查询后,调取数组信息直接显示用户的账号、余额、姓名等资料。
流程图如下:
第3章详细设计
3.1函数名
main主函数
voidzhuce();注册
voidlogin();登陆
voidzhuyemian();主页面
voidchaxun();查询
voidqukuan();取款
voidzhuanzhang();转账
voidxiugai();修改密码
voidcunkuan();存款
3.2数据类型和结构
该程序主要使用了链表和文件,一个客户的全部信息用结构体来实现,用文件来保存,通过指针来进行交易,结构体为structAccount{};
第4章程序实现
4.1代码分析
1.链表检索实现
使用链表对用户数据进行比较,使p=head,让指针从头一直往后搜索,进行字符串的比较可以判断是否在文件中存有该账号以及密码是否配对。
实现代码:
2.文件读写实现
读写用户数据的过程,主要是通过文件对链表进行读写的。
运用fread()函数进行特定文件的读取,用fwrite()函数以ab追加的方式写入,并在每次操作完之后用fwrite()函数以wb全写入的方式的写入该类用户信息并在退出时保存。
实现代码:
第5章测试
5.1测试结果
(1).主页面
图5.1
(1)主页面
(2)注册账号
图5.1
(2)注册账号
(3)登陆账号
图5.1(3)登陆账号
(4)服务菜单
图5.1(4)服务菜单
(5)查询服务
图5.1(5)查询服务
(6)取款服务
图5.1(6)取款服务
(7)转账服务
图5.1(7)转账服务
(8)修改密码服务
图5.1(8)修改密码服务
(9)存款服务
图5.1(9)存款服务
(10)存储文件
图5.1(10)存储文件
结论
我们这学期刚开学的课程设计是对ATM自动取款机的一个设计,这次的设计要求比上学期的实验报告要求要高了很多。
刚开始的时候,老师是让我们先写这一个星期的计划,然后要求我们按计划去做。
比如,首先先构思好ATM机的整体思路,在画好各个板块的流程图,在按照流程图去写代码,这样就显得井然有序,思路很清晰。
在之后的课程设计中,由于是单独作业,所以靠自己完成。
这时才发现经过一个暑假,C语言被我基本忘光了,所以这个课程设计在一定的程度上是在帮我们复习C语言,同时巩固和掌握它。
我在做课程设计的时候用到的是函数和数组。
函数用来简化程序,数组用来即时存储用户信息。
但是用数组有一个弊端就是下次再登陆系统时,上次开户成功的账号已经不存在了,又要重新开户,这就得用到文件和链表了。
文件其实是在我们上学期的时候就有提到过的,只不过对它的使用掌握的并不是很好。
在ATM中插入链表,我们根本就无从下手,链表本身就是一个难点,更何况还需要我们插入ATM中。
所以通过这次课程设计,我看到了我的懒惰和知识匮乏,那么在之后的学习中,我会继续加强已经懂的知识,去了解和深入新的知识,比如下个阶段就是搞懂文件和链表。
我相信这次的课程设计之后,我会更加努力的学好这门课程。
参考文献
[1]谭浩强著.C程序设计(第三版)[M].清华大学出版社,2005.
附录
源代码:
#include
#include
#include
#include
#definelengthsizeof(structAccount)/*length代表结构体structAccount的长度*/
structAccount{/*定义账号的结构体*/
charname[20];/*姓名*/
charIdCard[20];/*身份证号码*/
characcount[20];/*账号号码*/
charpassword[7];/*账号密码*/
doublemoney;/*账号余额*/
structAccount*next;
}Acc,*p,*head;
intMenuOne();
voidzhuce();
intlogin();
voidMenuTwo();
voidchaxun();
voidqukuan();
voidjiaoyi(longqukuan);
voidselect();
voidqukuanselect(longjin_e1);
voidzhuanzhang();
voidxiugai();
voidcunkuan();
voidwenjian();
voidSave();
intmain(){
MenuOne();
system("pause");
return0;
}
intMenuOne(){/*主页面*/
intchoice=-1;
while
(1){/*无限循环*/
printf("\t*********************************************************\n");
printf("\t**\n");
printf("\t*欢迎来到草市银行*\n");
printf("\t**\n");
printf("\t*********************************************************\n");
printf("\n");
printf("选择业务\n");
printf("---------------------------------------------------------\n");
printf("\t1、开通账号\n");
printf("\t2、登录账号\n");
printf("\t3、退出\n");
printf("---------------------------------------------------------\n");
printf("请选择<1-3>:
");
scanf("%d",&choice);
switch(choice){
case1:
system("cls");
zhuce();/*进入注册功能*/
break;
case2:
system("cls");
wenjian();
login();/*进入登陆页面*/
break;
case3:
printf("谢谢使用,再见...\n");/*退出系统*/
system("pause");
exit(0);
break;
default:
printf("输入错误,请重新输入...\n");/*重新输入*/
Sleep(2000);
system("cls");
}
}
}
voidzhuce(){
FILE*fp;
intflag;
charpassword_1[7];
structAccount*p1;
printf("\n\t********************注册账号************************\n");
printf("\n");
flag=0;/*输入是否合格的标志当值为1时表示要重新输入*/
wenjian();/*读取文件*/
p1=head;
p=&Acc;
while
(1){
printf("请输入身份证号码:
");
scanf("%s",Acc.IdCard);
if(strlen(Acc.IdCard)==18)
break;
printf("身份证长度不符,请重新输入...\n");
}
printf("请输入账号:
");
scanf("%s",Acc.account);
while(flag!
=1&&p1!
=NULL){
if((strcmp(Acc.account,p1->account)!
=0))
p1=p1->next;
else
flag=1;
}
if(flag==1){
printf("账号已存在,请重新注册...\n");
Sleep(2000);
system("cls");
zhuce();
}
while
(1){
printf("请输入一个六位数的密码:
");
scanf("%s",Acc.password);
printf("请再次输入密码:
");
scanf("%s",password_1);
if(strlen(Acc.password)==6&&strcmp(password_1,Acc.password)==0)
break;
printf("两次输入的密码不一致或者长度不符,请重新输入...\n");
}
printf("请输入姓名:
");
scanf("%s",Acc.name);
Acc.money=0;/*初始金额为0*/
if((fp=fopen("bank.txt","ab+"))==NULL){/*将新账户的信息存入文件*/
printf("cannotopenfile!
\n");
return;
}
if(p!
=NULL){
if(fwrite(p,length,1,fp)!
=1)
printf("filewriteerror!
\n");
}
fclose