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