1、 项目实训任务书课程名称:程序设计基础实验课程编码:JX020102课程类别:专业基础必修课学分数:1.5学时数:24开课学期:3实训题目:ATM存取款系统的改进与完善一、已知技术参数和设计要求:银行ATM存取款系统业务描述如下:银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、转账、修改密码以及开户的功能。用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。本系统各个业务有如下注意点:(1) 登陆系统用户登陆之前,必须在登陆界面输入
2、其银行账户,通过其正确输入的银行账户登陆系统。(2) 开户业务 要使用本系统必须首先执行开户业务开立新的银行账户,并且将此新开的银行存储于文件当中。同时,系统以身份证号码作为开户的充分条件,即一个身份证号码只能开立一次银行账户。(3) 存款业务 客户登陆系统后,选择存款业务,即可以将输入的存款金额存入相应的账户。(4) 取款业务客户登陆系统后,选择取款业务,即可以将输入的取款金额从相应的银行账户取出,但是取款金额必须大于目前的账户余额。(5) 查询业务 客户登陆系统后,可以选择查询业务,查询账户余额。(6) 转账业务 客户登陆系统后,可以选择转账业务,进行转账。注意的是转账的目的账户必须是本系
3、统已经存在的银行账户。(7) 修改密码客户登陆系统后,可以选择修改密码业务,进行密码修改。二、各阶段具体要求:1、系统总体设计阶段(1)根据需求分析划分功能模块(2)分析并设计各个功能模块之间的关系(3)对于各个功能模块,设计相应的数据结构(必须使用链表完成全部功能)(4)设计相应的算法(必须包括排序和检索功能,且基于链表进行排序和检索)2、详细设计阶段(1)对于每个功能模块,应划分成操作层和数据层(2)对于每个操作层,应尽量考虑用户操作的简单,便捷(3)对于每个数据层,必须使用链表进行管理(4)在用链表进行管理时,必须用到链表检索和排序(5)对于数据层的操作完的数据必须保存到文件中(包括文件
4、读、写操作)3、编码实现阶段(1)完成代码编写 (2)要求代码编写规范(不得使用全局变量、所有功能模块必须使用函数封装主函数main()的行数不得超过代码总长度的25%)(3)代码必须有相应的注释(注释行数不得少于代码的10%,函数功能、变量名、算法、重要的循环、分支都必须用注释说明)4、系统测试阶段(1)完成功能调试(2)要求完成必要的测试工作5、交付实施阶段(1)提交可正常执行的系统,程序代码(2)撰写项目实训报告书(3)要求按照文档书写规范,严格地书写文档(4)注意:不允许使用代码、图片和表格填充报告空间。代码、图片和表格在报告中的空间比重不得超过1/3。要求使用文字清晰描述代码思想和逻
5、辑,文字描述不得少于3000字(不包含注释文字)。三、设计工作量:(1)软件设计:严格按照具体设计要求,完成问题陈述中所提到的所有需求功能。(未使用链表实现的、代码少于300行的不及格,未使用链表排序的成绩不可以为优)(2)设计报告:要求撰写不少于3000个文字的文档,详细说明各阶段具体要求。四、工作计划:安排12周时间进行实训(每周2课时),软件开发步骤如下,在课程结束时必须完成所有任务,报告撰写同步进行;序号实践项目名称内容提要实践时数主要考察内容考察方式与分数比重1实验1:程序架构的描述1、数据与逻辑分离2、程序架构的描述41、数据与逻辑分离2、程序架构的描述考察方式:考查知识点在最终项
6、目中的应用情况分数比重:约20%2实验2:链表在工程中的应用1、使用链表来构造ATM机的后台数据管理2、实现常见的链表操作插入、删除、修改、遍历以及创建链表61、使用链表来构造ATM机的后台数据管理2、实现常见的链表操作插入、删除、修改、遍历以及创建链表考察方式:考查知识点在最终项目中的应用情况分数比重:约20%3实验3:查找在项目中的应用1、在使用链表的基础上引导学生完成12种主要查找如条件查找和顺序查找2、将这些算法结合到学生的工程应用题中21、在使用链表的基础上引导学生完成12种主要查找如条件查找和顺序查找2、将这些算法结合到学生的工程应用题中考察方式:考查知识点在最终项目中的应用情况分
7、数比重:约15%4实验4:排序在项目中的应用1、在使用链表的基础上引导学生完成23种主要排序冒泡、选择和插入2、将这些算法结合到学生的工程应用题中61、在使用链表的基础上引导学生完成23种主要排序冒泡、选择和插入2、将这些算法结合到学生的工程应用题中考察方式:考查知识点在最终项目中的应用情况分数比重:约20%5实验5:结构在文件中的应用1、讨论不同结构的设计技巧,考虑在同一项目中使用自定义结构的必要性2、考虑将复杂结构双向链表、循环链表作为解决问题的一种途径与手段21、讨论不同结构的设计技巧,考虑在同一项目中使用自定义结构的必要性2、考虑将复杂结构双向链表、循环链表作为解决问题的一种途径与手段
8、考察方式:考查知识点在最终项目中的应用情况分数比重:约10%6实验6:文件操作技巧1、加强学生对文件操作的认识2、考虑将复杂结构中的相关数据通过写入文件的方法作为长期记录保存的工具3、并将此作为改进项目的手段41、加强学生对文件操作的认识2、考虑将复杂结构中的相关数据通过写入文件的方法作为长期记录保存的工具3、并将此作为改进项目的手段考察方式:考查知识点在最终项目中的应用情况分数比重:约15%五、注意事项1)提交文档课程实训任务书(每学生1份)课程实验/实训报告(每学生1份)2)成绩评定学生成绩由指导老师负责考察评定,分为:优、良、中、及格和不及格五档。l 以下情况可以判断成绩为不及格:a、
9、抄袭b、 代码量少于300行c、 未使用链表d、 报告不符合规范l 以下情况不可以判断成绩为优:a、 未使用链表排序b、 使用全局变量c、 大量代码集中在主函数main()中,而不是使用函数进行合理封装d、 功能不完善,有残缺e、 代码缺乏必要的注释f、 缺课l 其他情况由指导老师综合考虑给予成绩评定l 主要考察知识点与要求:a、 链表组织数据b、 排序(基于链表)c、 链表检索d、 文件保存和读取数据e、 函数封装及调用f、 代码缩进和注释等软件工程原则基本要求g、 文档 程 序 设 计 基 础 实 验 报 告摘 要ATM机管理系统是银行业务流程过程中十分重要且必备的环节之一,在银行业务流程
10、当中起着承上启下的作用,其重要性不言而喻。但是,目前许多银行在具体的一些业务流程处理过程中仍然使用手工操作的方式来实施,不仅费时、费力,效率低下,而且无法达到理想的效果。本文针对上述问题,采用软件工程的开发原理,依据软件流程过程规范,开发了一个银行ATM机管理系统。银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、转账、修改密码以及开户的功能。用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。 此程序设计目的在于便于学生更好的掌握C
11、语言这门课程。关键词:ATM;系统;C语言目 录摘 要I第1章 需求分析11.1设计介绍11.2需求分析1第2章 概要设计32.1系统整体模块32.2系统模块设计32.2.1注册模块32.2.2登陆模块 .42.2.3取款模块 . 52.2.4存款模块 . 6 2.2.5修改密码模块 . 7 2.2.6转账模块 . 8 2.2.7查询模块 . 9第3章 详细设计 113.1 函数名 . 113.2 数据类型和结构 . 11第4章 程序实现 . 12 4.1 代码分析 . 12第5章 测试 . 14 5.1 测试结果 . 14结 论18参考文献19附 录20II程 序 设 计 基 础 实 验 报
12、 告第1章 需求分析1.1设计介绍根据生活中ATM的业务要求及对客户的需求分析,这个系统需要实现注册,登录,存取款、查询、转账、修改密码等功能。用户通过注册业务在本系统可以用身份账号注册一个银行账户,并在注册之后可以通过该银行账户登陆ATM系统,在系统中实现存,取款、查询账户信息、修改密码等操作。1.2需求分析1.ATM注册系统首先需要对所有注册用户的信息进行完整的保存与读取。对这些信息的保存要有一定的技巧性,可以为之后用户的注册,以及所有用户的登录提供一个很好的检索条件。在注册的时候要以身份证注册账号。在进行密码输入的时候要人性化,要输入两次密码以确定密码,以防止用户输入含糊的密码。为了实现
13、这个,可以创建一个文件。建立一条链表,链表中每个节点对各种数据类型进行保存。2.ATM登录系统需要调取用户所有信息。这个系统设计必须保证用户的安全性,一旦登录便可以完成登录后可以实现的功能。只有在输入账户号以及密码的情况下才可以登录成功。在登录时要检索所有已登录用户的信息,确保是登录时所输入的账号并且密码输入无误。为了实现这个,可以直接调取文件中的信息进行核对,运用链表检索核对账号和密码的准确性。3.ATM系统的存取款业务,要在登录的情况下才可以进行这个业务。存取款时对用户在这个账户有的金额上进行正确的运算并在确定业务完成的情况下在退出时进行保存。这个业务的实现可以直接运用C语言中的逻辑运算,
14、同时也需要调取文件中的信息,最后在确定改变信息后用改后的信息覆盖之前的信息,退出后存到文件中。4.ATM系统的查询业务,要在登录的情况下才可以进行这个业务。查询信息时,直接根据账号调取文件中该账号的信息提示该用户的姓名,账号,以及账户中的余额。可以运用链表检索从第一个节点检索到所需的账号所在的节点。5.ATM系统的密码修改业务,要在登录的情况下才可以进行这个业务。在输入原密码的情况下,再输入修改后的密码,再一次确认新密码后可以完成该业务。这里需要对用户数据进行修改,并存入文件。这里直接调取信息,修改链表中的数据然后再保存到文件即可。6.ATM系统的转账业务,要在登录的情况下才可以进行这个业务。
15、要准确输入对方的账号并输入转账的金额,并确定后才能转账成功。这里需要对两个用户数据进行修改并保存。完成这个业务,可以输入对方账户进行查找与匹配,然后修改两个节点的值最后都进行一次保存即可。第2章 概要设计 2.1系统整体模块依据需求分析,设计如下一个整体模块结构:开始菜单1登陆验证注册菜单2存款取款转账查询修改密码结束图2.1 系统整体模块2.2系统模块设计2.2.1 注册模块简要介绍:要使用本系统必须先注册一个账号,保存到文件中。流程图如下:开始请输入新银行账户请输入新银行账户密码再一次输入新银行账户密码判断两次输入的密码是否一致否是请输入您的姓名请输入您的身份证号码开户成功结束图2.2.1
16、 注册流程图2.2.2 登陆模块简要介绍:登录模块允许用户通过输入相关信息,使用strcmp()对账户与密码进行匹配。如果用户信息匹配且符合要求则允许用户登录,否则则提示用户错误信息,提醒用户是重新输入还是退出。用链表指针检索并可以确保有该账号并且密码输入无误。此模块可以实现在准确输入账号密码后成功登陆。流程图如下:开始请求输入登录者的账号,密码判断账号密码是否正确进入主页面结束是否图2.2.2 登陆流程图2.2.3 取款模块简要介绍:取款模块可以实现用户的取款,同时调取文件中的信息,并可以针对用户取款的金额在原有的余额上进行正确修改。流程图如下:开始进行登录操作选择取款业务进入取款业务的操作
17、页面选择你所取的金额数进入主页面判断所取的金额数是否大于现有存款数否是结束图2.2.3 取款流程图2.2.4 存款模块简要介绍:存款模块可以实现用户的取款,同时调取文件中的信息,并可以针对用户存款的金额在原有的余额上进行正确修改。流程图如下:开始进行登录操作选择存款业务进入存款业务的操作页面选择你所存的金额数进入主页面是否结束交易是否结束图2.2.4 存款流程图2.2.5 修改密码模块简要介绍:修改密码模块实现的是用户对密码的修改,在输入原有的密码后就可以输入新的密码,再次确定后便可以修改成功。流程图如下:开始进行登录操作结束进入主页面选择修改密码业务请输入原密码请输入新密码再一次输入新密码图
18、2.2.5 修改密码流程图2.2.6 转账模块简要介绍:转账模块可以实现在准确输入对方的账号并输入转账的金额,确认后转账成功。能够对两个用户数据进行修改并保存。完成这个业务,输入对方账户进行查找与匹配,最后保存到数组中。流程图如下: 开始进行登录操作选择转账业务输入转入账号号码选择你所转账的金额数进入主页面判断所转账的金额数是否大于现有存款数否是结束核对账号信息是否正确是否图2.2.6 转账流程图2.2.7 查询模块简要介绍:查询模块可以实现的是在选择查询后,调取数组信息直接显示用户的账号、余额、姓名等资料。流程图如下:开始进行登录操作结束进入主页面选择查询业务图2.2.7 查询流程图第3章
19、详细设计3.1 函数名main 主函数void zhuce(); 注册void login(); 登陆void zhuyemian(); 主页面void chaxun(); 查询void qukuan(); 取款void zhuanzhang(); 转账void xiugai(); 修改密码void cunkuan(); 存款3.2 数据类型和结构该程序主要使用了链表和文件,一个客户的全部信息用结构体来实现,用文件来保存,通过指针来进行交易,结构体为struct Account;第4章 程序实现4.1 代码分析1.链表检索实现使用链表对用户数据进行比较,使p=head,让指针从头一直往后搜索,
20、进行字符串的比较可以判断是否在文件中存有该账号以及密码是否配对。实现代码: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
21、)转账服务(8)修改密码服务图5.1(8)修改密码服务(9)存款服务图5.1(9)存款服务(10)存储文件图5.1(10)存储文件结 论我们这学期刚开学的课程设计是对ATM自动取款机的一个设计,这次的设计要求比上学期的实验报告要求要高了很多。刚开始的时候,老师是让我们先写这一个星期的计划,然后要求我们按计划去做。比如,首先先构思好ATM机的整体思路,在画好各个板块的流程图,在按照流程图去写代码,这样就显得井然有序,思路很清晰。在之后的课程设计中,由于是单独作业,所以靠自己完成。这时才发现经过一个暑假,C语言被我基本忘光了,所以这个课程设计在一定的程度上是在帮我们复习C语言,同时巩固和掌握它。我
22、在做课程设计的时候用到的是函数和数组。函数用来简化程序,数组用来即时存储用户信息。但是用数组有一个弊端就是下次再登陆系统时,上次开户成功的账号已经不存在了,又要重新开户,这就得用到文件和链表了。文件其实是在我们上学期的时候就有提到过的,只不过对它的使用掌握的并不是很好。在ATM中插入链表,我们根本就无从下手,链表本身就是一个难点,更何况还需要我们插入ATM中。所以通过这次课程设计,我看到了我的懒惰和知识匮乏,那么在之后的学习中,我会继续加强已经懂的知识,去了解和深入新的知识,比如下个阶段就是搞懂文件和链表。我相信这次的课程设计之后,我会更加努力的学好这门课程。参考文献1 谭浩强著程序设计(第三
23、版)M清华大学出版社,2005.附 录源代码:#include#include#include#include#define length sizeof(struct Account) /* length代表结构体struct Account的长度 */struct Account /* 定义账号的结构体 */ char name20; /* 姓名 */ char IdCard20; /* 身份证号码 */ char account20; /* 账号号码 */ char password7; /* 账号密码 */ double money; /* 账号余额 */ struct Account
24、*next;Acc,*p,*head; int MenuOne();void zhuce();int login();void MenuTwo();void chaxun();void qukuan();void jiaoyi(long qukuan);void select();void qukuanselect(long jin_e1);void zhuanzhang();void xiugai();void cunkuan();void wenjian();void Save();int main() MenuOne(); system(pause); return 0; int Men
25、uOne() /* 主页面 */ int choice=-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(请选择:); scanf(%d,&choice); switch(choice) case 1: system(cl
26、s); zhuce();/* 进入注册功能 */ break; case 2: system(cls); wenjian(); login(); /* 进入登陆页面 */ break; case 3: printf(谢谢使用,再见. . .n); /* 退出系统 */ system(pause); exit(0); break; default : printf(输入错误,请重新输入. . .n); /* 重新输入 */ Sleep(2000); system(cls); void zhuce() FILE *fp;int flag;char password_17;struct Accoun
27、t *p1;printf(nt*注册账号*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
28、-account)!=0)p1=p1-next;elseflag=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(两次输入的密码不一致或者长度不符,请重新输入.
29、 . .n); printf(请输入姓名: ); scanf(%s,Acc.name);Acc.money=0; /* 初始金额为0 */if(fp=fopen(bank.txt,ab+)=NULL)/* 将新账户的信息存入文件 */printf(cannot open file!n);return;if(p!=NULL)if(fwrite(p,length,1,fp)!=1)printf(file write error!n);fclose(fp);printf(账号注册成功. . .n); Sleep(2000);system(cls);MenuOne();int login() char
30、 zhanghao20; char mima7;int b,flag=0; /* 帐号或密码输入错误,将重新输入 */printf(nt*登陆账号*n); printf(n);p=head;printf(请输入账号: ); scanf(%s,zhanghao);while(flag!=1&p!=NULL)if(strcmp(zhanghao,p-account)!=0)p=p-next;else flag=1;if(flag=1)while(1) printf(请输入密码: ); scanf(%s,mima); if(strlen(mima)=6) break; printf(密码长度不符,请
31、重新输入. . .n); if(strcmp(mima,p-password)!=0)printf(密码输入错误. . .n);printf(n1.重新登陆n); printf(2.创建账号n); printf(3.退出n); scanf(%d,&b); switch(b) case 1: system(cls); login(); break; case 2: system(cls); zhuce(); break; case 3: system(cls); MenuOne(); break; default : printf(输入有误,返回主页面. . .n); system(cls);
32、MenuOne(); elseprintf(n登录成功. . .n);Sleep(2000);system(cls);MenuTwo();elseprintf(n该账号不存在. . .n); printf(1.重新登陆n); printf(2.创建账号n); printf(3.退出n); scanf(%d,&b); switch(b) case 1: system(cls); login(); break; case 2: system(cls); zhuce(); break; case 3: system(cls); MenuOne(); break; default : printf(输
33、入有误,返回主页面. . .n); Sleep(2000); system(cls); MenuOne(); void MenuTwo() /* 服务菜单 */ printf(请选择您所需要的服务n); printf(tt*n); printf(tt*1.查询 * 2.取款 *n); printf(tt*n); printf(tt*3.转账 * 4.修改密码 *n); printf(tt*n); printf(tt*5.存款 * 0.退出 *n); printf(tt*n); while(1)int zz; printf(n请输入操作序号(0-5): ); scanf(%d,&zz);switch(zz)case 1:system(cls); chaxun(); break;case 2:system(cls); qukuan(); break;case 3:system(cls); zhuanzhang();break; case 4: system(cls); xiugai();break;case 5:system(cls); cunkuan();break;case 0:system(cls); Save();return; default : printf(对不起,没有这个选项,请重新输入