




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件工程学年设计题 目: 个人记账系统 院 系: 计算机科学与技术 班 级: 计算机班 学 号: 姓 名: 指导教师: 2011 年 7 月 15 日摘 要本报告介绍了一个运用C语言知识和DEV C+创建的用于个人财务情况管理的个人记账系统。在该系统中创建了包含增加、删除、修改、查找、插入、浏览、统计的功能总列表,创建序号链接各功能列表,输入收入支出信息情况,增加信息,删除信息,创建合计排序浏览用户可从总体上浏览个人财务信息情况。关键词:C语言,DEV c+,个人记账系统目 录第一章绪论11.1 开发背景及意义11.2 相关技术背景21.3 开发及运行环境4第二章 需求分析52.1 设计目标52.2 功能需求52.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 开发背景及意义个人理财在我国得到大众的认可和金融机构的重视是近几年的事情。人们对个人理财的重视程度,与我国市场经济制度不断完善、资本市场长足发展、金融产品的日趋丰富以及居民总体收入水平的逐年上升等等是分不开的。但是比起美、日等发达国家,我国人民对于个人理财的理解还处于初级阶段。但是其实理财并不困难,并非非要依靠个人理财专业人士的建议才能身体力行。只要了解收支状况、设定财务目标、拟定策略、编列预算、执行预算到分析成果这六大步骤,便可以轻松的达成个人的财务管理。至于要如何预估收入掌握支出进而检讨改进则有赖于平日的财务记录,简单的说记账是理财的第一步。最近越来越多的人具有了记账的习惯,在上班族、学生族既定收入稳定的情况下,采取“节流”的科学理财方式是非常实际的,也符合个人理财统筹的原则。家庭、个人的收入支出结构在日益发生变化,单纯地靠在本子上记录收入支出无法满足对于收入支出结构的统计分析,因此以个人用户为目标的记账软件应运而生。相应的各种面向家庭及个人的理财软件也越来越多。但是众多个人理财软件操作专业,对于个人用户来说功能过于强大,分析数据用语专业也不易理解。因此开发一个操作简便、统计结果直观并对个人用户理财有参考价值的记账软件无疑能为广大个人用户提供方便。在盛行个人理财的美国,70%以上的家庭都拥有一套自己的理财软件,其中最具影响力的理财软件要数Intuit公司开发的Quiken和微软公司开发的Money这两款软件。现在,Intuit公司已成为世界最大的理财软件与理财咨询公司,Quiken也成为全世界用户最多的家庭理财软件。欧美家庭平日的财务报表,预算,税务处理,银行账目的查询等等都借助软件的各项功能,使用理财软件帮助家庭打理日常的财务安排已经成为一件很平常的事。但由于金融体制上的巨大差异,在欧美国家使用的个人家庭理财软件却并没有登陆中国市场。但是国内的个人理财服务却刚刚起步,各式各样的个人理财软件也如雨后春笋,数不胜数。至少有上百款的所谓个人理财软件,但实际上99%是个人写的业务小程序,功能比Excel方便一点而已,有的加一点报表功能,充其量叫记账软件。如果个人理财软件仅有告诉你“柴米油盐酱醋茶”这种流水账的功能,Excel足够了。但真正做到功能强大,技术专业,市场有影响力的,而且形成规模的,国内只有区区两款,成都的财智和深圳的家财通。总而言之,在不久的将来家庭使用理财软件也将成为国内家庭的必需品。能提供简单明了的功能及操作的记账软件更是被广泛需要。这种软件也会为提升人们的生活质量发挥它最大的效用。1.2 相关技术背景C语言是国内外广泛使用的一种计算机语言,学会使用C语言进行程序设计是计算机工作者的一项基本功。对于我们大学生来说,学习这样一门“C程序设计教程”更是必要的。本课程设计“家庭财务管理系统”就是通过学习C程序设计采用Visual C+作为编译环境,是程序编译和运行的。本系统的总体思想基于结构化的程序设计。应用高级语言程序设计中的基本控制结构,如循环和选择,着重实现管理系统的增、删、改、查等典型的管理功能由于主要实现的是管理系统的增、删、改、查等典型功能。程序设计是一门实践性很强的课程,既要掌握概念,又要动手编译,还要上机调试运行,通过这一次的课程设计我们从实践中更进一步的学习和了解C语言,当然由于我们的技术水平有限,在这途中遇到很多问题,程序也未能做到很完美,望见谅!1.3 开发及运行环境开发工具:DEV c+ 运行环境:WindowsXP/WindowsVista/Win7第二章 需求分析需求分析是指理解用户需求,就软件功能与客户达成一致,估计软件风险和评估项目代价,最终形成开发计划的一个复杂过程。需求分析就是分析软件用户的需求是什么。如果投入大量的人力、物力、财力和时间开发出的软件却不被人需要,那么所有的投入都是徒劳。本章将详细阐述对于个人记账系统的需求分析。以使得本系统可以尽可能地满足大多数个人用户记录日常收支的需要。2.1 设计目标为了做出满足个人用户的需要的符合质量要求的系统,制定以下设计目标: 对于日常收入设parents,school,labor,others分类记录收入。 对于日常支出设clothes,food,house,travel,else分类记录2.2 功能需求 为满足用户需要,要求本系统有以下功能: 记录日常收支情况的功能。 查找某天的收支情况的功能。 插入忘记的收支的功能。 显示账单的功能。 统计的功能。2.3 可行性分析本课题是基于环境,实现记账系统的开发。为了使本设计更具可行性,本系统的设计严格按照软件工程的设计思想要求,首先对系统进行了可行性分析。为了使分析更为清晰、完整,设计本系统的时,将可行性分析分为经济可行性、操作可行性、技术可行性三个方面进行分析。1.经济上可行性:是免费开源的软件,使得开发成本大大下降。而且可重用性高,节省了二次开发的费用。资源利用率高,成本低。从成本效益角度考虑十分可行。2.操作上的可行性:该设计的模块界面简洁,方便快捷,简单易学。即便电脑初学者也可以轻松的操作所有系统的功能。并不需要掌握繁杂的财务专业知识也可以对自己的日常收支有一个大体的把握。3.技术上的可行性:该设计结合了软件工程和会计学两个专业的知识,通过相关技术的学习和钻研是对大学几年学习内容的很好的串联。在给定的时间一定能完成需求说明要求的功能,并且确保软件运行速度及性能均达到用户期望。第三章 总体设计软件总体设计是把需求分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。从需求分析到总体设计,是一个逐渐扩充模型的过程。系统总体设计确定实现系统的策略和目标系统的高层结构。确定设计中的类、关联、接口形式及实现操作的算法。符合传统面向对象设计的准则:模块化,抽象,信息隐藏,低耦合,高内聚。3.1 设计目标本系统为个人用户提供一个记录日常收支情况,并得到相应统计结果的平台,主要实现以下目标: 提供日常收支情况记录查看及修改的功能。 备份账目信息。3.2 系统结构设计个人记账系统面向的用户主要是个人用户,用户只要记录流水账信息便可经过测算得到相应的统计结果,结合实际调查的其他资料可以得出系统的主要功能和辅助功能,并进行主控界面及基本对象的设计。根据上述分析,结合用户的具体需求,确定系统主要包括四大功能,分别是流水账、统计报表。3.3 系统功能结构图具体系统结构如下图:个人记账系统统计查找流水账流水账排序流水账保存读取文件按金额排序删除流水账新增流水账按时间排序按日期查找按序号查找第四章 详细设计软件详细设计是软件工程的重要阶段, 软件详细设计细化了高层的体系结构设计,将软件结构中的主要部件划分为能独立编码、编译和测试的软件单元,并进行软件单元的设计,并最终将影响软件实现的成败。优秀的详细设计在提高编码质量、保证开发周期、节约开发成本等各方面都起着非常重要的作用,是一个软件项目成功的关键保证。本章将按照设计实现的顺序介绍各个单元的设计与实现情况。. 基本对象设计按照面向对象的分析与设计方法的基本思想,“万物皆对象”,把“对象”作为解决问题的重心。根据个人记账系统的具体情况分析主要对象有流水账、统计数据等。.流水账对象流水账对象代表用户所记录的每一笔账目。每一笔账目信息包括账目发生的年月日信息,账目所属的消费或收入的详细类别,账目名称和金额。.统计数据对象本来其实统计数据对象可以不设立,因为全部的统计数据都可以通过计算得到。但是考虑到用户查询较为频繁,为了避免每次查询均要计算一次,特别设立了统计数据对象。实际上,用于保存计算结果的数据量比较小,牺牲了这些许的空间却能换来整个系统的高性能,这无疑是很值得的。统计数据对象包含了消费结构所需要的各项收支的统计计算结果。 .系统主程序的设计与实现在设计系统主程序时,着重考虑项目的核心功能,并围绕核心功能进行设计。显然本项目的核心功能就是记账。用户需要很方便的进行记账活动,并且可以快速看到记账结果。经过反复考虑设计系统的主控界面如图5-1所示。.流水账视图的设计与实现输入数据创建链表实现代码如下:APtr creat() APtr cPtr; int num;printf(输入的序号为0时代表输入记录结束n);printf(输入序号:); scanf(%d,&num); if (num=0) return NULL; 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、othersn 支出有:clothes、food、house、travel、else:); scanf(%s,cPtr-kind); printf(输入余额:); scanf(%f,&cPtr-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%-5stt%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.按时间删除一条记录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); else if(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); else if(i=3) while(headPtr!=NULL) p1=headPtr; headPtr=headPtr-next; free(p1); 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-amount,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_search(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=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(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; void amount_sort(APtr *sPtr) APtr pPtr=NULL,cPtr=NULL,t1Ptr=NULL,t2Ptr=NULL; int i,j; for (i=0;inext; for (j=0;jamountcPtr-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-next; 统计实现代码如下:/*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:); 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,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);printf(保存结果,输入要保存的文件名:);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(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)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(保存结果,输入要保存的文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论