版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、长沙学院程序设计基础实训II实训报告实 训 题ATMfr取款系统的改进与完目:善系计算机科学与技术系部:专业 /年软件工程专业2011级 级:学生姓李安平名:班_学号22级:班指导教师姓 职称名:最终评定成 2012年6月项目实训任务书课程名称:程序设计基础实训 II课程编码: JX020158课程类别:专业基础必修课学分数:2学时数:32开课学期: 2实训题目:ATM#取款系统的改进与完善一、已知技术参数和设计要求:银行ATM#取款系统业务描述如下:银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。为 了模拟真实的ATM务环境,本系统必须实现存款、取款、查询、转账、修改
2、密码以及 开户的功能。用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。本系统各个业 务有如下注意点:登陆系统用户登陆之前,必须在登陆界面输入其银行账户,通过其正确输入的银行账户登陆系统。开户业务要使用本系统必须首先执行开户业务开立新的银行账户,并且将此新开的银行存储于文件当中。同时,系统以身份证号码作为开户的充分条件,即一个身份证号码只能开立一次银行账户。存款业务客户登陆系统后,选择存款业务,即可以将输入的存款金额存入相应的账户。取款业务客户登陆系统后, 选择取款业务, 即可以将输入的取款金额从相应的银行账户取出
3、,但是取款金额必须大于目前的账户余额。查询业务客户登陆系统后,可以选择查询业务,查询账户余额。转账业务客户登陆系统后,可以选择转账业务,进行转账。注意的是转账的目的账户必须是本系统已经存在的银行账户。修改密码客户登陆系统后,可以选择修改密码业务,进行密码修改。二、各阶段具体要求:1、系统总体设计阶段1)根据需求分析划分功能模块2)分析并设计各个功能模块之间的关系3)对于各个功能模块,设计相应的数据结构(必须使用链表完成全部功能)4) 设计相应的算法 (必须包括排序和检索功能, 且基于链表进行排序和检索)2、详细设计阶段1)对于每个功能模块,应划分成操作层和数据层2)对于每个操作层,应尽量考虑用
4、户操作的简单,便捷3)对于每个数据层,必须使用链表进行管理4)在用链表进行管理时,必须用到链表检索和排序5)对于数据层的操作完的数据必须保存到文件中(包括文件读、写操作)3、编码实现阶段1)完成代码编写2) 要求代码编写规范 (不得使用全局变量、 所有功能模块必须使用函数封装主函数 main() 的行数不得超过代码总长度的25%)3)代码必须有相应的注释(注释行数不得少于代码的10%,函数功能、变量名、算法、重要的循环、分支都必须用注释说明)4、系统测试阶段1)完成功能调试( 2)要求完成必要的测试工作5、交付实施阶段( 1)提交可正常执行的系统,程序代码(2)撰写项目实训报告书(3)要求按照
5、文档书写规范,严格地书写文档(4)注意:不允许使用代码、图片和表格填充报告空间。代码、图片和表格在 报告中的空间比重不得超过 1/3。要求使用文字清晰描述代码思想和逻辑,文字描 述不得少于3000字(不包含注释文字)。三、设计工作量:(1)软件设计:严格按照具体设计要求,完成问题陈述中所提到的所有需求功 能。(未使用链表实现的、代码少于 300行的不及格,未使用链表排序的成绩不可 以为优)(2)设计报告:要求撰写不少于 3000个文字的文档,详细说明各阶段具体要求。四、工作计划:安排16周时间进行实训(每周2课时),软件开发步骤如下,在第16周必须完成 所有任务,实训与报告撰写同步进行;序 号
6、实践项目名 称内容提要实践时数实践类型实践要求每组人数1实训项目1: 程序架构的描述1、数据与逻辑分离2、程序架构的描述4验证必开12实训项目2: 链表在工程中的 应用1、使用链表来构造 ATM机的后台数据管理2、实现常见的链表 操作一一插入、删除、修 改、遍历以及创建链表8验证必开13实训项目3: 排序在项目中的 应用1、在使用链表的基 础上引导学生完成23种 主要排序一一冒泡、选择 和插入2、将这些算法结合 到学生的工程应用题中8验证必开14实训项目4: 查找在项目中的 应用1、在使用链表的基 础上引导学生完成12种 主要查找一一如顺序查 找4验证必开12、将这些算法结合 到学生的工程应用
7、题中5实训项目5: 结构在文件中的 应用1、讨论不同结构的 设计技巧,考虑在同一项 目中使用自定义结构的 必要性2、考虑将复杂结构双向链表、循环链表 作为解决问题的一种途 径与手段4验证必开16实训项目6: 文件操作技巧1、加强学生对文件 操作的认识2、考虑将复杂结构 中的相关数据通过写入 文件的方法作为长期记 录保存的工具3、并将此作为改进 项目的手段4验证必开1五、注意事项1)提交文档课程实训任务书(每学生1份)课程实训报告(每学生1份)2)成绩评定学生成绩由指导老师负责考察评定,分为:优、良、中、及格和不及格五档。以下情况可以判断成绩为不及格:a、抄袭b、代码量少于300行c、未使用链表
8、d、报告不符合规范以下情况不可以判断成绩为优:a、未使用链表排序b、使用全局变量c、大量代码集中在主函数main()中,而不是使用函数进行合理封装d、功能不完善,有残缺e、代码缺乏必要的注释f、缺课其他情况由指导老师综合考虑给予成绩评定主要考察知识点与要求:a、链表组织数据b、排序(基于链表)c、链表检索d、文件保存和读取数据e、函数封装及调用f、代码缩进和注释等软件工程原则基本要求g、文档摘要银行ATM取款机系统能为用户提供存款、取款、查询、转账与修改密码的功能。在设计编写银行取款机系统时,明确需求以及操作流程,构造出取款机的基本框架及正确的操作流程。将取款机的任务需求分成若干个模块进行编写
9、。编写主要运用链表建立完整的客户信息,完成客户所需的存款以及取款,修改密码等多项功能。查询信息需要对链表进行遍历,逐一对信息进行核对比较,直到找到所需信息或找到链表尾部停止。链表能够按所需分配内存空间,让空间得到充分的利用,同时能够短暂的保存信息,若需长期保存,需要文件的配合。文件能够长久的保存信息。在银行取款机系统中,先把链表中的信息存进文件中,然后在文件中将信息读到链表中。能够实现信息的多次利用。关键词:ATM链表,文件摘 要第 1 章 需求分析 功能需求 性能需求 运行需求 第 2 章 系统设计 银行开户功能 银行登录功能 银行取款功能 余额查询功能 转账功能 修改密码功能存款功能 卡号
10、查询功能 姓名查询功能余额查询功能 删除客户功能 增加客户功能 第 3 章 系统实现 卡号与密码的验证 从文件中读取信息删除功能的实现数据域逻辑的分离程序架构的描述链表的应用 链表排序 第 4章 测 试开户功能测试登陆功能测试取款功能测试修改密码功能测试多个客户信息测试结 论错误 ! 未定义书签。错误 ! 未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 ! 未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签
11、。错误 !未定义书签。错误 !未定义书签。错误 ! 未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 ! 未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 !未定义书签。错误 ! 未定义书签。附 录 错误!未定义书签。致 谢 错误!未定义书签。第 1 章 需求分析功能需求先进行系统分析,将该系统划分为登陆注册模块、键盘输入输出模块、信息认证模块、显示模块、数据存储模块。登陆注册模块主要包括新用户的开户以及老用户的登陆功能。 键盘输入输出模块
12、输入客户信息, 银行卡号, 密码, 存款取款的金额等相关信息,待系统处理后,输出客户的某项信息或提示客户的操作信息。信息认证模块主要是对客户的卡号、密码、以及客户的输入信息的规范进行判断与认证。显示模块主要包括取款模块、存款模块、查询余额模块、转账模块、修改密码模块。数据存储模块主要是将客户信息存储到文件中,需要时从文件中读取数据到链表中,找到相关信息。性能需求性能的需求就是要求在数据上要有精确值, 以免因为数据上的马虎而使得程序存在不确定的风险,在查询过程中,要求显示该客户账号上的所有金额,在客户存取款的过程中,系统只支持交易金额为一百的倍数,并且交易的金额一次不能超过六百,当客户的输入的取
13、款金额比现有余额还大时,要提示客户,余额不足,自动跳出系统。密码的设置只能是六位数。在转账过程中支持任何输入的数据,但转账只能在文件中已经存在的用之间进行转账。交易结束后账户余额要与保存的客户信息越保持一致性,并且在运行时不能太过于繁琐,尽量减少不必要的运行程序,尽量做到简单而功能强大,运行速度快,执行力强等特点。运行需求银行取款机系统的界面要求简洁、友好,且菜单操作简单易懂。当客户输入的信息不符合要求时,要温馨的提示客户重新输入,或者退出。如客户输入的密码与开户时所设密码不相同,则提示客户重新输入密码,若密码连续输入三次,则提示客户三次密码输入错误,退出程序。这样能让客户很清楚自己当前的操作
14、,以及操作后系统运行产生的结果,简单方便,使用性强。第 2 章 系统设计银行开户功能新客户使用银行取款机系统时,必须先进行开户。客户在进行开户业务时,提示客户输入姓名,身份证号码即新客户的银行卡号,并设定好银行卡密码。将客户的信息写入链表当中,并保存在文件中。新客户的默认余额为元。当客户注册成功后,系统将自动保存客户信息,然后显示客户的姓名,卡号,以及客户的默认余额。以便客户识记。银行登录功能客户进入银行取款机登录界面时,按照指定的要求进行操作,当提示客户输入身份证号(卡号) ,当系统接收到客户的输入信息时,将文件中的信息输到链表中,进行遍历核对,当系统接收到客户的输入信息时,将文件中的信息输
15、到链表中,进行遍历核对,若客户输入的银行卡号与注册的卡号不相同,则提示客户输入有误,让客户重新输入。 三次输入银行卡号有误, 系统将自动退出。 若输入卡号正确, 则进入下一个流程。当提示客户输入银行卡密码,当系统接收到客户的输入信息时,将文件中的信息输到链表中,进行遍历核对,若客户输入的银行卡密码与注册的银行卡密码不相同,则提示客户输入有误,让客户重新输入。银行取款功能客户进入银行取款界面时,在银行取款界面中显示客户可取金额数目项目,客户按照指定金额对应的阿拉伯数字输入即可。当客户按照指定的要求输入时,将对客户输入的金额与用户里面的余额进行比较,若客户输入的金额大于现有余额,则提示客余额不足,
16、返回功能选择界面。若客户输入的金额小于客户原有余额,则按p-money-=i 的公式从客户原有余额中减去当下所取金额,然后提示取款成功,并显示客户现有余额。余额查询功能客户在进入银行查询界面时,系统自动从链表中读取与该客户相匹配的余额。转账功能客户进入银行转账界面时,当系统提示客户两次输入需要转账的卡号,若两次输入不相同,则返回选择功能界面。若客户两次输入相同,则从客户原有余额中减去当下所取金额,然后提示转账成功,并显示客户现有余额。修改密码功能客户进入登录界面时,系统自动提示客户输入银行卡原密码,当系统接收到客户的输入的信息时,遍历链表中的信息与客户输入的密码进行核对,若客户输入的银行卡原密
17、码与注册的银行卡密码不相同, 则提示客户输入有误, 系统将自动返回功能选择界面。若输入密码正确,提示客户输入新密码,并保存好客户修改的新密码。下次登录只能用新密码才能成功登录。存款功能客户进入银行存款界面时,系统会从链表中找出该客户的余额显示出来,在银行存款界面中显示客户可取金额数目项目,客户按照指定金额对应的阿拉伯数字输入即可。系统将在客户原有余额中加上当下所存金额,然后提示存款成功,并显示客户现有余额。卡号查询功能在客户信息查询界面中,能够对建立的所有客户的信息按照卡号进行查询,当操作人员输入需要查找的客户的卡号,当找到链表中的卡号与输入的客户的卡号相同时,则显示出客户的信息,包括客户的姓
18、名,卡号,以及余额。若没有找到与之相同的客户卡号,则提示没有该用户,返回功能界面,重新选择。操作者完成客户信息查询后,显示该客户的姓名、卡号、以及余额。姓名查询功能在客户信息查询界面中,能够对建立的所有客户的信息按照姓名进行查询,当操作人员输入需要查找的客户的姓名,当找到链表中的客户姓名与输入的客户的姓名相同时,则显示出客户的信息,包括客户的姓名,卡号,以及余额。若没有找到与之相同的客户姓名, 则提示没有该用户, 返回功能界面, 重新选择。 操作者完成客户信息查询后,显示该客户的姓名、卡号、以及余额。余额查询功能在客户信息查询界面中,能够对建立的所有客户的信息按照余额进行查询,当操作人员输入需
19、要查找的客户的余额,若找到链表中的客户余额与输入的客户的余额相同,则显示出客户的信息,包括客户的姓名,卡号,以及余额。若没有找到与之相同的客户余额,则提示没有该用户,返回功能界面,重新选择。操作者完成客户信息查询后,显示该客户的姓名、卡号、以及余额。删除客户功能在已经建立起了链表的前提下,后台操作者可以对客户的信息进行删减,当操作人员输入需要删除的客户的卡号,当找到链表中的客户卡号与输入的客户的卡号相同时,将该客户信息赋给一工作指针,用另一操作指针指向该用户后一客户,则删除该用户的信息。 若没有找到与之相同的客户卡号, 则提示没有该用户, 返回功能界面, 重新选择。增加客户功能后台操作者可以增
20、加客户的信息, 操作者按要求输入客户的姓名、 卡号、 余额即可。系统将操作人员输入的信息写入链表中。传入头指针,并以头插法的形式写入即可。第 3 章 系统实现卡号与密码的验证密码是当客户登陆银行取款机系统时,系统对顾客的身份进行验证的一种方式。当用户的密码完全与注册时的密码相同时,则可以进入该系统,但如何对客户的密码进行验证,就需要对其原理及其运行方式做详细的解说,客户进入登陆界面后,将链表的头指针 head 传给该函数, char mima6 为客户输入卡号的变量, Char d20 为客户输入卡号的变量。当接收到客户输入的卡号与密码时,要对客户的卡号与密码进行验证,则得对链表进行一次遍历,
21、将工作指针指向头指针,从头结点开始寻找,逐一与客户输入的卡号进行核对,如果第一个节点没有所需信息,则让工作指针指向下一个节点,当工作指针p指向NULL!寸还未找到该用户时,则说明没有该用户,若找到该客户的卡号, 提示该客户输入密码,并对客户的密码进行核对,若与链表中的密码不同,则提示客户密码输入错误,请重新输入,若完全相同,则提示客户登陆成功,进入菜单选择界面。下面是验证密码的相关程序:void denglu(struct per *head)char d20;char mima20;printf( 请您输入卡号n);scanf(%s,d);for(q=head;q!=NULL;q=q-nex
22、t)if(strcmp(q-ID,d)!=0)printf(nn请输入您的密码n);scanf(%s,mima);if(strcmp(q-mima,mima)!=0)printf( 密码不正确,请重新输入密码n);elsecaidan(head);从文件中读取信息运用文件,将运用链表建立的银行取款机系统进行优化。当运用文件对链表建立的数据, 以写的方式将所有信息写入文件夹中进行持久保存, 当需要查找某客户的信息时,又以读的形式将信息从文件中读出来。这样,当第一次操作全部结束后,再登录银行取款机系统时,将文件中存有的数据以读的方式读出来,又可以进行连续的操作,这样数据能够多次利用,方便实用。如何
23、将文件中的信息读入链表中,又是我们需要探讨的问题。需要我们仔细的分析。首先定义两个工作指针,然后以读的方式打开一个二进制的文件,如果文件指针指向NULL则提示“不能打开文件”,如果能够打开,那么进行下一读取数据,读取数据到链表时,必须申请空间来接受信息,当成功申请到空间后,将工作指针 p 指向头指针 head, 以便从第一个节点开始读取数据, 运用一个循环来读取文件中的数据,直到独到文件尾结束。在循环过程中,如果没有读到数据,则跳出循环,如果读到了数据,那么运用 p-next 开辟另外一个空间用来接收下一个节点的信息,然后运用工作指针 q 保存当前节点的指针,作为下一个节点的前驱,然后让工作指
24、针p 指向下一个节点新都如数据链到当前表尾, 直到最后一个节点的后继指针为空。 读取完毕。下面是验证密码的相关程序:FILE *fp;per *p,*q;if(fp=fopen(,rb+)=NULL)printf( 不能打开文件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);删除功能的实现在链表中删除某个节点时,若是第一个客户时,
25、运用头指针指向该节点下一个节点的地址,这样就把第一个节点删除了。如果不是头节点,用一个工作指针指向该节点,用另一工作指针指向该接点的下一节点的地址,这样就把指定要删节点删除了。printf( 请输入要删除的客户卡号:n);scanf(%s,k);if(p-=k)*Phead=(*Phead)-next,free(p);elsewhile(NULL=p-next&p-next-!=k)p=p-next;if(p-next=NULL)printf( 对不起,没有该客户 !n);elset=p-next;p-next=p-next-next;数据域逻辑的分离在制作银行取款机系统时,首先不处理程序的有
26、关数据,比如说不核对客户银行卡卡号与密码即可进入功能选择界面,不处理取款时余额是否不足,客户的输入有误等这些问题,而是将银行取款机系统中的各个功能的函数基本框架构建好,这样银行取款机系统中逻辑这一块就不受数据方面的约束而显得非常清晰了。程序架构的描述在构建的取款机系统的函数中包括注册函数、登录函数、取款函数、查询函数、转账函数、 存款函数、 修改密码函数、 退出函数。 每构件一个函数时, 先在主函数中调用,能够成功编译运行时再写别的函数,然后逐一进行调用,编译运行无误即可。然后根据到那个模块就调用相应的功能函数,在运行时都有相应的功能界面即可,这样银行取款机系统的基本框架就已经成型了。链表的应
27、用运用链表建立银行ATMt台管理系统。在银行ATMt台管理系统中,可以建立若干 个客户信息,直到连续输入三个零则停止客户信息的建立。在后台中,可以运用卡号、姓名、以及余额进行客户信息查询。并且可以对客户的信息进行插入、删除等功能。在后台链表操作中。能够建立若干个客户的信息,同时也可以对所有的客户信息遍历,进行输出,同时可以对所有的客户信息按余额的降序排序进行输出。在已经建立好了客户信息的前提下,能够对客户的信息进行删减,同时也能够增加客户的信息。同时能够按客户的卡号、姓名、以及余额,对客户的信息进行查询。链表排序链表排序,包括冒泡排序,选择排序,以及插入排序。运用链表排序与运用数组进行排序的思
28、想很类似。比如说冒泡排序,冒泡排序同样是对所有数据进行逐一的比较。然后将大的数据保存到下面去,直到一轮比较结束,然后再进行第二轮比较。直到所有的比较完成。将链表排序运用于银行ATMt台客户信息输出系统中,已经建立好若干个客户信息,当需要让客户的信息按照余额的降序进行排列输出时,则链表的排序则体现出了它的功能。让客户的信息以余额的降序一一排列输出。但在实际运用时又遇到了麻烦,交换的是某项的值,而不是地址,这个让我很头疼,但我会继续努力,将其弄懂弄透。做到得心应手。第4章 测 试开户功能测试当客户注册成功时,出现如图所示的界面。图 开户界面示意图登陆功能测试当客户卡号与密码核对无误,登陆成功时,出
29、现如图所示的界面。图 登录界面示意图取款功能测试当客户取款成功时,出现如图所示的界面图 取款界面示意图修改密码功能测试当客户密码修改成功时,出现如图所示的界面。图 修改密码界面示意图多个客户信息测试当管理员按要求输入多个客户信息时,出现如图所示的界面。图 建立客户信息示意图结论在ATM#取款系统的改进与完善的过程中,让我学到了许多的知识,有了更多新的感受。在改进取款机系统时,让我增强了挑战困难的勇气。上学期对链表与文件有着强烈的恐惧心理,感觉那是一道不可逾越的高山。但通过老师的一步步的引导,让我们慢慢向高山靠近,然后试着去攀登。经过若干次的尝试,慢慢体会到了其中的乐趣,同时也就增加了自己继续攀
30、登的信心。ATM的制作过程中,常常会遇到一系列的问题,比如说如何传递指针,这个问题一直是我难以理解的知识,总感觉很抽象的,为什么它就能很准确的将头指针传过来。刚开始就是运用全局指针进行操作,这样理解起来就比较容易了,但是全局变量有着很大的缺陷,那就是一旦全局变量发生变化,其他的函数都将发生一系列的变化, 那种变化是很难预知的, 轻则运行出错, 重则系统瘫痪, 无法运行。后来怀着对该问题的深思,向同学询问,并去图书馆查阅资料,慢慢对链表传参有了一定的了解。通过多次的尝试,对其的理解程度又有了新的提高。在制作的过程中,我不仅学到的是一些直观实用的应用知识,更学到了许多设计思想。以前写程序,拿到就一
31、股脑的写,没有去对其需求进行分析。同时程序很零乱,可读性不高,并且程序复杂但功能繁琐。若哪一环节出现错误时,很难调试。但通过这一学期的学习,让我在程序的设计思想这一块又有了更深层次的了解。比如说ATM勺制作过程, 首先不急于编写程序, 而是详细了解需求关系, 弄清楚操作流程, 构建整体框架,将取款机系统的功能分成若干个小模块。这样在功能的设计方面就不至于盲目去尝试,这样费时又费力。但一一分割后,就只需对各个功能进行针对性的设计与分析,这样就目的性很强,容易测试与修改。然后在构建好的框架中以链表为工具进行编写,最后加上文件,保存客户信息,以备多次利用。完善ATM勺功能。参考文献1谭浩强.C程序设
32、计(第三版).北京:清华大学出版社,2005, 330-348.2高涛,陆丽娜.C语言程序设计.西安:西安交通大学出版社,:249-280.附录#include#include#includestruct per/*char name20;char ID20;int money;char mima6;struct per *next;typedef struct person/*struct per kehu ;struct person *next;L;定义结构体 */定义另一结构体 */void chaxun(struct per *head); /* void kaihu(struct
33、per *head);void denglu(struct per *head);void caidan(struct per *head);void qukuan(struct per *head);void xgmm(struct per *head);void cunkuan(struct per *head);void zhuangzhang(struct per *head);void chuangjian(struct person *Phead);void shuchu(struct person *Phead);void shanchu(struct person *Phead
34、);void zengjia(struct person *Phead);void chaxun1(struct person *Phead);void chaxun2(struct person *Phead);void chaxun3(struct person *Phead);void tuichu();void menu();各个函数的声明 */* 主函数 */ n);break;/* 开户函数 */void kaihu(struct per *head) head=NULL; TOC o 1-5 h z FILE *fp; /* 定义文件指针*/为定义链表指针*/开辟内存单元*/将数
35、据输入链表中 */struct per *p1=NULL,*p2=NULL;/*p1,p1p1=(struct per*)malloc(sizeof(struct per);/*printf( 请输入您的姓名 :n);/*scanf(%s,p1-name );printf( 请设置您的卡号:n);scanf(%s,p1-ID);printf( 请设置您银行卡密码:n);scanf(%s,p1-mima);p1-money=0;p1-next =NULL;printf( 您的个人信息为 n);printf(姓名: %s n 卡号:%s n 余额: %4dn,p1-name ,p1-ID,p1-m
36、oney );if(NULL=head)/* head=(struct per *)malloc(sizeof(struct per); head-next =p1;/*else/*为新增客户开辟内存单元*/进行头插法,将其作为第一个节点 */为新增客户开辟内存单元 */进行尾插 */打开文件 */ for(p2=head;p2-next!=NULL;p2=p2-next); /* p2-next=p1;if(fp=fopen(,ab+)=NULL) /* printf(cannot open filen); return;将链表信息写入文件中 */if(fwrite(p1,sizeof(st
37、ruct per),1,fp)!=1)/*printf(file write errorn); fclose(fp);printf(n);printf( 恭喜您开户成功,请登录 n);system(pause);system(cls);denglu(head);/* 登陆函数 */void denglu(struct per *head) char d20;char mima20;int i,j;FILE *fp;struct per *p,*q=NULL;if(fp=fopen(,rb+)=NULL) /*/*printf(不能打开文件n);/*定义文件指针 */打开一个二进制文件,为读方式
38、*/如不能打开,则结束程序*/p=(struct per*)malloc(sizeof(struct per); head=p;/*申请空间*/while(!feof(fp)/*循环读数据直到文件尾结束*/if(1!=fread(p,sizeof(struct per),1,fp)*/驱*/break;/*p-next=(struct per *)malloc(sizeof(struct per);/*q=p;/*如果没读到数据,跳出循环*/为下一个结点申请空间保存当前结点的指针, 作为下一结点的前p=p-next; q-next=NULL; fclose(fp);/*/*指针后移, 新读入数
39、据链到当前表尾*/最后一个结点的后继指针为空*/printf( printf(printf( for(j=1;jnext)/*遍历链表 */if(strcmp(q-mima,mima)!=0)/*printf( 密码不正确,请重新输入密码n);您输入密码三次错误,谢谢光临 n);*/if(strcmp(q-ID,d)!=0)continue;elsefor(i=1;i4;i+)printf(nnscanf(%s,mima);system(pause);system(cls);continue;elsesystem(cls);caidan(head);printf(nnnsystem(pause
40、);/*/*/*请输入您的密码n);/*/*核对账号 */跳出循环 */限制密码输入的次数的循环核对密码 */若密码不对,跳出循环*/调用菜单函数*/system(cls);exit(0); printf(nnn 您输入的卡号有误,请重试 n);system(pause);system(cls);printf( 您的卡号三次输入错误,谢谢使用 );exit(0);/* 银行菜单函数*/ void caidan(struct per *head) head=NULL;int i;while(1)printf( 请选择您需要的业务n);printf(”*为客户选择输入的变量*/银行业务菜单*/*i
41、/*查询*n);修改密码 *n);退出*n);/*/*/*/*/*/*n);printf(* 1取款 *2printf(”*n);printf(* 3转账 *4printf(”*n);printf(* 5存款 *6printf(”*nnn);scanf(%d,&i);if(i0)switch(i)case 1:qukuan(head); system(pause); system(cls);break;case 2: system(cls);chaxun(head);break;case 3:system(cls); zhuangzhang(head); break;case 4:system
42、(cls);xgmm(head);break;case 5:system(cls); cunkuan(head);break;case 6:system(cls);tuichu(); break;调用银行取款函数 */调用银行查询函数*/调用银行转账函数 */调用银行修改密码函数 */调用银行存款函数*/调用银行退出函数*/else printf( 您的输入有误 n);system(pause);system(cls);/* 银行取款函数函数*/void qukuan(struct per *head)head=NULL;*/int i;FILE *fp;struct per *p,*q=NU
43、LL;if(fp=fopen(,rb+)=NULL)/*head/*/*为链表头指针定义文件指针 */打开一个二进制文件,为读方式*/如不能打开,则结束程序 */申请空间 */循环读数据直到文件尾结束*/如果没读到数据,跳出循环*/为下一个结点申请空间作为下一结点的前指针后移, 新读入数据链到当前表尾*/最后一个结点的后继指针为空*/ TOC o 1-5 h z printf( 不能打开文件n);/* p=(struct per*)malloc(sizeof(struct per); /* head=p;while(!feof(fp)/*if(1!=fread(p,sizeof(struct
44、per),1,fp) break;/*p-next=(struct per *)malloc(sizeof(struct per);/* */q=p;/*/p=p-next;/*q-next=NULL;/*fclose(fp); system(cls);printf(*n);printf(* 1: 100 元 * 2: 200 元 *n); printf(*n);printf(* 3: 300元*4: 400元*n);printf(*n);printf(* 5: 500元*6: 600元*n);printf(*n);printf( 请按要求选择您要取款的金额n);scanf(%d,&i);if
45、(i6|iq-money )printf( 对不起,您的余额不足n);system(pause);system(cls);caidan(head);/*elseq-money-=i;/*if(fp=fopen(,wb+)=NULL)/* printf(cannot open filen);return;if(fwrite(q,sizeof(struct per),1,fp)!=1)/*件*/printf(file write errorn);printf(您已成功走取讥n,i);q-next=NULL;fclose(fp);/*限制输入范围 */对应选项乘以一百为取款金额*/调用取款机菜单函数
46、 */对金额进行处理*/打开文件 */将修改的信息重新写入文关闭文件 */* 银行转账函数*/void zhuangzhang(struct per *head)head=NULL;FILE *fp;/*定义文件指针 */打开一个二进制文件,为读方式*/*如不能打开,则结束程序 */申请空间 */循环读数据直到文件尾结束*/如果没读到数据,跳出循环*/为下一个结点申请空间保存当前结点的指针, 作为下一结点的前指针后移, 新读入数据链到当前表尾*/最后一个结点的后继指针为空*/核对输入卡号*/n);元 *n);元 *n);元 *n);struct per *p,*q=NULL; if(fp=fo
47、pen(,rb+)=NULL) /* TOC o 1-5 h z printf( 不能打开文件n);p=(struct per*)malloc(sizeof(struct per); head=p;while(!feof(fp)/*if(1!=fread(p,sizeof(struct per),1,fp) break;/*p-next=(struct per *)malloc(sizeof(struct per);/* */q=p;/*驱*/p=p-next;/*q-next=NULL;/*fclose(fp); int i,j,k; printf( 请输入转账号码n);scanf(%d,&
48、i);printf( 请再次输入转账号码n);/*scanf(%d,&j);if(i!=j) printf( 两次账号不相同,请重新输入 zhuangzhang(head); else system(cls);printf(*n printf(* 1: 100 元 * 2: 200 printf(*n printf(* 3: 300元* 4: 400printf(*n printf(* 5: 500元*6: 600printf(*nprintf( 请输入转账金额n);scanf(%d,&k);if(k6|kq-money )/*printf( 对不起,您的余额不足 n);system(paus
49、e);system(cls);caidan(head);elseprintf(您已成功转账讥n,k);q-money-=k;if(fp=fopen(,wb+)=NULL)printf(cannot open filen);return;if(fwrite(q,sizeof(per),1,fp)!=1)/*/printf(file write errorn);q-next=NULL;fclose(fp);system(pause);system(cls);对余额进行判断*/将新数据重新写入文件中/* 银行查询函数*/void chaxun(struct per *head) head=NULL;
50、/*FILE *fp;/*struct per *p,*q=NULL;链表头指针*/定义文件指针 */打开一个二进制文件,为读方式*/如不能打开,则结束程序*/申请空间 */循环读数据直到文件尾结束*/如果没读到数据,跳出循环*/为下一个结点申请空间if(fp=fopen(,rb+)=NULL) /* TOC o 1-5 h z printf( 不能打开文件n);/*p=(struct per*)malloc(sizeof(struct per); /* head=p;while(!feof(fp)/*if(1!=fread(p,sizeof(struct per),1,fp)break;/*
51、p-next=(struct per *)malloc(sizeof(struct per);/*/q=p;/*保存当前结点的指针,作为下一结点的前驱*/p=p-next;/*指针后移, 新读入数据链到当前表尾*/q-next=NULL;/*最后一个结点的后继指针为空*/fclose(fp); printf( 您卡上原有余额为d元nn,q-money);system(pause);system(cls); TOC o 1-5 h z /* 银行修改密码函数*/ void xgmm(struct per *head) head=NULL;/*char mima20; FILE *fp;/*str
52、uct per *p,*q=NULL;if(fp=fopen(,rb+)=NULL) /*printf( 不能打开文件n);p=(struct per*)malloc(sizeof(struct per); head=p;while(!feof(fp)/* if(1!=fread(p,sizeof(struct per),1,fp) break;/*链表头指针*/定义文件指针 */打开一个二进制文件,为读方式*/*如不能打开,则结束程序 */* 申请空间 */循环读数据直到文件尾结束*/如果没读到数据,跳出循环*/为下一个结点申请空间保存当前结点的指针,作为下一结点的指针后移, 新读入数据链到
53、当前表尾最后一个结点的后继指针为空*/核对密码 */文件头指针*/将修改的密码重新写入文*/p-next=(struct per *)malloc(sizeof(struct per);/*/ TOC o 1-5 h z q=p;/*前驱 */p=p-next;/* q-next=NULL;/*fclose(fp); printf( 请输入您的原密码n);scanf(%s,mima);if(strcmp(q-mima,mima)=0)/*printf(密码正确 n);printf(请输入您的新密码:n);scanf(%s,q-mima);if(fp=fopen(,wb+)=NULL)/* pr
54、intf(cannot open filen);return;if(fwrite(q,sizeof(struct per),1,fp)!=1)/*件*/printf(file write errorn);fclose(fp);printf( 密码修改成功nnnnn);else printf( 您输入的密码与原密码不同 n); return;system(pause);q-next=NULL;/* 银行存款函数*/ void cunkuan(struct per *head) TOC o 1-5 h z head=NULL;/*int i; FILE *fp;/*struct per *p,*q
55、=NULL; if(fp=fopen(,rb+)=NULL) /* printf( 不能打开文件n);p=(struct per*)malloc(sizeof(struct per); head=p;while(!feof(fp)/*链表头指针 */定义文件指针 */打开一个二进制文件,为读方式*/*如不能打开,则结束程序 */* 申请空间 */循环读数据直到文件尾结束*/如果没读到数据,跳出循环*/为下一个结点申请空间保存当前结点的指针, 作为下一结点的前指针后移, 新读入数据链到当前表尾*/最后一个结点的后继指针为空*/if(1!=fread(p,sizeof(struct per),1,
56、fp) break;/* p-next=(struct per *)malloc(sizeof(struct per);/*/q=p;/*驱*/p=p-next;/*q-next=NULL;/*fclose(fp); system(cls); printf(您卡上原有余额为 %d%n,q-money );printf(*n);printf(*1: 100元*2: 200元*n)printf(*n);printf(*3: 300元*4: 400元*n)printf(*n);printf(*5: 500元*6: 600元*n)printf(*n);printf( 请选择您要存入的金额);scanf
57、(%d,&i);if(i6|imoney+=i;打开文件 */if(fp=fopen(,wb+)=NULL)/*printf(cannot open filen);return;将修改的密码重新写入文if(fwrite(q,sizeof(struct per),1,fp)!=1)/*件*/printf(file write errorn);printf(您已成功存取元坨力;q-next=NULL;fclose(fp);system(pause);system(cls);/* 退出银行函数*/void tuichu()printf( 谢谢使用 n);exit(0);/* 后台运行菜单函数*/ v
58、oid menu()/ 菜单显示函数printf(*欢迎来到建设银行取款机系统*nnnn);printf(”*n);printf(* 1 建立信息并显示* 2 卡号查询信息printf(*printf(* 3 姓名查询信息* 4 余额查询信息printf(”*n);printf(* 5 删除某卡号信息*6 增加新的可户*n);*n);*n);printf(”*n);printf(* 7 按余额降序输出 *8 输出printf(”*printf(* 0 退出谢谢光临*n);*n);printf(”*n);printf( 请选择您需要的业务nn);/* 后台运行创建链表函数*/void chuan
59、gjian(struct person *Phead) /*(*Phead) 为指向结构体指针的地 址 */struct person *p,*t;/*定义操作指针 */char n20;char a20;int s;if(*Phead) *Phead=NULL;printf(请输入卡号姓名金额 (若要结束请输入三个为零) n); TOC o 1-5 h z printf(请输入卡号n);scanf(%s,n);printf( 请输入姓名 n);/ 输入信息scanf(%s,a);printf( 请输入预存金额n);scanf(%d,&s);if(s=0) return;将信息输入链表中将指针
60、重新指向头指针*/p=(L *)malloc(sizeof(L);/strcpy(p-,n);strcpy(p-,a);p-=s;p-next=NULL; TOC o 1-5 h z *Phead=p;/*printf(请输入卡号n);scanf(%s,n);printf(请输入姓名n);scanf(%s,a);printf( 请输入预存金额n);scanf(%d,&s);while(s)将 P 的值赋给 t,p 又可以存储下为新节点开辟新的内存*/t=p;/*一个节点 */p=(L *)malloc(sizeof(L);/*strcpy(p-,n);strcpy(p-,a);p-=s;p-n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考语法过关落实状语从句
- 大象版科学六上1.2《在实验中探秘》课件1
- 教科版科学五上《食物网和食物链》课件
- 教科版科学三上《蚯蚓》课件12
- 读书背景模板课件
- 危险化学品职业健康监护基础知识安全培训
- 燃气安全监测预警平台项目可行性研究报告
- 市政园林喷灌设施维护与保养方案
- 数据中心培训
- 饮用水水质异常上报处置规范
- 一年级上册数学期中质量检测卷(青岛版五四学制)(含答案)
- 四川省南充市高2027届高考适应性考试(一诊)(全科)数学+答案
- 2026北京市海淀区招聘社区工作者123人笔试备考试题及答案解析
- 半导体供应链韧性研究与对策分析
- 医学康复科病历书写规范培训
- 2026年秋季小学低年级班主任课堂纪律管理经验课件
- 2026秋新教材人教PEP版六年级上册英语全册教案(单元整体教学设计)
- 文书模板-城市公交客运企业安全管理检查表
- 2026版《残疾人保障和发展“十五五”规划》学习与解读
- 2026新教材语文 10《往事依依》教学课件
- 2026新教科版四年级科学上册第一单元第5课《空气流动有力量》课件
评论
0/150
提交评论