个人记账系统课程设计报告.docx
《个人记账系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《个人记账系统课程设计报告.docx(26页珍藏版)》请在冰豆网上搜索。
个人记账系统课程设计报告
个人记账系统课程设计报告
软件工程学年设计
题目:
个人记账系统
院系:
计算机科学与技术
班级:
计算机班
学号:
姓名:
指导教师:
2011年7月15日
摘要
本报告介绍了一个运用C语言知识和DEVC++创建的用于个人财务情况管理的个人记账系统。
在该系统中创建了包含增加、删除、修改、查找、插入、浏览、统计的功能总列表,创建序号链接各功能列表,输入收入支出信息情况,增加信息,删除信息,,创建合计排序浏览用户可从总体上浏览个人财务信息情况。
关键词:
C语言,DEVc++,个人记账系统
Excel足够了。
但真正做到功能强大,技术专业,市场有影响力的,而且形成规模的,国内只有区区两款,成都的财智和深圳的家财通。
总而言之,在不久的将来家庭使用理财软件也将成为国内家庭的必需品。
能提供简单明了的功能及操作的记账软件更是被广泛需要。
这种软件也会为提升人们的生活质量发挥它最大的效用。
1.2相关技术背景
C语言是国内外广泛使用的一种计算机语言,学会使用C语言进行程序设计是计算机工作者的一项基本功。
对于我们大学生来说,学习这样一门“C程序设计教程”更是必要的。
本课程设计“家庭财务管理系统”就是通过学习《C程序设计》采用VisualC++作为编译环境,是程序编译和运行的。
本系统的总体思想基于结构化的程序设计。
应用高级语言程序设计中的基本控制结构,如循环和选择,着重实现管理系统的增、删、改、查等典型的管理功能由于主要实现的是管理系统的增、删、改、查等典型功能。
程序设计是一门实践性很强的课程,既要掌握概念,又要动手编译,还要上机调试运行,通过这一次的课程设计我们从实践中更进一步的学习和了解C语言,当然由于我们的技术水平有限,在这途中遇到很多问题,程序也未能做到很完美,望见谅!
1.3开发及运行环境
开发工具:
DEVc++
运行环境:
WindowsXP/WindowsVista/Win7
第一章需求分析
需求分析是指理解用户需求,就软件功能与客户达成一致,估计软件风险和评估项目代价,最终形成开发计划的一个复杂过程。
需求分析就是分析软件用户的需求是什么。
如果投入大量的人力、物力、财力和时间开发出的软件却不被人需要,那么所有的投入都是徒劳。
本章将详细阐述对于个人记账系统的需求分析。
以使得本系统可以尽可能地满足大多数个人用户记录日常收支的需要。
2.1设计目标
为了做出满足个人用户的需要的符合质量要求的系统,制定以下设计目标:
Ø对于日常收入设parents,school,labor,others分类记录收入。
Ø对于日常支出设clothes,food,house,travel,else分类记录
2.2功能需求
为满足用户需要,要求本系统有以下功能:
Ø记录日常收支情况的功能。
Ø查找某天的收支情况的功能。
Ø插入忘记的收支的功能。
Ø显示账单的功能。
Ø统计的功能。
2.3可行性分析
本课题是基于DEV c++环境,实现记账系统的开发。
为了使本设计更具可行性,本系统的设计严格按照软件工程的设计思想要求,首先对系统进行了可行性分析。
为了使分析更为清晰、完整,设计本系统的时,将可行性分析分为经济可行性、操作可行性、技术可行性三个方面进行分析。
1.经济上可行性:
DEV c++是免费开源的软件,使得开发成本大大下降。
而且可重用性高,节省了二次开发的费用。
资源利用率高,成本低。
从成本效益角度考虑十分可行。
2.操作上的可行性:
该设计的模块界面简洁,方便快捷,简单易学。
即便电脑初学者也可以轻松的操作所有系统的功能。
并不需要掌握繁杂的财务专业知识也可以对自己的日常收支有一个大体的把握。
3.技术上的可行性:
该设计结合了软件工程和会计学两个专业的知识,通过相关技术的学习和钻研是对大学几年学习内容的很好的串联。
在给定的时间一定能完成需求说明要求的功能,并且确保软件运行速度及性能均达到用户期望。
第二章总体设计
软件总体设计是把需求分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。
从需求分析到总体设计,是一个逐渐扩充模型的过程。
系统总体设计确定实现系统的策略和目标系统的高层结构。
确定设计中的类、关联、接口形式及实现操作的算法。
符合传统面向对象设计的准则:
模块化,抽象,信息隐藏,低耦合,高内聚。
3.1设计目标
本系统为个人用户提供一个记录日常收支情况,并得到相应统计结果的平台,主要实现以下目标:
Ø提供日常收支情况记录查看及修改的功能。
Ø备份账目信息。
3.2系统结构设计
个人记账系统面向的用户主要是个人用户,用户只要记录流水账信息便可经过测算得到相应的统计结果,结合实际调查的其他资料可以得出系统的主要功能和辅助功能,并进行主控界面及基本对象的设计。
根据上述分析,结合用户的具体需求,确定系统主要包括四大功能,分别是流水账、统计报表。
3.3系统功能结构图
具体系统结构如下图:
第三章详细设计
软件详细设计是软件工程的重要阶段,软件详细设计细化了高层的体系结构设计,将软件结构中的主要部件划分为能独立编码、编译和测试的软件单元,并进行软件单元的设计,并最终将影响软件实现的成败。
优秀的详细设计在提高编码质量、保证开发周期、节约开发成本等各方面都起着非常重要的作用,是一个软件项目成功的关键保证。
本章将按照设计实现的顺序介绍各个单元的设计与实现情况。
4.1基本对象设计
按照面向对象的分析与设计方法的基本思想,“万物皆对象”,把“对象”作为解决问题的重心。
根据个人记账系统的具体情况分析主要对象有流水账、统计数据等。
1.流水账对象
流水账对象代表用户所记录的每一笔账目。
每一笔账目信息包括账目发生的年月日信息,账目所属的消费或收入的详细类别,账目名称和金额。
2.统计数据对象
本来其实统计数据对象可以不设立,因为全部的统计数据都可以通过计算得到。
但是考虑到用户查询较为频繁,为了避免每次查询均要计算一次,特别设立了统计数据对象。
实际上,用于保存计算结果的数据量比较小,牺牲了这些许的空间却能换来整个系统的高性能,这无疑是很值得的。
统计数据对象包含了消费结构所需要的各项收支的统计计算结果。
4.2系统主程序的设计与实现
在设计系统主程序时,着重考虑项目的核心功能,并围绕核心功能进行设计。
显然本项目的核心功能就是记账。
用户需要很方便的进行记账活动,并且可以快速看到记账结果。
经过反复考虑设计系统的主控界面如图5-1所示。
4.3流水账视图的设计与实现
1.输入数据创建链表
实现代码如下:
APtrcreat()
{
APtrcPtr;
intnum;
printf("输入的序号为0时代表输入记录结束\n");
printf("输入序号:
");
scanf("%d",&num);
if(num==0)
returnNULL;
else
{
cPtr=(APtr)malloc(sizeof(Account));
cPtr->num=num;
printf("输入日期,格式为****.**.**:
");
scanf("%s",cPtr->date);
printf("输入in或out表示收入和支出:
");
scanf("%s",cPtr->in_out);
printf("输入金额:
");
scanf("%f",&cPtr->amount);
printf("输入门类,收入有parents、school、labor、others\n"
"支出有:
clothes、food、house、travel、else:
");
scanf("%s",cPtr->kind);
printf("输入余额:
");
scanf("%f",&cPtr->remain);
cPtr->next=creat();
returncPtr;
}
2.显示账单
实现代码如下:
voidprint(APtrheadPtr)
{
if(headPtr==NULL)
{printf("链表为空\n");
return;}
else
{
if(headPtr->next==NULL)
printf("%d\t%-10s\t%-5s\t\t%5.2f\t\t%-10s\t%5.2f\n",headPtr->num,
headPtr->date,headPtr->in_out,headPtr->amount,headPtr->kind,headPtr->remain);
else
{
printf("%d\t%-10s\t%-5s\t\t%5.2f\t\t%-10s\t%5.2f\n",headPtr->num,
headPtr->date,headPtr->in_out,headPtr->amount,headPtr->kind,headPtr->remain);
print(headPtr->next);
}
}
}
3.删除记录
实现代码如下:
APtrdel(APtrheadPtr)
{
APtrp1;
APtrp2;
intn,i;
chardate[12];
if(headPtr==NULL)
{
printf("nolist!
");
return(headPtr);
}
printf("选择删除方式,输入序号:
\n");
printf("1.按序号删除一条记录\n"
"2.按时间删除一条记录\n"
"3.删除全部记录\n");
scanf("%d",&i);
if(i==1)
{
printf("输入要删除的记录序号:
");
scanf("%d",&n);
p1=headPtr;
while(p1->num!
=n&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->num==n)//p1的num等于n
{
if(p1==headPtr)
{
headPtr=headPtr->next;
}
else
{
p2->next=p1->next;
}
free(p1);
printf("删除成功\n");
}
else
printf("记录不存在,序号错误\n");
}
elseif(i==2)
{printf("输入要删除记录的日期:
");
scanf("%s",date);
p1=headPtr;
while(strcmp(date,p1->date)!
=0&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(date,p1->date)==0)
{
if(p1==headPtr)
{
headPtr=headPtr->next;
}
else
{
p2->next=p1->next;
}
free(p1);
printf("删除成功\n");
}
else
printf("记录不存在\n");
}
elseif(i==3)
{
while(headPtr!
=NULL)
{
p1=headPtr;
headPtr=headPtr->next;
free(p1);
}
printf("删除成功\n");
}
return(headPtr);
}
4.账单查找
实现代码如下:
/*4.按num查询*/
APtrnum_search(APtrheadPtr,intnum)
{
APtrcPtr;
printf("%3s\t%-10s\t%-8s\t%-10s\t%-10s\t%-10s\n",
"No.","date","in_out","amount","kind","remain");
if(headPtr->num==num)
printf("%d\t%-10s\t%-5s\t\t%5.2f\t\t%-10s\t%5.2f\n",headPtr->num,
headPtr->date,headPtr->in_out,headPtr->amount,headPtr->kind,headPtr->remain);
else
{
cPtr=headPtr;
while(cPtr!
=NULL&&cPtr->num!
=num)
{
cPtr=cPtr->next;
}
if(cPtr!
=NULL)
{
printf("%d\t%-10s\t%-5s\t\t%5.2f\t\t%-10s\t%5.2f\n",cPtr->num,
cPtr->date,cPtr->in_out,cPtr->amount,cPtr->kind,cPtr->remain);
returncPtr;
}
else
printf("该条记录不存在\n");
}
returncPtr;
}
/*5.按date查询*/
voiddate_search(APtrheadPtr,chardate[])
{
APtrcPtr;
intm=0;
printf("%3s\t%-10s\t%-8s\t%-10s\t%-10s\t%-10s\n",
"No.","date","in_out","amount","kind","remain");
cPtr=headPtr;
while(cPtr!
=NULL)
{
if(strcmp(cPtr->date,date)==0)
{
printf("%d\t%-10s\t%-5s\t\t%5.2f\t\t%-10s\t%5.2f\n",cPtr->num,
cPtr->date,cPtr->in_out,cPtr->amount,cPtr->kind,cPtr->remain);
m=m+1;
}
cPtr=cPtr->next;
}
if(m==0)
{
printf("该条记录不存在\n");
}
}
5.账单排序浏览
实现代码如下:
voiddate_sort(APtr*sPtr)
{
APtrpPtr=NULL,cPtr=NULL,t1Ptr=NULL,t2Ptr=NULL;
inti,j;
for(i=0;i{
pPtr=*sPtr;
cPtr=(*sPtr)->next;
for(j=0;j{
if(strcmp(pPtr->date,cPtr->date)>0&&pPtr==*sPtr)
{
pPtr->next=cPtr->next;
cPtr->next=pPtr;
t1Ptr=pPtr;
pPtr=cPtr;
cPtr=t1Ptr;
*sPtr=pPtr;
}
else
{
if(strcmp(pPtr->date,cPtr->date)>0)
{
t1Ptr->next=cPtr;
cPtr->next=pPtr;
pPtr->next=t2Ptr;
t1Ptr=pPtr;
pPtr=cPtr;
cPtr=t1Ptr;
}
}
if(cPtr->next!
=NULL)
{
t1Ptr=pPtr;
pPtr=cPtr;
cPtr=cPtr->next;
t2Ptr=cPtr->next;
}
}
}
}
voidamount_sort(APtr*sPtr)
{
APtrpPtr=NULL,cPtr=NULL,t1Ptr=NULL,t2Ptr=NULL;
inti,j;
for(i=0;i{
pPtr=*sPtr;
cPtr=(*sPtr)->next;
for(j=0;j{
if(pPtr->amount>cPtr->amount&&pPtr==*sPtr)
{
pPtr->next=cPtr->next;
cPtr->next=pPtr;
t1Ptr=pPtr;
pPtr=cPtr;
cPtr=t1Ptr;
*sPtr=pPtr;
}
else
{
if(pPtr->amount>cPtr->amount)
{
t1Ptr->next=cPtr;
cPtr->next=pPtr;
pPtr->next=t2Ptr;
t1Ptr=pPtr;
pPtr=cPtr;
cPtr=t1Ptr;
}
}
if(cPtr->next!
=NULL)
{
t1Ptr=pPtr;
pPtr=cPtr;
cPtr=cPtr->next;
t2Ptr=cPtr->next;
}
}
}
}
6.统计
实现代码如下:
/*9.统计各类数据*/
voidStat(APtrheadPtr)
{
intchoice;
charIO[4],kind[30],date[12];
printf("请选择项目序号:
\n");
printf("1总收入和总支出\n"
"2各门类总计统计\n"
"3月度总计\n"
"4各门类多占总量的比例\n");
scanf("%d",&choice);
switch(choice)
{
case1:
printf("计算总收入请输入in,计算总支出请输入out\n");
scanf("%s",IO);
IO_total(headPtr,IO);
break;
case2:
printf("统计收入输入in,统计支出输入out:
");
scanf("%s",IO);
printf("请输入要统计的kind类型:
");
scanf("%s",kind);
kind_total(headPtr,kind,IO);
break;
case3:
printf("统计收入输入in,统计支出输入out:
");
scanf("%s",IO);
printf("请输入要统计的年月,格式****.**:
");
scanf("%s",date);
mon_total(headPtr,date,IO);
break;
case4:
printf("统计收入输入in,统计支出输入out:
");
scanf("%s",IO);
printf("请输入要统计的kind类型:
");
scanf("%s",kind);
proportion(headPtr,kind,IO);
break;
}
}
/*各门类总计统计*/
floatkind_total(APtrheadPtr,charkind[],charIO[])
{
FILE*fp;
floatsum=0;
charstr[20];
APtrcPtr=headPtr;
while(cPtr!
=NULL)
{
if(strcmp(kind,cPtr->kind)==0&&strcmp(IO,cPtr->in_out)==0)
{
sum+=cPtr->amount;
}
cPtr=cPtr->next;
}
printf("%s类的%s统计结果为:
%f\n",kind,IO,sum);
printf("保存结果,输入要保存的文件名:
");
scanf("%s",str);
if((fp=fopen(str,"a"))==NULL)
{
printf("文件打不开,无法保存\n");
}
else
{
fprintf(fp,"%s","Theresultis");
fprintf(fp,"%s\t%s\t%f\n",kind,IO,sum);
printf("保存成功\n");
}
returnsum;
}
/*总收入总支出*/
floatIO_total(APtrheadPtr,charIO[])
{
floatsum=0;
charstr[20];
APtrcPtr=headPtr;
FILE*fp;
while(cPtr!
=NULL)
{
if(strcmp(cPtr->in_out,IO)==0)
{
sum+=cPtr->amount;
}
cPtr=cPtr->next;
}
printf("%s的结果为:
%f\n",IO,sum);
printf("保存结果,输入要保存的文件名:
");
scanf("%s",str);
if((fp=fopen(str,"a"))==NULL)
{
printf("文件打不开,无法保存\n");
}
else
{
fprintf(fp,"%s","Theresultis");
fprintf(fp,"%s\t%f\n",IO,sum);
printf("保存成功\n");
}
returnsum;
}
/*月度开销*/
voidmon_total(APtrheadPtr,chardate[],charIO[])
{
FILE*fp;
charstr[20];
floatsum=0;
APtrcPtr=headPtr;
while(cPtr!
=NULL)
{
if(strcmp(cPtr->in_out,IO)==0&&strncmp(cPtr->date,date,7)==0)
{
sum+=cPtr->amount;
}
cPtr=cPtr->next;
}
printf("%s该月%s总计为:
%f\n",date,IO,sum);
printf("保存结果,输入要保存的文件名:
");
scanf("%s",str);
if((fp=fopen(str,"a"))==NULL)
{
printf("文件打不开,无法保存\n");
}
else
{
fprintf(fp,"%s","Theresultis");
fprintf(fp,"%s\t%s\t%f\n",date,IO,sum);
printf("保存成功\n");
}
}
/*各门类所占比例*/
voidproportion(