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