资源描述
HUNAN UNIVERSITY
程序设计训练
报 告
课程 名称 家庭财务管理系统
学生姓名
学生学号
专业班级
指导老师
起 止 时 间
湖南大学课程训练设计汇报
家庭财务管理系统
摘 要
本汇报介绍了一个利用C语言知识和Microsoft Visual c++ 6.0创建用于家庭各组员财务情况管理家庭财务管理系统。在该系统中创建了包含增加,删除,修改,查找,浏览功效总列表,包含了输入家庭组员收入信息情况,增加信息,删除信息,修改信息,创建姓名查找和编号查询便于用户查找个人财务情况,创建累计排序浏览用户可从总体上浏览全家庭财务信息情况。
目录
1 绪 论 1
2 问题定义 2
3 可行性分析 2
4 系统需求 4
5 方案设计分析 5
6 系统运行情况 14
7 系统维护 15
8 致谢 15
1 绪 论
家庭财务管理对于每一个家庭来说有着关键意义,伴随科技发达,财务管理由原先手写账本发展到现今电脑系统输入并统计,不仅大大降低了时间和精力,也是财务管理更系统化,便捷化,清楚化,降低金钱上缺失。家庭财务系统关键对家庭各项财务收支管理进行在计算机上信息存放和处理,从而简化用户工作量
本汇报设计家庭财务管理系统关键是负责给家庭组员提供了一个在Windows操作系统上运行管理平台,家庭财务管理者能够对其组员编号、姓名和收入、支出组成进行增加、删除、修改,查找等管理操作,还能够对全家庭财务累计排序浏览。
C语言是中国外广泛使用一个计算机语言,学会使用C语言进行程序设计是计算机工作者一项基础功。对于我们大学生来说,学习这么一门“C程序设计教程”更是必需。本课程设计“家庭财务管理系统”就是经过学习《C程序设计》采取Visual C++作为编译环境,是程序编译和运行。本系统总体思想基于结构化程序设计。应用高级语言程序设计中基础控制结构,如循环和选择,着重实现管理系统增、删、改、查等经典管理功效。程序设计是一门实践性很强课程,既要掌握概念,又要动手编译,还要上机调试运行,经过这一次课程设计我们从实践中更深入学习和了解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、结构体设计
用于存放每个家庭组员序号、姓名、收入、支出、累计方面信息。
typedef struct
{
long no; /*每一组输入编号*/
long Number; /*家庭组员编号*/
char Name[20]; /*家庭组员姓名*/
float in; /*家庭组员收入*/
char intime[10]; /*收入时间*/
float out; /*家庭组员支出*/
char outtime[10]; /*支出时间*/
float sum; /*总计*/
}money;
由编号、姓名、收入、支出组成用于描述一个有机整体——家庭组员财务信息系统,为了表明这些字段不是孤立,而是共同描述一个完整事物,所以用结构体这种形式来表现。
2.函数设计
为实现家庭财务管理系统用了下列自定义函数
tianjiashouzhi(); /*增加组员财务信息统计*/
shanchushouzhi(); /*删除组员财务信息统计*/
xiugaishouzhi(); /*修改组员财务信息统计 */
xingmingchaxun(); /*按组员姓名查询财务信息*/
bianhaochaxun(); /*按组员编号查询财务信息*/
chaxunquanbu(); /*查询全部组员信息*/
家庭财务管理系统
步骤图:
开始
请选择
判定a值
Switch(a)语句
添加财务信息
修改财务信息
退出
浏览全部信息
按编号查询
按姓名查询
删除财务信息
1
添加财务信息
输入你要添加信息文件名
N
请重新输入
判定文件是否打开成功
Y
请依据提醒输入你要添加信息
保留并关闭文件
Y
是否继续
N
结束
2
请依据提醒输入你要删除组员编号
判定文件是否打开成功
输入你要删除信息文件名
删除财务信息
请重新输入
N
Y
N
判定是否存在
请重新输入
Y
是否删除
Y
删除成功 保留剩下文件
Y
N
是否继续
N
保留并关闭文件
结束
3
请重新输入
判定是否存在
请重新输入
是否修改
判定文件是否打开成功
输入你要修改信息文件名
修改财务信息
N
Y
请依据提醒输入你要修改组员编号
N
Y
N
Y
请输入要修改内容
Y
是否继续
保留并关闭文件
N
结束
4
按姓名查看财务信息
请依据提醒输入你要查看组员姓名
输入你要查看信息文件名
判定文件是否打开成功
Y
请重新输入
N
N
请重新输入
判定是否存在
Y
输出该组员财务信息
Y
是否继续
N
保留并关闭文件
结束
系统运行界面:删除家庭组员财务信息
6系统运行情况
1出现问题。
l 刚开始输出时乱码,上网搜了才知道是数据溢出。
l 数据输入和输出结果不一致。
l 删除、修改功效不能准期实现。
2相关处理方法
l 经过不停试验,删除多出结构体;
l 查找错误,严格定义变量类型;
l 不停进行调试及改善。
3现在运行情况
针对一系列运行过程中出现问题,我们进行了对应修改,到现在为止,该管理系统基础上能够正常运行,实现其预期功效管理,但仍有很多能够改善地方。
4系统操作说明
进入系统操作界面后,输入0~~6选择功效。
Ø 选择1
依据系统提醒,添加家庭组员收支信息。
Ø 选择2
依据系统提醒,删除家庭组员收支信息
Ø 选择3
依据系统提醒,修改家庭组员收支信息
Ø 选择4
依据系统提醒,按姓名查找家庭组员收支信息
Ø 选择5
依据系统提醒,按编号查找家庭组员收支信息
Ø 选择6
查看全部家庭组员收支信息。
7系统维护
一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长时期,在这期间会需要程序员来维护这个软件正常工作,所以清楚简练文档是必不可少,而不仅仅是只需要源代码。
总结
经过本此课程设计,让我们更熟练地掌握了《C程序设计教程》知识,熟悉了一个管理系统利用和操作,熟悉怎样采取Visual C++作为编译环境,使程序成功编译和运行,此次我们所设计家庭财务管理系统可应用于家庭简单管理,对家庭各组员财务收入,支出进行增加,删除,修改,按姓名查询,按编号查询和浏览全部家庭组员财务信息。
在这次课程设计中因为对知识掌握不够熟悉,专业技术水平有限,从程序初步设计,编辑到程序运行,从一开始按模块撰写,到各模块链接运行,我碰到很多问题,有过放弃想法,可最终还是坚持到了最终,直到把程序写完,编译调试完成。以后回头看自己结果,即使不轻易,不过心里还是很快乐,毕竟是自己亲手做。经过这次课程设计,我愈加深入地学习了VC语言这门课程,让我学了一个学期知识得以应用,增强了我求知欲望和学习爱好,想对VC语言课程有更多了解。
致谢
很感谢老师一直以来对我们悉心指导,从最初选题,到教导检验进展情况,到程序综合调试,再到最终设计汇报,老师牺牲休息时间给了我们耐心知道和无私帮助,老师这种无私奉献敬业精神令人钦佩,在此我们向老师表示我们最真挚谢意。同时,感谢同学对我帮助,帮助我检验程序错误,调试程序,才有了今天我成功。很感谢大家。
参考文件
visualC++项目案例设计 清华大学出版社.
项目案例导航 科学出版社
还有baidu文库,baidu知道。
程序源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<math.h>
#define SIZE 100
typedef struct
{
long no; /*每一组输入编号*/
long Number; /*家庭组员编号*/
char Name[20]; /*家庭组员姓名*/
float in; /*家庭组员收入*/
char intime[10]; /*收入时间*/
float out; /*家庭组员支出*/
char outtime[10]; /*支出时间*/
float sum; /*总计*/
}money;
void tianjiashouzhi()/*添加财务收支信息统计*/
{
FILE *fp = NULL; /*定义指向文件指针*/
money Tm,ch; /*定义进行操作时临时结构体变量*/
char Da[40],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);
}
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') goto begin;
}
void shanchushouzhi() /*删除家庭组员收支信息统计*/
{
int i,result=0;
long delnum; /*存放要输入要删除家庭组员序号*/
money Tm; /*定义进行操作时临时结构体变量*/
money s[SIZE];
int recNumber; /*原文件中统计数*/
char Da[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') goto begin;
}
/*问询是否删除*/
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<recNumber;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",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");
}
}
}
else
{system("cls");
printf("\n删除失败,原因:用户取消操作\n\n");
}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;/*存放要修改家庭组员序号*/
/*输入各项修改后信息*/
long no,Number;
char Name[20];
float in;
char intime[10];
float out;
char outtime[10];
float sum;
money Tm; /*定义进行操作时临时结构体变量*/
money s[SIZE]; /*SIZE,在shead.h头文件中定义常量,值为100 */
int recNumber;
char Da[40],next;
/*Da存放家庭组员收支信息信息文件名,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",&modnum);
printf("您要修改组员编号是:%ld\n\n",modnum);
while(fread(&Tm,sizeof(money),1,fp)!=(int)NULL) /*读取文件内容,判定是否读取成功*/
{
if(Tm.Number==modnum) /*输入编号和文件内容编号一致*/
{
printf("############################\n");
printf("\n该项内容编号:%ld\n",Tm.no);
printf("\n 组员编号:%ld\n",Tm.Number);
printf("\n 组员姓名:%s\n",Tm.Name);
printf("\n 组员收入:%f元\n",Tm.in);
printf("\n 收入时间:%s\n",Tm.intime);
printf("\n 组员支出:%f元\n",Tm.out);
printf("\n 支出时间:%s\n",Tm.outtime);
printf("\n 收支总和:%f\n",Tm.sum);
printf("############################\n");
result=1;
}
}
rewind(fp); /*把文件指针指向文件开头*/
if(result==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=in-out;
/*将文件中要修改信息存入结构体数组*/
recNumber=0;
/*循环将文件数据读入结构体数组,
如文件中数据家庭组员内容编号和要修改家庭组员内容编号不符,则原样写入数组,
如文件中数据家庭组员内容编号和要修改家庭组员内容编号匹配,
则依据输入各项修改内容重新赋值,即修改,并写入数组*/
while((fread(&Tm,sizeof(money),1,fp))!=(int)NU
展开阅读全文