C语言实习报告_第1页
C语言实习报告_第2页
C语言实习报告_第3页
C语言实习报告_第4页
C语言实习报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——C语言实习报告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(\if(i==2){

}

open();data();CLR;}}

now=enter();while(k==1){CLR;menu1();menu4();scanf(\switch(j){case1:out(now);break;case2:read(now);break;case3:move(now);break;case4:change(now);break;default:printf(\输入错误\\n\}printf(\输入1返回操作界面,输入2退出\\n\scanf(\}

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(\while(!feof(fp)){p=(structctm*)malloc(sizeof(structctm));

}

fscanf(fp,\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(\while(f->id!=id){if(f->next==NULL){if(f->id!=id){f->next=p;printf(\请输入账号\\n\scanf(\p->ac=ac;printf(\请输入密码\\n\scanf(\p->co=co;printf(\请输入存款金额\\n\scanf(\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(\aim=acread(acc);while(aim==NULL){printf(\账号错误,请重新输入,退出按0。\\n\scanf(\if(acc==0)iexit();elseaim=acread(acc);}

printf(\请输入要转的金额\\n\scanf(\while(num>now->am){printf(\金额不足,请重新输入,退出按0。\\n\scanf(\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(\now=acread(ac);

while(now==NULL){printf(\账号不存在,请重新输入\\n\now=acread(ac);}

printf(\请输入密码\\n\scanf(\while(now->co!=co){printf(\密码错误,请重新输入,退出按0\\n\scanf(\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#include#defineCLRsystem(\#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;

#endif

2.《function.c》

#include#include\

/********************************************************************函数名称:*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(\while(p->next!=NULL){fprintf(fp,\p=p->next;}

fprintf(fp,\fclose(fp);}

/********************************************************************函数名称:data()功能:建立链表

返回值:无,改变全局变量head指向链表首地址。

********************************************************************/voiddata(){

longid,ac,am;intco;

structctm*count,*p;head=count=NULL;

fp=fopen(\while(!feof(fp)){p=(structctm*)malloc(sizeof(structctm));fscanf(fp,\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(\while(f->id!=id){if(f->next==NULL){if(f->id!=id){f->next=p;printf(\请输入账号\\n\scanf(\p->ac=ac;printf(\请输入密码\\n\scanf(\p->co=co;printf(\请输入存款金额\\n\scanf(\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(\

while(now->amam=now->am-num;}

/********************************************************************函数名称:voidread(structctm*now)功能:查询余额返回值:无

********************************************************************/voidread(structctm*now){

printf(\账号:%ld余额:%ld\\n\}

/********************************************************************函数名称:move(structctm*now)功能:转帐

返回值:无,改变am

********************************************************************/voidmove(structctm*now){

longnum,acc;structctm*aim;

printf(\请输入要转的账号\\n\scanf(\aim=acread(acc);while(aim==NULL){printf(\账号错误,请重新输入,退出按0。\\n\scanf(\if(acc==0)iexit();elseaim=acread(acc);}

printf(\请输入要转的金额\\n\scanf(\while(num>now->am){printf(\金额不足,请重新输入,退出按0。\\n\scanf(\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(\printf(\请再输入新密码\\n\scanf(\

if(i!=j)printf(\密码不一致,请重新输入。\\n\}while(i!=j);now->co=i;}

3.《control.c》

#include#include#include\

/********************************************************************函数名称:menu1()功能:界面1返回值:无

********************************************************************/voidmenu1(){

printf(\printf(\简易银行管理系统|\\n\

printf(\}

/********************************************************************函数名称:menu2()功能:界面2返回值:无

********************************************************************/voidmenu2(){

printf(\printf(\printf(\printf(\姜紫阳|\\n\

printf(\}

/********************************************************************函数名称:menu3()功能:界面3返回值:无

********************************************************************/voidmenu3(){

printf(\printf(\输入数字选择|\\n\printf(\已有帐户登陆|\\n\printf(\新建一个帐户|\\n\

printf(\}

/********************************************************************函数名称:menu4()功能:界面4返回值:无

********************************************************************/voidmenu4(){

printf(\printf(\输入数字选择|\\n\printf(\取款业务|\\n\printf(\查询业务|\\n\printf(\转帐业务|\\n\printf(\修改密码|\\n\

printf(\}

/********************************************************************函数名称:*enter()功能:进入系统

返回值:用户数据地址

********************************************************************/structctm*enter(){

longac;intco;

structctm*now;

printf(\请输入账号\\n\scanf(\now=acread(ac);while(now==NULL){printf(\账号不存在,请重新输入\\n\now=acread(ac);}

printf(\请输入密码\\n\scanf(\while(now->co!=co){printf(\密码错误,请重新输入,退出按

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论