




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言课程设计汇报银行账户管理系统231132姜紫阳菜单一、整体需求分析二、程序设计思想三、程序流程框架示意四、程序重要片段及阐明五、程序优劣性分析及改善点六、自我总结及感想七、附录:源代码总体需求分析问题描述设计一种银行账户管理程序,账户的信息有账号(唯一)、身份证(唯一)、余额、密码等,容许顾客进行如下操作:开户、取款、转账、查询、修改密码,一种顾客只能有一种户头,应检测身份证与否被注册。基本规定程序运行时,可以由顾客选择进行何种操作,开户操作规定输入顾客信息后检测身份证与否被使用,不容许顾客透支,根据账号可以进行顾客的信息查询,所有的账户信息应寄存到一种文献中,可以随时的访问和更新。二、程序设计思想银行账户管理的实现由于人数的不确定性,防止内存的挥霍以及出现数组元素不够的状况,选择使用链表进行操作。为保证储户信息可以保留下来,在程序文献夹里面创立了一种“shuju.txt”的文献用以保留数据。程序重要包括信息数据的处理以及程序操作界面两个部分。因此,我创立了一种工程,重要包括4个部分。第一种部分是“function.h”,在里面申明了我要使用的所有函数,并且定义一种顾客类ctm,数据组员重要有身份证号码(id)、账号(ac)、密码(co)、余额(am)以及指向自身的指针(next)等内容,用以生成链表,保留顾客信息。同步,定义了一种ctm型的head指针,用以记录生成链表的头指针。第二部分为“function.c”文献,在这个c文献中,我重要写了8个函数,首先是基础的从文献中读取数据形成链表的函数data()。然后是将文献格式化并将链表的信息写到文献中的函数datanew()。尚有就是通过账号读取账户地址,并将ctm型变量的地址返回的*acread(ac)函数,在此基础上,写了5个函数用以实现开户、取款、转账、查询、修改密码。开户函数重要是先检测身份证与否被使用,然后在链表的结尾加上一种新的数据,并让原链表尾指向新的数据首地址。取款函数重要为读出账户地址,并变化里面的am项,修改密码函数与取款函数类似。转账函数是在取款函数的基础上,分别读取目前顾客的地址和目的顾客的地址,并修改其中的am数据。查询函数重要为读出目的地址,然后显示其中的数据。操作界面上,我定义了一种“control.c”的文献,在里面,重要包括了4各menu()函数用以显示我想要显示的菜单。尚有3个关键的函数,有初始化函数init()、进入系统的函数*enter()、尚有退出的函数iexit()。初始化函数重要是使用了建立链表的函数用以读取数据生成链表,然后变化菜单,等待进入系统。enter函数重要实现查对账号密码的信息,并返回顾客数据的指针*now,用以后来的各个功能。尚有退出函数iexit(),使用datanew()保留顾客信息,并显示退出界面。最终一种部分为“main.c”在里面,我只写了一种主函数main。主函数中,写了系统整体的框架。将各个函数整合。实现循环选择等功能。程序流程框架示意开始开始选择开户功能选择修改密码查询转账取款继续????退出登录系统重要程序片段及阐明1、主函数:voidmain(){ structctm*now; inti=2,j,k=1; init(); while(i==2) { menu1(); menu3(); scanf("%d",&i); if(i==2) { open(); data(); CLR; } } now=enter(); while(k==1) { CLR; menu1(); menu4(); scanf("%d",&j); switch(j) { case1:out(now);break; case2:read(now);break; case3:move(now);break; case4:change(now);break; default:printf("输入错误\n");break; } printf("输入1返回操作界面,输入2退出\n"); scanf("%d",&k); } iexit();}主函数重要实现流程图所示的过程,先初始化,形成链表并变化head指针指向链表首地址,清屏显示菜单。定义了两个开关,i和k,i设为2,进入循环,让顾客在菜单1中选择开户或者直接登录,假如选择开户,那么i仍为2,开完户后继续选择开户或登录,假如选择登录,则i变为1退出循环,清屏显示菜单2(CLR为定义过得清屏函数system(“cls”))。k默认设置为1,进入循环,进入后选择对应的功能,完毕后由顾客选择与否继续,假如继续,输入1,k仍为1,继续循环。输入其他的结束循环并进入自己定义的退出函数iexit退出。2、读取文献信息,新建链表的函数:voiddata(){ longid,ac,am; intco; structctm*count,*p; head=count=NULL; fp=fopen("shuju.txt","r"); while(!feof(fp)) { p=(structctm*)malloc(sizeof(structctm)); fscanf(fp,"%ld%ld%d%ld",&id,&ac,&co,&am); p->id=id; p->ac=ac; p->co=co; p->am=am; p->next=NULL; if(head==NULL) head=count=p; else { count->next=p; count=p; } } fclose(fp);} 链表首地址head在头文献定义,为全局变量,用于寄存链表的首地址,fp也在头文献中定义,为FILE*型的指针(通过试验,在子程序中定义FILE*fp同步在之后定义long和int型变量会出现fp未定义的状况,因此,在头文献中定义fp)。刚开始让head和count指向为NULL,打开文献,在文献流未显示读取完毕的时候,不停为p开辟空间,并读取文献数据赋予p然后让count的指向自身的变量next指向p,并把p赋给count,以此形成链表。链表首地址为head,保留在全局变量中,让后来的函数使用。3、读取顾客数据地址的函数:structctm*acread(longac){ structctm*f; f=head; while(f->ac!=ac) { if(f->next==NULL) { f=NULL; break; } f=f->next; } returnf;} 定义了一种指针f,先让指针指向链表首地址,然后通过比较构造体中的ac元素与ac与否相等。假如相等,则返回f的地址,假如不相等,则f指向后一种数据,最终,当比较到最终一种数据仍不相等,则让f指向为NULL,并返回。4、开户函数:voidopen(){ intj=0,co; longac,am,id; structctm*f,*p; p=(structctm*)malloc(sizeof(structctm)); printf("请输入身份证号码\n"); while(j==0) { f=head; scanf("%ld",&id); while(f->id!=id) { if(f->next==NULL) { if(f->id!=id) { f->next=p; printf("请输入账号\n"); scanf("%ld",&ac); p->ac=ac; printf("请输入密码\n"); scanf("%d",&co); p->co=co; printf("请输入存款金额\n"); scanf("%ld",&am); p->am=am; p->next=NULL; p->id=id; j=1; break; } } f=f->next; if(f->id==id)printf("身份证已被使用,请重新输入\n"); } }}开户函数中比较身份证与否被使用的部分大体与上面的读取顾客数据地址的函数相似,通过不停比较输入的身份证与否相等来确定身份证与否被使用。本函数用到的比较关键的一种东西是开关j。刚开始将开关j设为0,使得函数进入循环,不停比较数据中的id与否与输入的id相等,假如比较到最终一种还不相等,阐明此身份证未被使用,进行开户的操作,然后使开关变为1,跳出循环,结束。假如中途发既有一种相等了,阐明身份证已被使用,告知顾客已被使用,并继续循环。重新输入新的身份证号码。5、功能函数,以转账为例:voidmove(structctm*now){ longnum,acc; structctm*aim; printf("请输入要转的账号\n"); scanf("%ld",&acc); aim=acread(acc); while(aim==NULL) { printf("账号错误,请重新输入,退出按0。\n"); scanf("%ld",&acc); if(acc==0)iexit(); elseaim=acread(acc); } printf("请输入要转的金额\n"); scanf("%ld",&num); while(num>now->am) { printf("金额局限性,请重新输入,退出按0。\n"); scanf("%ld",&num); if(num==0)iexit(); } aim->am=aim->am+num; now->am=now->am-num;} 转账函数中运用了生成链表的函数中保留的head指针,以及读取账户数据地址的函数acread所返回的地址,尚有自己定义的退出函数iexit,首先读取了目前顾客的数据地址now,在用acread读取了目的顾客数据的地址aim。在读取了信息之后,让顾客输入需要转的金额,并比较,假如金额少于顾客实际金额,告知顾客,并重新输入。对的输入后,让链表中的构造体元素am对应的增长和减少。实现余额的变化。6、登录函数:structctm*enter(){ longac; intco; structctm*now; printf("请输入账号\n"); scanf("%ld",&ac); now=acread(ac); while(now==NULL) { printf("账号不存在,请重新输入\n"); now=acread(ac); } printf("请输入密码\n"); scanf("%d",&co); while(now->co!=co) { printf("密码错误,请重新输入,退出按0\n"); scanf("%d",&co); if(co==0)iexit(); } CLR; menu1(); menu4(); return(now);} 登录函数中运用了读取账户地址的函数acread,假如账户地址返回值为NULL,阐明不存在该账户,规定顾客重新输入,假如存在,读出该数据地址,让now指向他,然后通过其中的元素co,比较其与否相等来验证登录的对的性,假如密码也相似,则登录对的,返回指向构造体的指针now。假如密码错误,则让其继续输入。登录之后,清屏(CLR为在头文献中定义的清屏函数),然后显示登录后的菜单。7、退出函数:voidiexit(){ datanew(); CLR; menu1(); menu2(); printf("谢谢使用,按任意键退出。\n"); getchar(); exit(0);} 退出函数中,首先我让通过操作后的链表重新写入到文献中,并让文献中原有的数据清除,其中用到了自己定义的写数据的datanew函数。然后清屏,显示我要显示的退出的菜单,用getchar吞回车,然后实现退出。五、程序优劣性分析及改善点: 程序比较优秀的地方在于首先使用了链表,防止了使用数组引起的空间过度使用或者空间局限性的状况。另一方面,数据的修改在链表中完毕,文献的打开及关闭仅在初始化过程以及退出的过程中使用,提高了程序的效率。同步,用到了清屏函数system(“cls”),使得操作的界面相对来说比较清晰美观,让顾客比较轻易的得到对的信息。 程序中定义构造体的时候其中的身份证用的是long型变量,后来发现该变量局限性以保留身份证,应当改为字符型数组较为合适,用strcmp函数来比较,同步,缺乏检查身份证与否输入对的,应当加上愈加合适。尚有,在读取数据地址的时候直接对每一种数据依次检查,效率低,可以先将数据按照账号排序,再用二分法查找效率更高。六、自我总结及感想:虽然实习时间不长便结束了,但对于这次c语言实习,我对此非常重视,由于实习不仅仅是对我们所学知识的验证,更是发现自身局限性,发现所学知识欠缺的良好时机。
虽然这次实习的题目并不算难,一开始总觉得自己此前所学的知识足以应付本次实训,不过在本次实习程序设计的过程中,我发现自己所学的知识尚有所局限性,例如文献的操作部分,掌握不够充足,在后来的学习中尚有待提高。
在本次实习中,通过自己查阅资料,与同学互相交流,和实训老师的指导下最终完毕了本次实习的任务,这对我后来将所学知识充足应用于工作起到了很好的启发与鼓励作用在实习中,我也碰到了诸多的问题,例如说刚开始时,在定义FILE*fp的时候,发现,在定义了fp后同步定义其他的变量,会有前面的定义无法编译的状况,或许是由于变量的反复定义的关系,于是便将fp的定义放到了头文献中,只定义了一次,使得程序可以完毕编译。在编译完毕后,尚有诸多自己没想到的程序漏洞,例如说,在读取文献建立链表的函数中,由于我写文献都是用’\n’作为结束,在读取文献过程中,我每次读取一行,并检测数据结束标志feof(fp),然而自己忽视了最终一行回车带来的影响,使得建立的链表奇怪的多出一节。编程过程中,诸多时候,由于自己的疏忽,漏写了“;”或者某些基本的函数名字写错使得程序不能编译,这让我明白了细节的重要性,后来需要好好注意这些细节。在程序报错时,通过复制错误信息然后百度是一种很好的排错的措施。同步,在实习过程中,老师也教会了自己调试程序的技能,让自己对程序调试过程愈加清晰。七、附录:源代码1.《function.h》/********************************************************************定义头文献********************************************************************/#ifndeffunction_h#definefunction_h#include<stdio.h>#include<windows.h>#defineCLRsystem("cls")#defineDELAYSleep(1000)structctm{ longid; longac; intco; longam; structctm*next;};structctm*acread(longac);voiddatanew();voiddata();voidopen();voidout(structctm*now);voidread(structctm*now);voidmove(structctm*now);voidchange(structctm*now);voidmenu1();voidmenu2();voidmenu3();voidmenu4();structctm*enter();structctm*head;voidinit();voidiexit();FILE*fp;#endif2.《function.c》#include<stdio.h>#include"function.h"/********************************************************************函数名称:*acread(longac)功能:读取帐户信息返回值:帐户地址指针********************************************************************/structctm*acread(longac){ structctm*f; f=head; while(f->ac!=ac) { if(f->next==NULL) { f=NULL; break; } f=f->next; } returnf;}/********************************************************************函数名称:voiddatanew()功能:更新数据,写入文献。返回值:无********************************************************************/voiddatanew(){ structctm*p; p=head; fp=fopen("shuju.txt","w"); while(p->next!=NULL) { fprintf(fp,"\n%ld%ld%d%ld",p->id,p->ac,p->co,p->am); p=p->next; } fprintf(fp,"\n%ld%ld%d%ld",p->id,p->ac,p->co,p->am); fclose(fp);}/********************************************************************函数名称:data()功能:建立链表返回值:无,变化全局变量head指向链表首地址。********************************************************************/voiddata(){ longid,ac,am; intco; structctm*count,*p; head=count=NULL; fp=fopen("shuju.txt","r"); while(!feof(fp)) { p=(structctm*)malloc(sizeof(structctm)); fscanf(fp,"%ld%ld%d%ld",&id,&ac,&co,&am); p->id=id; p->ac=ac; p->co=co; p->am=am; p->next=NULL; if(head==NULL) head=count=p; else { count->next=p; count=p; } } fclose(fp);}/********************************************************************函数名称:open()功能:开户返回值:无,在链表尾插入信息。********************************************************************/voidopen(){ intj=0,co; longac,am,id; structctm*f,*p; p=(structctm*)malloc(sizeof(structctm)); f=head; printf("请输入身份证号码\n"); while(j==0) { scanf("%ld",&id); while(f->id!=id) { if(f->next==NULL) { if(f->id!=id) { f->next=p; printf("请输入账号\n"); scanf("%ld",&ac); p->ac=ac; printf("请输入密码\n"); scanf("%d",&co); p->co=co; printf("请输入存款金额\n"); scanf("%ld",&am); p->am=am; p->next=NULL; p->id=id; j=1; break; } } f=f->next; if(f->id==id)printf("密码错误,请重新输入\n"); } }}/********************************************************************函数名称:out(structctm*now)功能:取出金额返回值:无,变化am********************************************************************/voidout(structctm*now){ longnum; printf("请输入取出金额\n"); scanf("%ld",&num); while(now->am<num) { printf("余额局限性,请再次输入\n"); scanf("%ld",&num); } now->am=now->am-num;}/********************************************************************函数名称:voidread(structctm*now)功能:查询余额返回值:无********************************************************************/voidread(structctm*now){ printf("账号:%ld余额:%ld\n",now->ac,now->am);}/********************************************************************函数名称:move(structctm*now)功能:转帐返回值:无,变化am********************************************************************/voidmove(structctm*now){ longnum,acc; structctm*aim; printf("请输入要转的账号\n"); scanf("%ld",&acc); aim=acread(acc); while(aim==NULL) { printf("账号错误,请重新输入,退出按0。\n"); scanf("%ld",&acc); if(acc==0)iexit(); elseaim=acread(acc); } printf("请输入要转的金额\n"); scanf("%ld",&num); while(num>now->am) { printf("金额局限性,请重新输入,退出按0。\n"); scanf("%ld",&num); if(num==0)iexit(); } aim->am=aim->am+num; now->am=now->am-num;}/********************************************************************函数名称:change(structctm*now)功能:修改密码返回值:无,变化co********************************************************************/voidchange(structctm*now){ inti,j; do { printf("请输入新密码\n"); scanf("%d",&i); printf("请再输入新密码\n"); scanf("%d",&j); if(i!=j)printf("密码不一致,请重新输入。\n"); }while(i!=j); now->co=i;}3.《control.c》#include<stdio.h>#include<windows.h>#include"function.h"/********************************************************************函数名称:menu1()功能:界面1返回值:无********************************************************************/voidmenu1(){ printf("\t\t|=========================================|\n"); printf("\t\t|-------------简易银行管理系统------------|\n"); printf("\t\t|=========================================|\n");}/********************************************************************函数名称:menu2()功能:界面2返回值:无********************************************************************/voidmenu2(){ printf("\t\t|=========================================|\n"); printf("\t\t|---------------1002076---------------|\n"); printf("\t\t|-----------------231132------------------|\n"); printf("\t\t|-----------------姜紫阳------------------|\n"); printf("\t\t|=========================================|\n");}/********************************************************************函数名称:menu3()功能:界面3返回值:无********************************************************************/voidmenu3(){ printf("\t\t|=========================================|\n"); printf("\t\t|---------------输入数字选择--------------|\n"); printf("\t\t|-------------1已经有帐户登陆-------------|\n"); printf("\t\t|-------------2新建一种帐户-------------|\n"); printf("\t\t|=========================================|\n");}/********************************************************************函数名称:menu4()功能:界面4返回值:无********************************************************************/voidmenu4(){ printf("\t\t|=========================================|\n"); printf("\t\t|---------------输入数字选择--------------|\n"); printf("\t\t|---------------1取款业务---------------|\n"); printf("\t\t|---------------2查询业务---------------|\n"); printf("\t\t|---------------3转帐业务---------------|\n"); printf("\t\t|---------------4修改密码---------------|\n"); printf("\t\t|=========================================|\n");}/********************************************************************函数名称:*enter()功能:进入系统返回值:顾客数据地址********************************************************************/structctm*enter(){ longac; intco; structctm*now; printf("请输入账号\n"); scanf("%ld",&ac); now=acread(ac); while(now==NULL) {
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 面瘫的护理图解
- 广东2024年12月广东省汕尾法院公开招考26名劳动合同制审判辅助人员笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 学校蔬菜购买合同范本
- 建设工程项目质量控制系统的构成田海燕课件
- 河南省安阳市殷都区2024-2025学年数学三下期末统考模拟试题含解析
- 2025届江西省鹰潭市月湖区数学三下期末综合测试模拟试题含解析
- 江苏海洋大学《大气污染控制工程及设备》2023-2024学年第二学期期末试卷
- 锦州医科大学医疗学院《生物医学信号与系统》2023-2024学年第二学期期末试卷
- 西安工商学院《Web前端应用开发实验》2023-2024学年第二学期期末试卷
- 南昌大学《中国竹文化与竹编艺术实践》2023-2024学年第二学期期末试卷
- 电商平台定价策略优化
- 人美版美术 二年级下册全册教学设计(表格式)
- 保险经纪人考试题库含答案
- 2024-2030年中国骨传导耳机行业销售渠道及供需前景预测报告
- 2024年导游服务技能大赛《导游综合知识测试》题库及答案
- 专项训练-解决问题训练(专项训练) 六年级下册数学人教版
- 心肺复苏技能操作考核表
- SHT 3060-2013 石油化工企业供电系统设计规范
- 2024年俄罗斯高空作业平台车行业应用与市场潜力评估
- 芜湖2024年安徽芜湖传媒中心招聘编外工作人员5人笔试历年典型考题及考点附答案解析
- 2024版年度经济法基础完整全套课件
评论
0/150
提交评论