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