《C语言课程设计报告-家庭财务管理系统.doc》由会员分享,可在线阅读,更多相关《C语言课程设计报告-家庭财务管理系统.doc(38页珍藏版)》请在课桌文档上搜索。
1、-HUNAN UNIVERSITY程序设计训练报告课程名称家庭财务管理系统摘要本报告介绍了一个运用C语言知识和Microsoft Visual c+ 6.0创立的用于家庭各成员财务情况管理的家庭财务管理系统。在该系统中创立了包含增加,删除,修改,查找,浏览的功能总列表,包含了输入家庭成员收入信息情况,增加信息,删除信息,修改信息,创立*查找和编号查询便于用户查找个人财务情况,创立合计排序浏览用户可从总体上浏览全家庭财务信息情况。目录1 绪论12问题定义23可行性分析24 系统需求45 方案设计分析56 系统运行情况147 系统维护158 致谢15. z.-1 绪论家庭财务管理对于每一个家庭来说
2、有着重要的意义,随着科技的兴旺,财务的管理由原先的手写账本开展到现今的电脑系统输入并统计,不仅大大减少了时间与精力,也是财务管理更系统化,便捷化,清晰化,减少金钱上的缺失。家庭财务系统主要对家庭的各项财务收支管理进展在计算机上的信息存储和处理,从而简化用户的工作量本报告设计的家庭财务管理系统主要是负责给家庭成员提供了一个在Windows操作系统上运行的管理平台,家庭财务管理者可以对其成员编号、*以及收入、支出构成进展增加、删除、修改,查找等管理操作,还可以对全家庭财务合计排序浏览。C语言是国内外广泛使用的一种计算机语言,学会使用C语言进展程序设计是计算机工作者的一项根本功。对于我们大学生来说,
3、学习这样一门“C程序设计教程更是必要的。本课程设计“家庭财务管理系统就是通过学习C程序设计采用Visual C+作为编译环境,是程序编译和运行的。本系统的总体思想基于构造化的程序设计。应用高级语言程序设计中的根本控制构造,如循环和选择,着重实现管理系统的增、删、改、查等典型的管理功能。程序设计是一门实践性很强的课程,既要掌握概念,又要动手编译,还要上机调试运行,通过这一次的课程设计我们从实践中更进一步的学习和了解C语言,当然由于个人的技术水平有限,在这途中遇到很多问题,程序也未能做到很完美,望见谅!2问题定义家庭财务管理系统的问题定义阶段必须答复的关键问题是:“要解决的问题是什么.不知道问题是
4、什么就试图解决这个问题,显然是盲目的,只会白白浪费时间和金钱,最终得出的结果可能是毫无意义的。尽管确切地定义问题的必要性是十清楚显的,但是在实践中它却可能是最容易被无视的一个步骤。下面就将“家庭财务管理系统要解决的问题做是什么.这个问题做出详细的分析。随着社会主义的不断开展与进步,人们的生活部断完善,家庭的收入和支出也越来越多,当然也不能盲目的追求时尚,高估了自己的能力,这就需要明确自己的收支情况,对家庭财务的来龙去脉有个大致的了解。做到心中有数。经过我分析初步得出以下几个方面是家庭财务管理系统必须要解决的问题,主要包括:1:增加成员财务信息记录2:删除成员财务信息记录3:修改成员财务信息记录
5、4:按成员*查询财务信息5:按成员编号查询财务信息6:查询全部成员信息 3 可行性分析进一步明确系统的目标,规模与功能。对系统开发背景、必要性和意义进展调查分析并根据需要和可能提出拟定开发系统的初步方案与方案。可行性研究是对系统进展全面,概要的分析。此项活动开场时,要对初步调查的结果进展复审,重新明确问题,对所提系统大致规模和目标及有关约束条件论证,并且提出系统的逻辑模型和各种可能方案。当今社会是一个讲求效率的社会,时间就是金钱。开发简单,易于操作的,管理软件不仅可以节省时间,还可以防止浪费人力,物力,提高效率。待开发系统是一个对家庭理财管理系统,简单,易学,将成为家庭理财的的好帮手。并非所有
6、问题都有简单明显的解决方法,事实上,许多问题不可能在预定的系统规模或时间限制之内解决。如果问题没有可行的解,则花费在这项工程上的任何时间、人力、软件资源和经费,都是无谓的浪费。可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能解决。必须时刻记住,可行性研究的目的不是解决问题,而是确定问题是否值得去解决。现从下述三个方面分析家庭理财系统问题的可行性。1技术可行性就技术可行性来说:我们已经学习了VC,具备了开发和维护的实力。因此只要加上认真的编译、测试,这个家庭管理系统绝对可以实现的,开发和维护该系统也是可行的。2经济可行性。就经济可行性来说,由于我们为了学习每个人都有配置很算差不
7、多的个人电脑,并组建了内部局域网,因此硬件上是没有问题的。而软件上由于是自己开发,所以开发及日后的维护费用并不高,在经济条件方面也是允许的。再加上由于家庭财务管理系统是各个家庭管理自己家的的财务,所以他不会涉及联机的,只要在自己家中的计算机按上家庭理财系统就可以使用。操作简单,功能强大。是每个家庭必不可少的好帮手。所以家庭理财系统是很值得开发的一款家庭助手软件。3操作可行性。就操作可行性来说,该系统能够实现家庭理财功能的要求,使家庭成员能够及时、全面的掌握财产的流动情况、财产的使用、收支情况等。能够在很大程度上节省家庭在财产管理方面花费的精力。综上所述,证明我们开发该系统是切实可行的。总结:由
8、于投资效益比远大于100%, 技术、经济、操作都有可行性,可以进展开发。4系统需求1编写目的本需求的编写目的在于研究家庭理财系统软件的开发途径和应用方法。一个好的需求分析可以为以后工作减轻很多不必要的花费。它是软件开过程中最重要的任务之一,如果需求分析完成的不好,这个软件很有可能是没有作用的,所以我们一定要编写好需求分析。2背景及范围本工程的名称:家庭财务管理系统。本工程的任务提出者是很多家庭账务繁琐的家庭本产品能具体化、合理化的管理家庭输入、开支、收入信息记录,用构造化的思维方式去了解计算机的根本工作原理。3确定对系统的综合要求1功能需求:主要功能:提供家庭日常收入、开销的详细情况。账户管理
9、等多项功能。输入要求:数据完整,详实。输出要求:简捷,快速,实时。2意图a. 帮助家庭管理财务信息.b. 为了给家庭人员减轻负担. c. 为了促进国家经济建立的开展.3目标通过本系统软件,能帮家庭成员快速方便的对家庭财务管理、查看等需求操作时方便家庭财务记录管理,使散乱的各种记录,档案能够具体化,直观化、合理化。4使用及范围本软件适用于每个财务复杂的家庭,它是比拟完善的系统管理软件,对家庭财务信息可以随时输入,更改,查看。5背景现在大多数家庭都在为麻烦的财务管理发愁,如果有一个专门管理软件来管理这些账务,岂不为家庭成员减少很多负担.6用户特点本软件的使用对象是家庭成员只要稍微懂得计算机根本操作
10、就可以利用该软件进展所需操作。5方案设计分析1、构造体设计用于存放每个家庭成员的序号、收入、支出、合计方面信息。typedef structlong no; /*每一组输入的编号*/ long Number; /*家庭成员编号*/ char Name20; /*家庭成员*/ float in; /*家庭成员收入*/ char intime10; /*收入时间*/ float out; /*家庭成员支出*/char outtime10; /*支出时间*/float sum; /*总计*/money;由编号、收入、支出构成用于描述一个有机整体家庭成员财务信息系统,为了说明这些字段不是孤立的,而是共
11、同描述一个完整的事物,因此用构造体这种形式来表达。2.函数设计为实现家庭财务管理系统用了以下自定义函数tianjiashouzhi(); /*增加成员财务信息记录*/shanchushouzhi(); /*删除成员财务信息记录*/*iugaishouzhi(); /*修改成员财务信息记录 */*ingmingcha*un(); /*按成员*查询财务信息*/bianhaocha*un(); /*按成员编号查询财务信息*/cha*unquanbu(); /*查询全部成员信息*/家庭财务管理系统流程图:开场请选择判断a的值Switcha语句添加财务信息修改财务信息退出浏览全部信息按编号查询按*查询删
12、除财务信息1添加财务信息输入你要添加信息的文件名N请重新输入判断文件是否翻开成功Y请根据提示输入你要添加的信息保存并关闭文件Y是否继续N完毕2请根据提示输入你要删除的成员编号判断文件是否翻开成功输入你要删除信息的文件名删除财务信息请重新输入NYN判断是否存在请重新输入Y是否删除Y删除成功 保存剩余文件YN是否继续N保存并关闭文件完毕3请重新输入判断是否存在请重新输入是否修改判断文件是否翻开成功输入你要修改信息的文件名修改财务信息NY请根据提示输入你要修改成员的的编号NYNY请输入要修改的内容Y是否继续保存并关闭文件N完毕4按*查看财务信息请根据提示输入你要查看的成员的*输入你要查看信息的文件名
13、判断文件是否翻开成功Y请重新输入NN请重新输入判断是否存在Y输出该成员财务信息Y是否继续N保存并关闭文件完毕系统运行界面:删除家庭成员财务信息6系统运行情况1出现的问题。l 刚开场输出时乱码,上网搜了才知道是数据溢出。l 数据的输入与输出结果不一致。l 删除、修改功能不能如期实现。2相关的解决方法l 通过不断试验,删除多余构造体;l 查找错误,严格定义变量类型;l 不断的进展调试及改良。3目前的运行情况针对一系列运行过程中出现的问题,我们进展了相应的修改,到目前为止,该管理系统根本上可以正常运行,实现其预期的功能管理,但仍有许多可以改良的地方。4系统操作说明进入系统操作界面后,输入06选择功能
14、。 选择1根据系统提示,添加家庭成员收支信息。 选择2根据系统提示,删除家庭成员收支信息 选择3根据系统提示,修改家庭成员收支信息 选择4根据系统提示,按*查找家庭成员收支信息 选择5根据系统提示,按编号查找家庭成员收支信息 选择6查看全部家庭成员收支信息。7系统维护一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长的时期,在这期间会需要程序员来维护这个软件正常工作,因此清晰简洁的文档是必不可少的,而不仅仅是只需要源代码。总结通过本此的课程设计,让我们更熟练地掌握了C程序设计教程的知识,熟悉了一个管理系统的运用和操作,熟悉如何采用Visual C+作为编译环境,使程序成功的编译和
15、运行,此次我们所设计的家庭财务管理系统可应用于家庭的简单管理,对家庭各成员的财务收入,支出进展增加,删除,修改,按*查询,按编号查询和浏览全部家庭成员财务信息。在这次课程设计中由于对知识掌握的不够熟悉,专业技术水平的有限,从程序的初步设计,编辑到程序的运行,从一开场的按模块撰写,到各模块的运行,我遇到很多问题,有过放弃的想法,可最后还是坚持到了最后,直到把程序写完,编译调试完成。后来回头看自己的成果,虽然不容易,但是心里还是很快乐的,毕竟是自己亲手做的。通过这次课程设计,我更加深入地学习了VC语言这门课程,让我学了一个学期的知识得以应用,增强了我求知的欲望和学习的兴趣,想对VC语言课程有更多的
16、了解。致谢非常感谢教师一直以来对我们的悉心指导,从最初的选题,到辅导检查进展情况,到程序综合调试,再到最后的设计报告,教师牺牲休息时间给了我们耐心的知道和无私的帮助,教师的这种无私奉献的敬业精神令人钦佩,在此我们向教师表示我们最诚挚的谢意。同时,感谢同学对我的帮助,帮助我检查程序错误,调试程序,才有了今天我的成功。非常感谢大家。参考文献visualC+工程案例设计清华大学.工程案例导航科学还有百度文库,百度知道。. z.-程序源代码:*include*include*include*include*include*define SIZE 100typedef structlong no; /*
17、每一组输入的编号*/ long Number; /*家庭成员编号*/ char Name20; /*家庭成员*/ float in; /*家庭成员收入*/ char intime10; /*收入时间*/ float out; /*家庭成员支出*/char outtime10; /*支出时间*/float sum; /*总计*/money;void tianjiashouzhi()/*添加财务收支信息记录*/ FILE *fp = NULL; /*定义指向文件的指针*/ money Tm,ch; /*定义进展操作时的临时构造体变量*/ char Da40,ne*t; /*存储财务收支信息的文件名
18、*/ int count=1; /*计算可输入数据的最大范围*/ printf(n 请输入要添加财务收支信息的文件名:); gets(Da);begin:count=1;fp=fopen(Da,ab+); if (fp=NULL) /*判断文件是否成功翻开*/ printf(n 翻开文件 %s 失败!按任意键完毕!n,Da); e*it(0); while(fread(&ch,sizeof(money),1,fp)!=(int)NULL) /*从文件中读取数据并判断是否成功*/ count+; fclose(fp); /*如果成功翻开或创立文件,则提示输入家庭成员序号、收入、支出等相关信息*/
19、fp=fopen(Da,ab+);/*ab+:当文件存在时,追加,当文件不存在时,创立*/printf(输入编号,收入,收入时间,支出,支出时间,输入编号为0时完毕!n); printf(编号不超过九位,*不超过二十个字符。n);while(countSIZE) printf(n对不起,输入的数据量超过最大允许的范围%dn,SIZE); fclose(fp);system(cls); printf(您输入的数据已成功存储在 %s 文件中。n,Da); printf(文件全部内容如下:n); fp=fopen(Da,rb); /*只读方式翻开二进制文件*/ if (fp=NULL) /*判断是否
20、翻开成功*/ printf(n翻开文件%s失败!按任意键完毕!n,Da); e*it(0); while(fread(&Tm,sizeof(money),1,fp)!=(int)NULL) /*从文件中读取数据,是否读取成功*/ printf(*n); printf(成员%ldn,Tm.Number); printf(成员*:%sn,Tm.Name);printf(成员收入:%f元n,Tm.in);printf(收入时间:%sn,Tm.intime);printf(成员支出:%f元n,Tm.out);printf(支出时间:%sn,Tm.outtime);printf(收支总和:%fn,Tm.
21、sum);printf(*n);printf(nn); fclose(fp);/*询问是否继续*/ printf(n是否继续.(是:y/Y; 否:n/N); ne*t=getche();system(cls); putchar(n); if ( ne*t=y|ne*t=Y) goto begin;void shanchushouzhi() /*删除家庭成员收支信息记录*/ int i,result=0; long delnum; /*存放要输入的要删除家庭成员序号*/ money Tm; /*定义进展操作时的临时构造体变量*/ money sSIZE; int reumber; /*原文件中的
22、记录数*/ char Da40,ne*t; FILE *fp; /*fp指针指向存储数据的文件名*/ printf(n请输入存储数据的文件名,按回车键完毕!n); gets(Da);begin: /*以二进制读的方式翻开文件*/ fp=fopen(Da,rb); if (fp=NULL) printf(n翻开文件 %s 失败!按任意键完毕!n,Da); e*it(0); /*输入要删除的家庭成员序号*/ printf(请输入要删除的家庭成员); scanf(%ld,&delnum); printf(您要删除的编号是:%ldn,delnum);while(fread(&Tm,sizeof(mon
23、ey),1,fp)!=(int)NULL) /*从文件中读取数据,是否读取成功*/if(Tm.Number=delnum) printf(该项收支记录如下:n);printf(*n);printf(该项内容%ldn,Tm.no);printf(成员%ldn,Tm.Number);printf(成员*:%sn,Tm.Name);printf(成员收入:%f元n,Tm.in);printf(收入时间:%sn,Tm.intime);printf(成员支出:%f元n,Tm.out);printf(支出时间:%sn,Tm.outtime); printf(收支总和:%fn,Tm.sum);printf(
24、*n);result=1;rewind(fp); /*把文件指针重新指向文件的开头*/if(result=0) printf(n你输入的编号不存在,请确认后重新输入n); printf(n是否继续删除.(是:y/Y;否:n/N); ne*t=getche();system(cls); putchar(n); if ( ne*t=y|ne*t=Y) goto begin; /*询问是否删除*/ printf(n你确定要删除该记录吗.删除后不可恢复!(是:y/Y;否:n/N); ne*t=getche(); putchar(n); if ( ne*t=y|ne*t=Y) system(cls);p
25、rintf(恭喜!该项纪录已成功删除。n); /*将文件*息存入构造体数组*/ /*与要删除的家庭成员序号相匹配的项不写入数组,循环后数组中即为去掉了要删除记录后的剩余记录*/ reumber=0; while(fread(&Tm,sizeof(money),1,fp)!=(int)NULL)/*从文件中读取数据,是否读取成功*/ if(Tm.Number!=delnum) sreumber.no=Tm.no; sreumber.Number=Tm.Number; strcpy(sreumber.Name, Tm.Name); sreumber.in=Tm.in; strcpy(sreumbe
26、r.intime,Tm.intime); sreumber.out=Tm.out; strcpy(sreumber.outtime,Tm.outtime); sreumber.sum=Tm.sum; reumber+; fclose(fp); /*将删除后的剩余构造体记录写入文件*/ fp=fopen(Da,wb+); /*读写方式翻开文件,原文件内容清空*/ if (fp=NULL) printf(n记录文件 %s失败!按任意键完毕!n,Da); e*it(0); for(i=0;ireumber;i+) /*用循环将数据写入文件*/ if(fwrite(&si,sizeof(money),
27、1,fp)!=1) printf(n记录文件 %s 失败!按任意键完毕!n,Da); e*it(0); fclose(fp); /*显示删除财务信息记录后的文件*/printf(是否查看删除后剩下的内容、n);printf(n是否.(是:y/Y;否:n/N); ne*t=getche();system(cls); putchar(n); if ( ne*t=y|ne*t=Y) fp=fopen(Da,rb); /*只读方式翻开文件*/ if (fp=NULL) printf(n翻开文件%s失败!按任意键完毕! n,Da); e*it(0);printf(*n);printf(删除后剩余全部内容
28、是:n);while(fread(&Tm,sizeof(money),1,fp)!=(int)NULL) printf(*n); printf(成员%ldn,Tm.Number); printf(成员*:%sn,Tm.Name);printf(成员收入:%f元n,Tm.in);printf(收入时间:%sn,Tm.intime);printf(成员支出:%f元n,Tm.out);printf(支出时间:%sn,Tm.outtime);printf(收支总和:%fn,Tm.sum);printf(*n); elsesystem(cls);printf(n删除失败,原因:用户取消操作nn);fcl
29、ose(fp); /*询问是否继续*/ printf(n是否继续删除.(是:y/Y;否:n/N); ne*t=getche();system(cls); putchar(n);if ( ne*t=y|ne*t=Y) goto begin;void *iugaishouzhi() /*修改家庭成员收支信息记录*/ int i,result=0; long modnum;/*存储要修改的家庭成员序号*/ /*输入各项修改后信息*/ long no,Number; char Name20; float in;char intime10; float out;char outtime10; float
30、 sum; money Tm; /*定义进展操作时的临时构造体变量*/ money sSIZE; /*SIZE,在shead.h头文件中定义的常量,值为100 */ int reumber; char Da40,ne*t; /*Da存储家庭成员收支信息信息的文件名,ne*t为是否进展下一次操作的选项*/ FILE *fp; /*fp指针指向存储数据的文件名*/ /*输入要进展修改记录的文件名*/ printf(n请输入存储数据的文件名,按回车键完毕!n); gets(Da);begin: fp=fopen(Da,rb); /*只读方式翻开文件*/ if(fp=NULL) printf(n翻开文
31、件 %s 失败!按任意键完毕!n,Da); e*it(0); printf(请输入您要修改的家庭成员的成员); scanf(%ld,&modnum); printf(您要修改的成员编号是:%ldnn,modnum);while(fread(&Tm,sizeof(money),1,fp)!=(int)NULL) /*读取文件内容,判断是否读取成功*/if(Tm.Number=modnum) /*输入的编号和文件内容的编号一致*/printf(*n);printf(n该项内容%ldn,Tm.no);printf(n 成员%ldn,Tm.Number);printf(n 成员*:%sn,Tm.Nam
32、e);printf(n 成员收入:%f元n,Tm.in);printf(n 收入时间:%sn,Tm.intime);printf(n 成员支出:%f元n,Tm.out);printf(n 支出时间:%sn,Tm.outtime);printf(n 收支总和:%fn,Tm.sum);printf(*n);result=1; rewind(fp); /*把文件指针指向文件的开头*/if(result=0)printf(你输入的编号不存在,请确认后重新输入:n);printf(n是否继续.(是:y/Y,否:n/N); ne*t=getche();system(cls); putchar(n); if
33、 (ne*t=y|ne*t=Y) goto begin;else e*it(0);result=0;printf(请输入你要修改的该项内容n);scanf(%ld,&no); /*输入要修改记录的各项内容值*/Number=modnum;printf(输入*,收入,收入时间,支出,支出时间,输入编号为0时完毕!n); printf(成员*:); scanf(%s,Name); printf(成员收入:);scanf(%f,&in);printf(收入时间:); scanf(%s,intime); printf(成员支出:);scanf(%f,&out);printf(支出时间:); scanf
34、(%s,outtime); sum=in-out; /*将文件中要修改的信息存入构造体数组*/ reumber=0; /*循环将文件数据读入构造体数组,如文件中的数据家庭成员内容编号和要修改的家庭成员内容编号不符,则原样写入数组,如文件中数据的家庭成员内容编号和要修改家庭成员内容编号匹配,则根据输入的各项修改内容重新赋值,即修改,并写入数组*/ while(fread(&Tm,sizeof(money),1,fp)!=(int)NULL) /*读取文件内容。是否成功*/ if(Tm.no!=no) /*输入的内容编号和文件内容编号不一致*/ sreumber.no=Tm.no; sreumbe
35、r.Number=Tm.Number; strcpy(sreumber.Name, Tm.Name); sreumber.in=Tm.in;strcpy(sreumber.intime, Tm.intime); sreumber.out=Tm.out;strcpy(sreumber.outtime, Tm.outtime); sreumber.sum=Tm.sum; if(Tm.no=no) /*输入的内容编号和文件内容编号一致*/ sreumber.no=no; sreumber.Number=Number; strcpy(sreumber.Name,Name); sreumber.in=in;strcpy(sreumber.intime,intime); sreumber.out=out;strcpy(sreumber.outtime,outtime); sreumber.sum=sum;result=1;reumber+; fclose(fp); /*将修改后的构造体数组记录写入文件*/ fp=fopen(Da,wb+); /*翻开文件,原文件内容