帐目管理系统的设计与实现_第1页
帐目管理系统的设计与实现_第2页
免费预览已结束,剩余30页可下载查看

下载本文档

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

文档简介

1、目录一设计要求 . 2二设计作用与目的 . 2三运行环境及工具软件 .23.1 硬件环境 . 33.2 软件环境 . 3四系统设计 . 34.1系统总体设计 .34.2 程序设计组成框图、流程图 . 34.3 各模块具体设计 . 54.3.1主函数模块设计 . 54.3.2 创建函数模块 .64.3.3 查看函数模块 .84.3.4 开户函数模块 .84.3.5 销户函数模块 . 104.3.6 修改帐目函数模块 . 114.3.7查询函数模块 . 12五源程序设计 . 14六实验调试结果 . 26七设计中的问题及解决方法 . 29八设计心得. 29九参考文献. 30帐目管理系统的设计与实现一

2、、 设计要求此处的账目管理是整个银行业务中的一小部分,主要包括借款、还款、存款业务。同 时,通过帐目管理系统的设计,运用计算机软件软件基础所学的知识,提高编程兴趣与编 程思路,合理的运用资料,实现理论与实际相结合。(1) 为 了管理账户,设置两个单链表:一是账户基本信息,包括账户的账号、姓名、 身份证号、建账日期等信息;另一个是账户余额,包括账户的账号和当前余额两项数据。(2) 本程序能够执行账户的开户、借款、还款、存款、清户(删除)等操作,而且能够实现对账户信息的查询统计功能、按借款户的余额从大到小排序功能、按存款户的余额从 大到小排序功能和按开户日期从小到大排序功能等。(3) 开 新户时,

3、用户只输入姓名、身份证号、金额、日期四个数据,由程序自动生成 帐号并通知用户,并将相关数据同时插入上述两个链表中;(4) 余 额为负数表示借款额,为正数表示存款额。(5) 能 够按账号查询账户的基本信息和当前余额,能够列出最大借款额账户和最大存 款额账户的基本信息和当前余额。(6) 程 序能够统计当前帐户个数,当前借款总额、当前还款总额以及借款总额与存款 总额的差额。(7) 收集资料,全面分析课题,分解问题,形成总体编程思路;(8) 深入分析各个小问题,编写各部分程序模块;(9) 对于设计中用到的关键函数,要联系问题进行具体介绍;(10)上机调试,确保程序能正确运行,完成设计报告,并进行答辩。

4、二、设计作用与目的(1)通过设计,强化C语言的运用及C语句的准确掌握;2)通过设计,加强我们对计算机软件软件基础知识的理解和运用;3)通过设计,掌握设计软件一般方法,了解软件设计的一般思路;4)通过设计,锻炼撰写报告的水平三、运行环境及工具软件3.1 硬件环境设备:采用Intel应用服务器 运行时内存要求:1MB;安装所需硬盘:2MB;3.2 软件环境操作系统:Win dows 2000/XPista工具软件:MyTC四、系统设计4.1系统总体设计此银行帐目管理系统包括六个模块,分别为创建一个空账目、显示账目信息、添加新 账目、删除账目信息、修改账目信息、查找所需账目信息。其中添加新账目包含姓

5、名、身 份证号、金额、日期四个数据的输入。修改账目信息还包含了借款、存款、取款功能。查 询功能包含查询所存有的账户个数、查询最大存款户、查询最大借款户。功能模块图如图1所示。银行帐目管理系统图 1 银行帐目管理系统模块图4.2 程序设计组成框图、流程图创显建示空账账目目信 息身份证号码删除账目最大存款户最大借款户姓名账户个数开始4.3 各模块具体设计本程序按要求设计一个账目管理系统,编译器为:myTC程序源文件名为zhangmu.c。 程 序 入 口为main()函 数 :先 由fopen()函 数 创 建 一 个 存 储 账 目 信 息 的 文 档 :fopen(D:account.txt,

6、r+);由于进行的“叶“操作,首先在D盘创建一个account.txt文件。4.3.1主函数模块设计主函数用到函数为:fopen(打开文件)相关函数open,fclose表头文件#include定义函数FILE * fopen(const char * path,const char * mode);函数说明参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。mode有下列几种形态字符串:r打开只读文件,该文件必须存在。r+打开可读写的文件,该文件必须存在。w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+打开可读写文件

7、, 若文件存在则文件长度清为零, 即该文件内容会 消失。若文件不存在则建立该文件。a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保 留。a+以附加方式打开可读写的文件。 若文件不存在, 则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会 被保留。由于Dos窗口显示有限,所以限制账目数量为15个本程序包含6大功能模块:为了管理账户,设置两个单链表:一是账户基本信息,包括账户的账号、姓名、身份证号、建账日期等信息;另一个是账户余额,包括账户的账号和当前余额两项数据。本程序只创建了一个单链表:所以在对账

8、户的余额的操作功能上有教大的欠缺,日后定将进一步完善此项功能。4.3.2创建函数模块0- create(FILE *ptr)/*创建具有结构体的空文档*/struct bankdata data=-1,NONAME,NONUM,0,0;对结构体进行初始化操作,即创建 一个空账目。for(num=0;num=15;num+)通过for循环限制账目数量。 本功能模块用到的函数有:fseek(移动文件流的读写位置)相关函数rewind,ftell,fgetpos,fsetpos,lseek表头文件#include0-创建一个空账目;1-显示账目信息;2-添加新账目;3-4-删除账目信息;修改账目信息

9、;5-6-查找所需账目信息;推出程序;struct bankdata /*定义一个结构体*/int num;/*账户的账号*/char name20; /*姓名*/char person_num19; /*身份证号*/float balance; /*金额*/int establishtime; /*日期*/定义函数int fseek(FILE * stream,long offset,int whence);函数说明fseek()用来移动文件流的读写位置。参数stream为已 打开的文件指针,参数offset为根据参数whenee来移 动读写位置的位移数。参数whenee为下列其中一种:SE

10、EK_SE从距文件开头offset位移量为新的读写位置。SEEK_CU以目前的读写位置往后增加offset个位移 量。SEEK_EN将读写位置指向文件尾后再增加offset个位移量。当whenee值为SEEK_CU或SEEK_EN时,参数offset允许负值的出现。下列是较特别的使用方式:1)欲将读写位置移动到文件开头时:fseek(FILE*stream,0,SEEK_SET);2)欲将读写位置移动到文件尾时:fseek(FILE*stream,0,0SEEK_END);返回值 当调用成功时则返回0,若有错误则返回-1,errno会存 放错误代码。附加说明fseek()不像lseek()会返

11、回读写位置,因此必须使用ftell()来取得目前读写的位置。将数据写至文件流)相关函数fopen,fread,fseek,fseanf表头文件#inelude定义函数size_t fwrite(eonst void * ptr,size_t size,size_tnmemb,FILE * stream);函数说明fwrite()用来将数据写入文件流中。参数stream为已打开 的文件指针,参数ptr指向欲写入的数据地址,总共写入 的字符数以参数size*nmemb来决定。fwriteFwrite()会返回实际 写入的nmem数目。返回值返回实际写入的nmem数目。433 查看函数模块1- vi

12、ew(FILE *ptr)/*查看文档内容*/本功能模块用到的函数有:fseek (FILE * stream,long offset,int whence);fread(从文件流读取数据)相关函数fopen,fwrite,fseek,fscanf表头文件#include定义函数size_t fread(void * ptr,size_t size,size_t nmemb,FILE* stream);函数说明fread()用来从文件流中读取数据。参数stream为已打开的 文件指针,参数ptr指向欲存放读取进来的数据空间,读取 的字符数以参数size*nmemb来决定。Fread()会返回实

13、际读 取到的nmem数目,如果此值比参数nmemb来得小, 贝M弋表 可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。返回值返回实际读取到的nmem数目。4.3.4 开户函数模块2- add(FILE *ptr)/*添加一个帐目*/添加账目,输入用户操作,程序设计要求:开新户时,用户只输入姓名、身份证号、金额、日期四个数据,由程 序自动生成帐号并通知用户,并将相关数据同时插入上述两个链表中;本程序账号由人工手动输入。其余项目也有人工输入。fseek(ptr,num*sizeof(struct bankdata),SEEK_SET);fread(&

14、;data,sizeof(struct bankdata),1,ptr);Scanf();fseek(ptr,data.num*sizeof(struct bankdata),SEEK_SET);fwrite(&data,sizeof(struct bankdata),1,ptr);实现对数据的输入,及存储。 通过函数嵌套操作实现对用户身份证号码的格式化操作。getperson_num(char *person_num) /*函数功能:读取用户身份证号码(15位 或者18位)*/图 3 开户功能模块流程图435 销户函数模块3-delete(FILE *ptr)/*删除一个帐目*/通过

15、本功能实现销户操作,销户条件为用户姓名。for(num=0; num =15; nu m+)fseek(ptr,num*(sizeof(struct bankdata)+sizeof(int),SEEK_SET); fread(name2,20,1,ptr);if(strcmp(name1,name2)=0) num1num=num;对输入用户进行查找,并与账目内容进行比较。通过对num2的值进行判断,实现对不同账号下的同一用户进行操作,对未找到用户 的提示。4.3.6 修改帐目函数模块4-modify(FILE *ptr)/*修改帐目*/程序设计要求:本程序能够执行账户的借款、还款、存款操作

16、。 由于单链表在功能实现上的限制,只能通过本功能对三项操作实现同一数据的修改操作。 输入余额为负数表示借款额,为正数表示存款额。本功能对程序的综合能力要求较高,时间有限,待以后进一步完善。图 4 修改账目功能模块流程图437 查询函数模块5- research(FILE *ptr)/*对所需账目内容进行查询*/模块功能流图如下结束图 5 查询模功能模块流程图查询功能包含三项子功能:O-countn/*查询所存有的账户个数*/1-The max. depositor accountn/*查询最大存款户*/2-The max. borrowing accountn/*查询最大借款户*/3-quit

17、en/*退出查询*/能够实现对账户信息的查询统计功能、按借款户的余额从大到小排序功能、按存款户 的余额从大到小排序功能和按开户日期从小到大排序功能等。能够按账号查询账户的基本信息和当前余额,能够列出最大借款额账户和最大存款额账户的基本信息和当前余额。当前借款总额、当前还款总额以及借款总额与存款总额的差额。本程序通过函数嵌套操作,应该可以很好的实现大部分功能,但是,由于指针参数传递过 程中,程序调用总出现问题,个人对指针的学习掌握还不够熟练,所以通过在同一模块下 的判断语句进行选项操作1-操作和2-操作都是用选择排序法,分别找出最大存款户和最大借款户。在冒泡排序、选择排序、快速排序、插入排序等当

18、中选择排序最易理解,运行速度也比较 快。所以用选择排序法进行查找操做。五、源程序设计#i nclude#i nclude structban kdata /* int num;/*账户的账号*/打开界面,进入查询操作:图 6 查询系统界面定义一个结构体*/char name20;/*姓名*/char person_num19;/*身份证号*/float balance;/*金额*/int establishtime;/*日期*/create(FILE *ptr)/*创建具有结构体的空文档*/int num;struct bankdata data=-1,NONAME,NONUM,0,0;for

19、(num=0;num=15;num+)fseek(ptr,num*sizeof(struct bankdata),SEEK_SET);fwrite(&data,sizeof(struct bankdata),1,ptr);printf(Blank accounts have been created completen);view(FILE *ptr)/*查看文档内容*/int num;struct bankdata data;clrscr();/*功 能:清除文本模式窗口 清屏的意思 就是把之前显示出的文字字符去掉*/printf(the accountnum, the accoun

20、t person_name, the person_num, the blankdata, theestableshtimen);for(num=0;num15;num+)fseek(ptr,num*sizeof(struct bankdata),SEEK_SET);fread(&data,sizeof(struct bankdata),1,ptr);printf(%-10d%-16s%-20s%-10f %-15dn,data.num,,data.person_num,data.balance,data.establishtime);add(FILE *ptr)/*

21、添加一个帐目*/int num;struct bankdata data;printf(Enter new account number(0-15):n);scanf(%d,&num);fseek(ptr,num*sizeof(struct bankdata),SEEK_SET);fread(&data,sizeof(struct bankdata),1,ptr);if(data.num!=-1)printf(Account %d already contains informaton.n,num);elseprintf(Enter name.n);scanf(%s,data.

22、name);printf(please put into the person_num: );getperson_num(data.person_num);printf(Enter balance.n);scanf(%f,&data.balance);printf(Enter establishtime.n);scanf(%d,&data.establishtime);data.num=num;fseek(ptr,data.num*sizeof(struct bankdata),SEEK_SET); fwrite(&data,sizeof(structbankdata)

23、,1,ptr);getperson_num(char *person_num) /*函数功能:读取用户身份证号码(15位 或者18位)*/doint i,mark;char ch;for(i=0;i+) /*输入有效性判断(只能是数字)*/ if(ch=getchar()!=n)if(ch=0)person_numi=ch;elsebreak;else break; person_numi=0;if(strlen(person_num)!=15&strlen(person_num)!=18)printf(ID number can only be 15, or 18-bit,the p

24、erson_num should be a num!n);elsebreak;while(1); /*循环以保证读入数据有效*/delete(FILE *ptr)/*删除一个帐目*/int num,num2;int num116=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1;char name120;char name220;struct bankdata blankdata=-1,NONAME,NONUM,0,0;struct bankdata data;printf(Enter delete name.n);scanf(%s,name1);

25、for(num=0;num=15;num+)fseek(ptr,num*(sizeof(struct bankdata)+sizeof(int),SEEK_SET);fread(name2,20,1,ptr);if(strcmp(name1,name2)=0) num1num=num;for(num=0,num2=0;num1) printf(Which account do you want to delete?n);scanf(%d,&num); fseek(ptr,num*sizeof(struct bankdata),SEEK_SET);fwrite(&blankdat

26、a,sizeof(struct bankdata),1,ptr); if(num2=1) fseek(ptr,data.num*sizeof(struct bankdata),SEEK_SET);fwrite(&blankdata,sizeof(struct bankdata),1,ptr);if(num2=0) printf(There is no your name.n);modify(FILE *ptr)/*修改帐目*/int num,num2;int num316=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1;float num

27、1;char name120;char name220;struct bankdata data;printf(Enter modify name.n);scanf(%s,name1);for(num=0;num=15;num+)fseek(ptr,num*(sizeof(struct bankdata)+sizeof(int),SEEK_SET);fread(name2,20,1,ptr);if(strcmp(name1,name2)=0) num3num=num;for(num=0,num2=0;num1)printf(Which account do you want to modify

28、?n);scanf(%d,&num);fseek(ptr,num*sizeof(struct bankdata),SEEK_SET);fread(&data,sizeof(struct bankdata),1,ptr);printf(Enter charge(+) or payment(-)n);scanf(%f,&num1);data.balance+=num1;fseek(ptr,num*sizeof(struct bankdata),SEEK_SET);fwrite(&data,sizeof(struct bankdata),1,ptr);if(num2=

29、1)printf(Enter charge(+) or payment(-)n);scanf(%f,&num1);data.balance+=num1;fseek(ptr,data.num*sizeof(struct bankdata),SEEK_SET); fwrite(&data,sizeof(structbankdata),1,ptr);if(num2=0) printf(There is no your name.n);/*/research(FILE *ptr)/*查询*/FILE *refptr;int num,num2;int count=0;int res_ch

30、oice=0;int arraydata15;int pData15;int i,j,x=0;int n=0;int iTemp;int iPos;struct bankdata data; clrscr();while(res_choice!=3)printf(nEnter your res_choicen/*菜单*/0-countn /*账户个数*/1-The max. depositor accountn 2-The max.borrowing accountn 3-quiten /*退出查询*/ );scanf(%d,&res_choice);if(res_choice=0)f

31、or(num=0;num=15;num+)fseek(ptr,num*sizeof(struct bankdata),SEEK_SET); fread(&data,sizeof(structbankdata),1,ptr);if(data.num!=-1) count+;printf(The accountnumber is%dn,count);else if(res_choice=1) for(num=0;num );/*最大存款户*/*最大借款户*/fread(&data,sizeof(struct bankdata),1,ptr);if(data.balance0) ar

32、raydatan=data.balance;n+; /*编程过程测试用printf(arraydata0=);printf(%10dn,arraydata0); printf(arraydata1=);printf(%10dn,arraydatan-1);*/for(i=0;in;i+) printf(%10dn,arraydatai); for(x=0;xn;x+) iTemp=arraydata0; iPos=x; for(j=x+1;jiTemp) iTemp=arraydataj;iPos=j; arraydataiPos=arraydata0;arraydata0=iTemp;if(

33、arraydata00)printf(The max. depositor account is);printf(%10dn,arraydata0);elseprintf(There is no the max. depositor account);else if(res_choice=2)for(num=0;num15;num+)fseek(ptr,num*sizeof(struct bankdata),SEEK_SET);fread(&data,sizeof(struct bankdata),1,ptr);if(data.balance0) arraydatan=data.bal

34、ance; n+;elsebreak;for(x=0;xn;x+)iTemp=arraydata0;iPos=x;for(j=x+1;jn;j+)if(arraydatajiTemp)iTemp=arraydataj;iPos=j;arraydataiPos=arraydata0;arraydata0=iTemp;if(arraydatax-1 );1-view accountn2-add accountn3-delete accountn4-modify accountn5-research accountn6-quitn);scanf(%d,&choice);switch(choi

35、ce)case 0:create(fptr);break;case 1:view(fptr);break;case 2:add(fptr);break;case 3:delete(fptr);break;case 4:modify(fptr);break;case 5:research(fptr);break;fclose(fptr);return(0);六、实验调试结果首先在D盘创建一个account.txt文件,将程序输入到MyTC中,对源程序进行编译,运行程序:d: ITDOCE lt cbiBrun. ezeFrter ynin*0cieate account 1 uiew accon

36、nt2-add account3-delete account4-nodify account5-reseaich account bquit首次运行,需先进行0操作,创建一个空的账目cr d:WTDOCU*l-tcbinrun_ eseEnt炉youi* choipo0ci*eate account1 uiew account2 add account3 delete acdoumt4 nodify accouot5 research account6 quitIBlank accounts Jiaue been created completeEnter your choice0credi

37、ts acuuurntluiew accountZ-add account3 delete accouiit4 modif y account5 research account6 quit创建空账目后,进行1-操作:小d: XMlDOCU8* 1 t cbin run.eze_ 口X-1NONfiMEHONUH0俪腼腼fi-1NONAMENONUH0.B3B00S8-1NOHAMfNO NUN0.00B0B00-1NONAMEHONUM0.03S0000hlNONAMEHONUHD-1NOHAMENONUH0.0300000-1NONAMENONUH0-丽00000-1NONAMENONUH

38、0-丽00000-1NONAMNONUM3.O3S0000hlNONAMEHONUM0-1NOHAMENONUH0.03000001NONAMENONUN0.03BQB80klNONAMENONUM8c: v-1NONAMENONUM0.09300001NONAMENONUM0.09QQ000Enteyoui* choice!0-create accountL-ylewaccoiuLini t2-addaccounl:3-doloto iGcount4-modiFy account&-reseai*ch accountGb-quit开户时,进行2-操作:2Enter neu account nunbei*(-15?:1EritEF name.yi*please put into the jperson_nuE:ID numberCA only he 15, or lU-bittlie pei*son. nun should be a nuni*34262198S3901860SEnte p JbaLan ce .S00Enter establishtime.0091203再进行1-操作查看:可见,开户成功进行4-操作,执行账户的借款、还款、存款操作。输入余额为负数表示借款额,为正数表 示存款额。Entep modify nane.1U典800迪逊-M

温馨提示

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

评论

0/150

提交评论