1、软件工程年设计题 目: 个人记账系统 院 系: 计算机科学和技术 班 级: 计算机班 学 号: 姓 名: 指导老师: 年 7 月 15 日摘 要本汇报介绍了一个利用C语言知识和DEV C+创建用于个人财务情况管理个人记账系统。在该系统中创建了包含增加、删除、修改、查找、插入、浏览、统计功效总列表,创建序号链接各功效列表,输入收入支出信息情况,增加信息,删除信息,创建累计排序浏览用户可从总体上浏览个人财务信息情况。关键词:C语言,DEV c+,个人记账系统目 录第一章绪论11.1 开发背景及意义11.2 相关技术背景21.3 开发及运行环境4第二章 需求分析52.1 设计目标52.2 功效需求5
2、2.3 可行性分析5第三章 总体设计73.1 设计目标73.2 系统结构设计73.3 系统功效结构图7第四章 具体设计125.1 基础对象设计125.2 系统主程序设计和实现135.3 用户登录功效设计和实现175.4 流水账视图设计和实现205.5 消费结构视图设计和实现235.6 流水账明细视图设计和实现245.7 账户设置功效设计和实现285.8 消费趋势堆栈图设计和实现295.9 系统辅助功效设计和实现30第六章 软件测试346.1 系统测试346.2 性能测试376.3 验收测试37第七章 总结38参考文件40第一章 绪论1.1 开发背景及意义个人理财在中国得到大众认可和金融机构重视
3、是近几年事情。大家对个人理财重视程度,和中国市场经济制度不停完善、资本市场长足发展、金融产品日趋丰富和居民总体收入水平逐年上升等等是分不开。不过比起美、日等发达国家,中国人民对于个人理财了解还处于初级阶段。不过其实理财并不困难,并非非要依靠个人理财专业人士提议才能身体力行。只要了解收支情况、设定财务目标、确定策略、编列预算、实施预算到分析结果这六大步骤,便能够轻松达成个人财务管理。至于要怎样预估收入掌握支出进而检讨改善则有赖于平日财务统计,简单说记账是理财第一步。最近越来越多人含有了记账习惯,在上班族、学生族既定收入稳定情况下,采取“节流”科学理财方法是很实际,也符合个人理财统筹标准。家庭、个
4、人收入支出结构在日益发生改变,单纯地靠在本子上统计收入支出无法满足对于收入支出结构统计分析,所以以个人用户为目标记账软件应运而生。对应多种面向家庭及个人理财软件也越来越多。不过众多个人理财软件操作专业,对于个人用户来说功效过于强大,分析数据用语专业也不易了解。所以开发一个操作简便、统计结果直观并对个人用户理财有参考价值记账软件无疑能为广大个人用户提供方便。在盛行个人理财美国,70%以上家庭全部拥有一套自己理财软件,其中最具影响力理财软件要数Intuit企业开发Quiken和微软企业开发Money这两款软件。现在,Intuit企业已成为世界最大理财软件和理财咨询企业,Quiken也成为全世界用户
5、最多家庭理财软件。欧美家庭平日财务报表,预算,税务处理,银行账目标查询等等全部借助软件各项功效,使用理财软件帮助家庭打理日常财务安排已经成为一件很日常事。但因为金融体制上巨大差异,在欧美国家使用个人家庭理财软件却并没有登陆中国市场。不过中国个人理财服务却刚刚起步,各式各样个人理财软件也如雨后春笋,数不胜数。最少有上百款所谓个人理财软件,但实际上99%是个人写业务小程序,功效比Excel方便一点而已,有加一点报表功效,充其量叫记账软件。假如个人理财软件仅有告诉你“柴米油盐酱醋茶”这种流水账功效,Excel足够了。但真正做到功效强大,技术专业,市场有影响力,而且形成规模,中国只有区区两款,成全部财
6、智和深圳家财通。总而言之,在很快未来家庭使用理财软件也将成为中国家庭必需品。能提供简单明了功效及操作记账软件更是被广泛需要。这种软件也会为提升大家生活质量发挥它最大效用。1.2 相关技术背景C语言是中国外广泛使用一个计算机语言,学会使用C语言进行程序设计是计算机工作者一项基础功。对于我们大学生来说,学习这么一门“C程序设计教程”更是必需。本课程设计“家庭财务管理系统”就是经过学习C程序设计采取Visual C+作为编译环境,是程序编译和运行。本系统总体思想基于结构化程序设计。应用高级语言程序设计中基础控制结构,如循环和选择,着重实现管理系统增、删、改、查等经典管理功效因为关键实现是管理系统增、
7、删、改、查等经典功效。程序设计是一门实践性很强课程,既要掌握概念,又要动手编译,还要上机调试运行,经过这一次课程设计我们从实践中更深入学习和了解C语言,当然因为我们技术水平有限,在这途中碰到很多问题,程序也未能做到很完美,望见谅!1.3 开发及运行环境开发工具:DEV c+ 运行环境:WindowsXP/WindowsVista/Win7第二章 需求分析需求分析是指了解用户需求,就软件功效和用户达成一致,估量软件风险和评定项目代价,最终形成开发计划一个复杂过程。需求分析就是分析软件用户需求是什么。假如投入大量人力、物力、财力和时间开发出软件却不被人需要,那么全部投入全部是徒劳。本章将具体叙述对
8、于个人记账系统需求分析。以使得本系统能够尽可能地满足大多数个人用户统计日常收支需要。2.1 设计目标为了做出满足个人用户需要符合质量要求系统,制订以下设计目标: 对于日常收入设parents,school,labor,others分类统计收入。 对于日常支出设clothes,food,house,travel,else分类统计2.2 功效需求 为满足用户需要,要求本系统有以下功效: 统计日常收支情况功效。 查找某天收支情况功效。 插入忘记收支功效。 显示账单功效。 统计功效。2.3 可行性分析本课题是基于环境,实现记账系统开发。为了使本设计更具可行性,本系统设计严格根据软件工程设计思想要求,首
9、先对系统进行了可行性分析。为了使分析更为清楚、完整,设计本系统时,将可行性分析分为经济可行性、操作可行性、技术可行性三个方面进行分析。1.经济上可行性:是无偿开源软件,使得开发成本大大下降。而且可重用性高,节省了二次开发费用。资源利用率高,成本低。从成本效益角度考虑十分可行。2.操作上可行性:该设计模块界面简练,方便快捷,简单易学。即便电脑初学者也能够轻松操作全部系统功效。并不需要掌握繁杂财务专业知识也能够对自己日常收支有一个大致把握。3.技术上可行性:该设计结合了软件工程和会计学两个专业知识,经过相关技术学习和钻研是对大学几年学习内容很好串联。在给定时间一定能完成需求说明要求功效,而且确保软
10、件运行速度及性能均达成用户期望。第三章 总体设计软件总体设计是把需求分析阶段得到需求转变成符合成本和质量要求、抽象系统实现方案过程。从需求分析到总体设计,是一个逐步扩充模型过程。系统总体设计确定实现系统策略和目标系统高层结构。确定设计中类、关联、接口形式及实现操作算法。符合传统面向对象设计准则:模块化,抽象,信息隐藏,低耦合,高内聚。3.1 设计目标本系统为个人用户提供一个统计日常收支情况,并得到对应统计结果平台,关键实现以下目标: 提供日常收支情况统计查看及修改功效。 备份账目信息。3.2 系统结构设计个人记账系统面向用户关键是个人用户,用户只要统计流水账信息便可经过测算得到对应统计结果,结
11、合实际调查其它资料能够得出系统关键功效和辅助功效,并进行主控界面及基础对象设计。依据上述分析,结适用户具体需求,确定系统关键包含四大功效,分别是流水账、统计报表。3.3 系统功效结构图具体系统结构以下图:个人记账系统统计查找流水账流水账排序流水账保留读取文件按金额排序删除流水账新增流水账按时间排序按日期查找按序号查找第四章 具体设计软件具体设计是软件工程关键阶段, 软件具体设计细化了高层体系结构设计,将软件结构中关键部件划分为能独立编码、编译和测试软件单元,并进行软件单元设计,并最终将影响软件实现成败。优异具体设计在提升编码质量、确保开发周期、节省开发成本等各方面全部起着很关键作用,是一个软件
12、项目成功关键确保。本章将根据设计实现次序介绍各个单元设计和实现情况。. 基础对象设计根据面向对象分析和设计方法基础思想,“万物皆对象”,把“对象”作为处理问题重心。依据个人记账系统具体情况分析关键对象有流水账、统计数据等。.流水账对象流水账对象代表用户所统计每一笔账目。每一笔账目信息包含账目发生年月日信息,账目所属消费或收入具体类别,账目名称和金额。.统计数据对象原来其实统计数据对象能够不设置,因为全部统计数据全部能够经过计算得到。不过考虑到用户查询较为频繁,为了避免每次查询均要计算一次,尤其设置了统计数据对象。实际上,用于保留计算结果数据量比较小,牺牲了这些许空间却能换来整个系统高性能,这无
13、疑是很值得。统计数据对象包含了消费结构所需要各项收支统计计算结果。 .系统主程序设计和实现在设计系统主程序时,着重考虑项目标关键功效,并围绕关键功效进行设计。显然本项目标关键功效就是记账。用户需要很方便进行记账活动,而且能够快速看到记账结果。经过反复考虑设计系统主控界面图5-1所表示。.流水账视图设计和实现输入数据创建链表实现代码以下:APtr creat() APtr cPtr; int num;printf(输入序号为0时代表输入统计结束n);printf(输入序号:); scanf(%d,&num); if (num=0) return NULL; else cPtr=(APtr)mal
14、loc(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、othersn 支出有:clothes、food、house、travel、else:); scanf(%s,cPtr-kind); printf(输入余额:); scanf(%f,&cPt
15、r-remain); cPtr-next=creat(); return cPtr; 显示账单实现代码以下:void print(APtr headPtr) if(headPtr=NULL) printf(链表为空n); return; else if (headPtr-next=NULL) printf(%dt%-10st%-5stt%5.2ftt%-10st%5.2fn,headPtr-num, headPtr-date,headPtr-in_out,headPtr-amount,headPtr-kind,headPtr-remain); else printf(%dt%-10st%-5s
16、tt%5.2ftt%-10st%5.2fn,headPtr-num, headPtr-date,headPtr-in_out,headPtr-amount,headPtr-kind,headPtr-remain); print(headPtr-next); 删除统计实现代码以下:APtr del(APtr headPtr) APtr p1;APtr p2; int n,i;char date12; if(headPtr=NULL) printf(no list!); return (headPtr); printf(选择删除方法,输入序号:n); printf(1.按序号删除一条统计n 2.按
17、时间删除一条统计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) /p1num等于n if(p1=headPtr) headPtr=headPtr-next; else p2-next=p1-next; free(p1);printf(删除成功n); else printf(统计不存在,序号错误n); else if(i=2) printf(输入要删除统计日
18、期:); 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); else if(i=3) while(headPtr!=NULL) p1=headPtr; headPtr=headPtr-next; free(p1
19、); printf(删除成功n); return(headPtr); 账单查找实现代码以下:/*4.按num查询*/APtr num_search(APtr headPtr,int num) APtr cPtr; printf(%3st%-10st%-8st%-10st%-10st%-10sn, No.,date,in_out,amount,kind,remain);if (headPtr-num=num) printf(%dt%-10st%-5stt%5.2ftt%-10st%5.2fn,headPtr-num, headPtr-date,headPtr-in_out,headPtr-amo
20、unt,headPtr-kind,headPtr-remain); else cPtr=headPtr; while (cPtr!=NULL&cPtr-num!=num) cPtr=cPtr-next; if (cPtr!=NULL) printf(%dt%-10st%-5stt%5.2ftt%-10st%5.2fn,cPtr-num, cPtr-date,cPtr-in_out,cPtr-amount,cPtr-kind,cPtr-remain); return cPtr; else printf(该条统计不存在n); return cPtr;/*5.按date查询*/void date_s
21、earch(APtr headPtr,char date) APtr cPtr; int m=0; printf(%3st%-10st%-8st%-10st%-10st%-10sn, No.,date,in_out,amount,kind,remain); cPtr=headPtr; while(cPtr!=NULL)if (strcmp(cPtr-date,date)=0)printf(%dt%-10st%-5stt%5.2ftt%-10st%5.2fn,cPtr-num,cPtr-date,cPtr-in_out,cPtr-amount,cPtr-kind,cPtr-remain); m=
22、m+1; cPtr=cPtr-next; if(m=0) printf(该条统计不存在n); 账单排序浏览实现代码以下:void date_sort(APtr *sPtr) APtr pPtr=NULL,cPtr=NULL,t1Ptr=NULL,t2Ptr=NULL; int i,j; for (i=0;inext; for (j=0;jdate,cPtr-date)0&pPtr=*sPtr) pPtr-next=cPtr-next; cPtr-next=pPtr; t1Ptr=pPtr; pPtr=cPtr; cPtr=t1Ptr; *sPtr=pPtr; else if (strcmp(p
23、Ptr-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; void amount_sort(APtr *sPtr) APtr pPtr=NULL,cPtr=NULL,t1Ptr=NULL,t2Ptr=NULL; int i,j; for (i=0;inext; for (j=0;jamou
24、ntcPtr-amount&pPtr=*sPtr) pPtr-next=cPtr-next; cPtr-next=pPtr; t1Ptr=pPtr; pPtr=cPtr; cPtr=t1Ptr; *sPtr=pPtr; else if (pPtr-amountcPtr-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-n
25、ext; 统计实现代码以下:/*9.统计各类数据*/void Stat(APtr headPtr)int choice;char IO4,kind30,date12;printf(请选择项目序号:n);printf(1总收入和总支出n 2各门类总计统计n 3月度总计n 4各门类多占总量百分比n); scanf(%d,&choice);switch(choice) case 1:printf(计算总收入请输入in,计算总支出请输入outn); scanf(%s,IO); IO_total(headPtr,IO); break; case 2: printf(统计收入输入in,统计支出输入out:
26、); scanf(%s,IO); printf(请输入要统计kind类型:); scanf(%s,kind); kind_total(headPtr,kind,IO); break; case 3: printf(统计收入输入in,统计支出输入out:); scanf(%s,IO); printf(请输入要统计年月,格式*.*:); scanf(%s,date); mon_total(headPtr,date,IO); break; case 4:printf(统计收入输入in,统计支出输入out:); scanf(%s,IO); printf(请输入要统计kind类型:); scanf(%s
27、,kind); proportion(headPtr,kind,IO); break;/*各门类总计统计*/float kind_total(APtr headPtr,char kind,char IO)FILE *fp;float sum=0;char str20; APtr cPtr=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统计结果为:%fn,kind,IO,sum);print
28、f(保留结果,输入要保留文件名:);scanf(%s,str); if(fp=fopen(str,a)=NULL) printf(文件打不开,无法保留n); elsefprintf(fp,%s,The result is );fprintf(fp,%st%st%fn,kind,IO,sum); printf(保留成功n); return sum;/*总收入总支出*/float IO_total(APtr headPtr,char IO)float sum=0;char str20; APtr cPtr=headPtr;FILE *fp; while(cPtr!=NULL) if(strcmp(
29、cPtr-in_out,IO)=0) sum+=cPtr-amount; cPtr=cPtr-next; printf(%s结果为:%fn,IO,sum); printf(保留结果,输入要保留文件名:);scanf(%s,str);if(fp=fopen(str,a)=NULL)printf(文件打不开,无法保留n);elsefprintf(fp,%s,The result is );fprintf(fp,%st%fn,IO,sum); printf(保留成功n);return sum;/*月度开销*/void mon_total(APtr headPtr,char date,char IO)
30、FILE *fp;char str20; float sum=0; APtr cPtr=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总计为:%fn,date,IO,sum);printf(保留结果,输入要保留文件名:);scanf(%s,str); if(fp=fopen(str,a)=NULL)printf(文件打不开,无法保留n);elsefprintf(fp,%s,The
31、result is );fprintf(fp,%st%st%fn,date,IO,sum); printf(保留成功n);/*各门类所占百分比*/void proportion(APtr headPtr,char kind,char IO)FILE *fp; float pro,a,b;char str20;a=kind_total(headPtr,kind,IO); b=IO_total(headPtr,IO); pro=a/b; printf(%s类所占%s百分比为:%fn,kind,IO,pro);printf(保留结果,输入要保留文件名:);scanf(%s,str); if(fp=f
32、open(str,a)=NULL)printf(文件打不开,无法保留n);elsefprintf(fp,%s,The result is );fprintf(fp,%s/%st%fn,kind,IO,pro); printf(保留成功n);第五章 总结经过本此课程设计,让我更熟练地掌握了C程序设计教程知识,熟悉了一个管理系统利用和操作,熟悉怎样采取 C+作为编译环境,使程序成功编译和运行,能够利用VC语言创建基础表和编辑信息,增加信息,删除信息,修改信息,查找信息和浏览信息。经过对基础表格,编辑,增加,删除,修改,查找,浏览模块链接,生成能操作运行管理系统。此次我们所设计个人记账系统可应用于家庭简单管理,对家庭各组员财务收入,支出进行编辑,增加,删除,修改,累计排序浏览。 在这次课程设计中因为对知识掌握不够熟悉,专业技术水平有限,我碰到很多问题,从程序初步设计,编辑到程序运行,从一开始按模块分工撰写,到各模块链接运行。尤其是程序运行时候,程序出现了一个错误,使整个程序运行不了,我更是在怎样运行程序上思想发生了冲突。总而言之,VC程序设计为我提供了一个相互学习平台,为愈加好地学习这门课程提供了坏境和基础,因为课程设计我愈加全身心投入了该科学习,更能学以致用,这对我来说意义是非凡。参考文件 1谭浩强.C程序设计.北京:清华大学出版社,.黄明.C语言课程设计.北京:电子工业出版社.7