计算机软件及应用C语言版ATM银行取款机系统源码以及程序设计基础实训Word文件下载.docx
《计算机软件及应用C语言版ATM银行取款机系统源码以及程序设计基础实训Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机软件及应用C语言版ATM银行取款机系统源码以及程序设计基础实训Word文件下载.docx(51页珍藏版)》请在冰点文库上搜索。
用户登陆之前,必须在登陆界面输入其银行账户,通过其正确输入的银行账户登陆系统。
(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个文字的文档,详细说明各阶段具体要求。
四、工作计划:
安排16周时间进行实训(每周2课时),软件开发步骤如下,在第16周必须完成所有任务,实训与报告撰写同步进行;
序号
实践项目名称
内容提要
实践
时数
类型
要求
每组
人数
1
实训项目1:
程序架构的描述
1、数据与逻辑分离
2、程序架构的描述
4
验证
必开
实训项目2:
链表在工程中的应用
1、使用链表来构造ATM机的后台数据管理
2、实现常见的链表操作——插入、删除、修改、遍历以及创建链表
8
3
实训项目3:
排序在项目中的应用
1、在使用链表的基础上引导学生完成2~3种主要排序——冒泡、选择和插入
2、将这些算法结合到学生的工程应用题中
实训项目4:
查找在项目中的应用
1、在使用链表的基础上引导学生完成1~2种主要查找——如顺序查找
5
实训项目5:
结构在文件中的应用
1、讨论不同结构的设计技巧,考虑在同一项目中使用自定义结构的必要性
2、考虑将复杂结构——双向链表、循环链表作为解决问题的一种途径与手段
6
实训项目6:
文件操作技巧
1、加强学生对文件操作的认识
2、考虑将复杂结构中的相关数据通过写入文件的方法作为长期记录保存的工具
3、并将此作为改进项目的手段
五、注意事项
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,链表,文件
第1章需求分析
1.1功能需求
先进行系统分析,将该系统划分为登陆注册模块、键盘输入输出模块、信息认证模块、显示模块、数据存储模块。
登陆注册模块主要包括新用户的开户以及老用户的登陆功能。
键盘输入输出模块输入客户信息,银行卡号,密码,存款取款的金额等相关信息,待系统处理后,输出客户的某项信息或提示客户的操作信息。
信息认证模块主要是对客户的卡号、密码、以及客户的输入信息的规范进行判断与认证。
显示模块主要包括取款模块、存款模块、查询余额模块、转账模块、修改密码模块。
数据存储模块主要是将客户信息存储到文件中,需要时从文件中读取数据到链表中,找到相关信息。
1.2性能需求
性能的需求就是要求在数据上要有精确值,以免因为数据上的马虎而使得程序存在不确定的风险,在查询过程中,要求显示该客户账号上的所有金额,在客户存取款的过程中,系统只支持交易金额为一百的倍数,并且交易的金额一次不能超过六百,当客户的输入的取款金额比现有余额还大时,要提示客户,余额不足,自动跳出系统。
密码的设置只能是六位数。
在转账过程中支持任何输入的数据,但转账只能在文件中已经存在的用之间进行转账。
交易结束后账户余额要与保存的客户信息越保持一致性,并且在运行时不能太过于繁琐,尽量减少不必要的运行程序,尽量做到简单而功能强大,运行速度快,执行力强等特点。
1.3运行需求
银行取款机系统的界面要求简洁、友好,且菜单操作简单易懂。
当客户输入的信息不符合要求时,要温馨的提示客户重新输入,或者退出。
如客户输入的密码与开户时所设密码不相同,则提示客户重新输入密码,若密码连续输入三次,则提示客户三次密码输入错误,退出程序。
这样能让客户很清楚自己当前的操作,以及操作后系统运行产生的结果,简单方便,使用性强。
第2章系统设计
2.1银行开户功能
新客户使用银行取款机系统时,必须先进行开户。
客户在进行开户业务时,提示客户输入姓名,身份证号码即新客户的银行卡号,并设定好银行卡密码。
将客户的信息写入链表当中,并保存在文件中。
新客户的默认余额为0.0元。
当客户注册成功后,系统将自动保存客户信息,然后显示客户的姓名,卡号,以及客户的默认余额。
以便客户识记。
2.2银行登录功能
客户进入银行取款机登录界面时,按照指定的要求进行操作,当提示客户输入身份证号(卡号),当系统接收到客户的输入信息时,将文件中的信息输到链表中,进行遍历核对,当系统接收到客户的输入信息时,将文件中的信息输到链表中,进行遍历核对,若客户输入的银行卡号与注册的卡号不相同,则提示客户输入有误,让客户重新输入。
三次输入银行卡号有误,系统将自动退出。
若输入卡号正确,则进入下一个流程。
当提示客户输入银行卡密码,当系统接收到客户的输入信息时,将文件中的信息输到链表中,进行遍历核对,若客户输入的银行卡密码与注册的银行卡密码不相同,则提示客户输入有误,让客户重新输入。
2.3银行取款功能
客户进入银行取款界面时,在银行取款界面中显示客户可取金额数目项目,客户按照指定金额对应的阿拉伯数字输入即可。
当客户按照指定的要求输入时,将对客户输入的金额与用户里面的余额进行比较,若客户输入的金额大于现有余额,则提示客余额不足,返回功能选择界面。
若客户输入的金额小于客户原有余额,则按p->
money-=i的公式从客户原有余额中减去当下所取金额,然后提示取款成功,并显示客户现有余额。
2.4余额查询功能
客户在进入银行查询界面时,系统自动从链表中读取与该客户相匹配的余额。
2.5转账功能
客户进入银行转账界面时,当系统提示客户两次输入需要转账的卡号,若两次输入不相同,则返回选择功能界面。
若客户两次输入相同,则从客户原有余额中减去当下所取金额,然后提示转账成功,并显示客户现有余额。
2.6修改密码功能
客户进入登录界面时,系统自动提示客户输入银行卡原密码,当系统接收到客户的输入的信息时,遍历链表中的信息与客户输入的密码进行核对,若客户输入的银行卡原密码与注册的银行卡密码不相同,则提示客户输入有误,系统将自动返回功能选择界面。
若输入密码正确,提示客户输入新密码,并保存好客户修改的新密码。
下次登录只能用新密码才能成功登录。
2.7存款功能
客户进入银行存款界面时,系统会从链表中找出该客户的余额显示出来,在银行存款界面中显示客户可取金额数目项目,客户按照指定金额对应的阿拉伯数字输入即可。
系统将在客户原有余额中加上当下所存金额,然后提示存款成功,并显示客户现有余额。
2.8卡号查询功能
在客户信息查询界面中,能够对建立的所有客户的信息按照卡号进行查询,当操作人员输入需要查找的客户的卡号,当找到链表中的卡号与输入的客户的卡号相同时,则显示出客户的信息,包括客户的姓名,卡号,以及余额。
若没有找到与之相同的客户卡号,则提示没有该用户,返回功能界面,重新选择。
操作者完成客户信息查询后,显示该客户的姓名、卡号、以及余额。
2.9姓名查询功能
在客户信息查询界面中,能够对建立的所有客户的信息按照姓名进行查询,当操作人员输入需要查找的客户的姓名,当找到链表中的客户姓名与输入的客户的姓名相同时,则显示出客户的信息,包括客户的姓名,卡号,以及余额。
若没有找到与之相同的客户姓名,则提示没有该用户,返回功能界面,重新选择。
2.10余额查询功能
在客户信息查询界面中,能够对建立的所有客户的信息按照余额进行查询,当操作人员输入需要查找的客户的余额,若找到链表中的客户余额与输入的客户的余额相同,则显示出客户的信息,包括客户的姓名,卡号,以及余额。
若没有找到与之相同的客户余额,则提示没有该用户,返回功能界面,重新选择。
2.11删除客户功能
在已经建立起了链表的前提下,后台操作者可以对客户的信息进行删减,当操作人员输入需要删除的客户的卡号,当找到链表中的客户卡号与输入的客户的卡号相同时,将该客户信息赋给一工作指针,用另一操作指针指向该用户后一客户,则删除该用户的信息。
2.12增加客户功能
后台操作者可以增加客户的信息,操作者按要求输入客户的姓名、卡号、余额即可。
系统将操作人员输入的信息写入链表中。
传入头指针,并以头插法的形式写入即可。
第3章系统实现
3.1卡号与密码的验证
密码是当客户登陆银行取款机系统时,系统对顾客的身份进行验证的一种方式。
当用户的密码完全与注册时的密码相同时,则可以进入该系统,但如何对客户的密码进行验证,就需要对其原理及其运行方式做详细的解说,客户进入登陆界面后,将链表的头指针head传给该函数,charmima[6]为客户输入卡号的变量,Chard[20]为客户输入卡号的变量。
当接收到客户输入的卡号与密码时,要对客户的卡号与密码进行验证,则得对链表进行一次遍历,将工作指针指向头指针,从头结点开始寻找,逐一与客户输入的卡号进行核对,如果第一个节点没有所需信息,则让工作指针指向下一个节点,当工作指针p指向NULL时还未找到该用户时,则说明没有该用户,若找到该客户的卡号,提示该客户输入密码,并对客户的密码进行核对,若与链表中的密码不同,则提示客户密码输入错误,请重新输入,若完全相同,则提示客户登陆成功,进入菜单选择界面。
下面是验证密码的相关程序:
voiddenglu(structper*head)
{
chard[20];
charmima[20];
printf("
请您输入卡号\n"
);
scanf("
%s"
d);
for(q=head;
q!
=NULL;
q=q->
next)
{
if(strcmp(q->
ID,d)!
=0)
\n\n请输入您的密码\n"
mima);
mima,mima)!
=0)
密码不正确,请重新输入密码\n"
}
else
caidan(head);
}
}}
3.2从文件中读取信息
运用文件,将运用链表建立的银行取款机系统进行优化。
当运用文件对链表建立的数据,以写的方式将所有信息写入文件夹中进行持久保存,当需要查找某客户的信息时,又以读的形式将信息从文件中读出来。
这样,当第一次操作全部结束后,再登录银行取款机系统时,将文件中存有的数据以读的方式读出来,又可以进行连续的操作,这样数据能够多次利用,方便实用。
如何将文件中的信息读入链表中,又是我们需要探讨的问题。
需要我们仔细的分析。
首先定义两个工作指针,然后以读的方式打开一个二进制的文件,如果文件指针指向NULL,则提示“不能打开文件”,如果能够打开,那么进行下一读取数据,读取数据到链表时,必须申请空间来接受信息,当成功申请到空间后,将工作指针p指向头指针head,以便从第一个节点开始读取数据,运用一个循环来读取文件中的数据,直到独到文件尾结束。
在循环过程中,如果没有读到数据,则跳出循环,如果读到了数据,那么运用p->
next开辟另外一个空间用来接收下一个节点的信息,然后运用工作指针q保存当前节点的指针,作为下一个节点的前驱,然后让工作指针p指向下一个节点新都如数据链到当前表尾,直到最后一个节点的后继指针为空。
读取完毕。
FILE*fp;
per*p,*q;
if((fp=fopen("
save.txt"
"
rb+"
))==NULL)
{
不能打开文件\n"
}
p=(per*)malloc(sizeof(per));
head=p;
while(!
feof(fp))
if(1!
=fread(p,sizeof(per),1,fp))
break;
p->
next=(per*)malloc(sizeof(per));
q=p;
p=p->
next;
}
q->
next=NULL;
fclose(fp);
3.3删除功能的实现
在链表中删除某个节点时,若是第一个客户时,运用头指针指向该节点下一个节点的地址,这样就把第一个节点删除了。
如果不是头节点,用一个工作指针指向该节点,用另一工作指针指向该接点的下一节点的地址,这样就把指定要删节点删除了。
printf("
请输入要删除的客户卡号:
\n"
scanf("
k);
if(p->
kehu.ID==k)
*Phead=(*Phead)->
next,free(p);
else
while(NULL==p->
next&
&
p->
next->
kehu.ID!
=k)
p=p->
next==NULL)
对不起,没有该客户!
t=p->
next=p->
3.4数据域逻辑的分离
在制作银行取款机系统时,首先不处理程序的有关数据,比如说不核对客户银行卡卡号与密码即可进入功能选择界面,不处理取款时余额是否不足,客户的输入有误等这些问题,而是将银行取款机系统中的各个功能的函数基本框架构建好,这样银行取款机系统中逻辑这一块就不受数据方面的约束而显得非常清晰了。
3.5程序架构的描述
在构建的取款机系统的函数中包括注册函数、登录函数、取款函数、查询函数、转账函数、存款函数、修改密码函数、退出函数。
每构件一个函数时,先在主函数中调用,能够成功编译运行时再写别的函数,然后逐一进行调用,编译运行无误即可。
然后根据到那个模块就调用相应的功能函数,在运行时都有相应的功能界面即可,这样银行取款机系统的基本框架就已经成型了。
3.6链表的应用
运用链表建立银行ATM后台管理系统。
在银行ATM后台管理系统中,可以建立若干个客户信息,直到连续输入三个零则停止客户信息的建立。
在后台中,可以运用卡号、姓名、以及余额进行客户信息查询。
并且可以对客户的信息进行插入、删除等功能。
在后台链表操作中。
能够建立若干个客户的信息,同时也可以对所有的客户信息遍历,进行输出,同时可以对所有的客户信息按余额的降序排序进行输出。
在已经建立好了客户信息的前提下,能够对客户的信息进行删减,同时也能够增加客户的信息。
同时能够按客户的卡号、姓名、以及余额,对客户的信息进行查询。
3.7链表排序
链表排序,包括冒泡排序,选择排序,以及插入排序。
运用链表排序与运用数组进行排序的思想很类似。
比如说冒泡排序,冒泡排序同样是对所有数据进行逐一的比较。
然后将大的数据保存到下面去,直到一轮比较结束,然后再进行第二轮比较。
直到所有的比较完成。
将链表排序运用于银行ATM后台客户信息输出系统中,已经建立好若干个客户信息,当需要让客户的信息按照余额的降序进行排列输出时,则链表的排序则体现出了它的功能。
让客户的信息以余额的降序一一排列输出。
但在实际运用时又遇到了麻烦,交换的是某项的值,而不是地址,这个让我很头疼,但我会继续努力,将其弄懂弄透。
做到得心应手。
第4章测试
4.1开户功能测试
当客户注册成功时,出现如图4.1所示的界面。
图4.1开户界面示意图
4.2登陆功能测试
当客户卡号与密码核对无误,登陆成功时,出现如图4.2所示的界面。
图4.2登录界面示意图
4.3取款功能测试
当客户取款成功时,出现如图4.3所示的界面。
图4.3取款界面示意图
4.4修改密码功能测试
当客户密码修改成功时,出现如图4.2所示的界面。
图4.4修改密码界面示意图
4.5多个客户信息测试
当管理员按要求输入多个客户信息时,出现如图4.5所示的界面。
图4.5建立客户信息示意图
结论
在ATM存取款系统的改进与完善的过程中,让我学到了许多的知识,有了更多新的感受。
在改进取款机系统时,让我增强了挑战困难的勇气。
上学期对链表与文件有着强烈的恐惧心理,感觉那是一道不可逾越的高山。
但通过老师的一步步的引导,让我们慢慢向高山靠近,然后试着去攀登。
经过若干次的尝试,慢慢体会到了其中的乐趣,同时也就增加了自己继续攀登的信心。
ATM的制作过程中,常常会遇到一系列的问题,比如说如何传递指针,这个问题一直是我难以理解的知识,总感觉很抽象的,为什么它就能很准确的将头指针传过来。
刚开始就是运用全局指针进行操作,这样理解起来就比较容易了,但是全局变量有着很大的缺陷,那就是一旦全局变量发生变化,其他的函数都将发生一系列的变化,那种变化是很难预知的,轻则运行出错,重则系统瘫痪,无法运行。
后来怀着对该问题的深思,向同学询问,并去图书馆查阅资料,慢慢对链表传参有了一定的了解。
通过多次的尝试,对其的理解程度又有了新的提高。
在制作的过程中,我不仅学到的是一些直观实用的应用知识,更学到了许多设计思想。
以前写程序,拿到就一股脑的写,没有去对其需求进行分析。
同时程序很零乱,可读性不高,并且程序复杂但功能繁琐。
若哪一环节出现错误时,很难调试。
但通过这一学期的学习,让我在程序的设计思想这一块又有了更深层次的了解。
比如说ATM的制作过程,首先不急于编写程序,而是详细了解需求关系,弄清楚操作流程,构建整体框架,将取款机系统的功能分成若干个小模块。
这样在功能的设计方面就不至于盲目去尝试,这样费时又费力。
但一一分割后,就只需对各个功能进行针对性的设计与分析,这样就目的性很强,容易测试与修改。
然后在构建好的框架中以链表为工具进行编写,最后加上文件,保存客户信息,以备多次利用。
完善ATM的功能。
参考文献
[1]谭浩强.C程序设计(第三版).北京:
清华大学出版社,2005,330-348.
[2]高涛,陆丽娜.C语言程序设计.西安:
西安交通大学出版社,2007.2:
249-280.
附录
#include<
stdio.h>
string.h>
stdlib.h>
structper/*定义结构体*/
{
charname[20];
charID[20];
intmoney;
charmima[6];
structper*next;
};
typedefstructperson/*定义另一结构体*/
struct