1、第二组家庭财务管理系统中北大学数 据 结 构课 程 设 计 说 明 书学生姓名:李晓晨学 号:04学生姓名:文巧丽学 号:10学生姓名:梁振宁学 号:26学生姓名:闫梦彪学 号:27学 院:信息商务学院专 业:10060342X题 目:家庭财务管理指导教师武瑞娟,贾美丽2011 年 11月28日1 设计目的家庭财务系统主要对家庭的各项财务收支管理进行在计算机上的信息存储和处理,从而简化用户的工作量。该系统使普通家庭对于一般的家庭财务,例如:记录家庭每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小
2、到大进行排序,可以根据输入的月份查询每月的收支情况。2. 设计内容家庭财务管理系统是为用户进行家庭成员的收支构成及信息管理进行辅助的应用软件,设计内容大致如下:(1) 增加家庭成员收支信息:用户根据提示输入增加的项目,如:年、月、日、项目、数目。可一次性输入多条家庭成员的收支信息记录,系统将家庭成员收信息记录存储在系统磁盘的文件中,以便进行管理,查找,排序。(2) 修改家庭成员收支信息:用户输入要进行修改,根据提示确定要修改的项,再根据提示确定修改的项目:如:年月日,项目,数目,继续存储在系统的磁盘中。(3) 家庭成员收支排序:该项需求要求根据收支数目用冒泡法进行排序,以便用户对家庭成员收状况
3、有较为直观的了解。(4) 查询家庭成员财务情况:分为按日查询和按月查询两个具体需求,根据用户自己的需求,选择整表输出或按类输出,系统会列出用户所需的信息在该功能中,也提示用户是否需要修改,如果不需要,则返回主界面。3本设计所采用的数据结构1、常量定义#defineA100在排序浏览、删除、修改等功能模块中该常量用于定义数组长度。程序先把要排序或删除、修改的文件中的每条记录存放在数组当中,然后用特定的算法对该数组中的家庭成员信息进行排序、删除、修改等操作。C语言中的数组长度是固定的,并且必须在声明时指定数组的长度,因此用SIZE常量定义该数组的长度,由于财务信息文件的信息量较大,因此定义大小为1
4、00,并可根据需要进行简单更改。inta整体变量a控制函数中的选项,在本程序有好界面中,会输入用户选择的选项,以整形储存在a中。 inti整体变量i用来控制函数中for循环的次数,在函数中,会涉及很多for循环,i用来控制循环次数,以免陷入死循环,或者不循环。2、收支情况信息数据结构 用于存放收支情况的日期、项目、收入或支出方面的信息。structshouzhi/*定义结构体structshouzhi*/intnian;intyue;intri;intxiangmu;intshumu;zhangmu100 由于日期、项目、收入或支出构成用于描述一个有机整体收支情况,为了表明这些字段不是孤立的,
5、而是共同描述一个完整的事物,因此用结构体这种形式来体现。4功能模块详细设计4.1 详细设计思想 4.1.1开发与设计的总体思想 本系统的总体思想基于结构化的程序设计。应用高级语言程序设计中的基本控制结构,如循环和选择,着重实现管理系统的增、改、查等典型的管理功能由于主要实现的是管理系统的增、改、查等典型功能。在软件开发过程中应用了软件工程的基本理论。因此,系统的设计方法是结构化设计方法,开发手段是C语言。 4.1.2系统模块结构图家庭财务管理系统可以分为4个模块:系统增加模块,系统修改模块,系统排序模块,系统查询模块,如图所示:4.1.3 模块设计(一) 系统增加模块1、模块描述对增加财务收支
6、信息功能管理。对增加的操作,会将操作结果保存至数组。2、源文件定义源文件:&p-nian,&p-yue,&p-ri 三个变量用来储存收支情况里的日期&p-xiangmu 这个变量用来储存收支情况里的项目,包括收入和各种支出&p-shumu 这个变量用来储存收支情况里的数目(二) 系统修改模块1、模块描述修改收支信息。输入要修改的项目的日期、项目、数量,在选择要输入要修改的内容的类型,并输入修改的内容,并将操作结果保存至数组。2、源文件定义源文件:&p-nian,&p-yue,&p-ri 三个变量用来储存收支情况里的日期&p-xiangmu 这个变量用来储存收支情况里的项目,包括收入和各种支出&
7、p-shumu 这个变量用来储存收支情况里的数目(三) 系统排序模块 1、模块描述 排序收支信息。原理是冒泡排序,依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实
8、在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。并将操作结果保存至数组。2、源文件定义 源文件: &p-nian,&p-yue,&p-ri 三个变量用来储存收支情况里的日期&p-xiangmu 这个变量用来储存收支情况里的项目,包括收入和各种支出&p-shumu 这个变量用来储存收支情况里的数目系统查询模块(四) 系统查询模块 1、模块描述查询收支信息。让用户选择查询的方式,再根据用户输入的信息,对结构体数组每项遍历和用户所输入的比较,只要相同就输出。2、源文件定义源文件:&p-nian,&p-yue,&p-ri 三个变量用来储存收支情况里的日期&p-xiangmu 这个
9、变量用来储存收支情况里的项目,包括收入和各种支出&p-shumu 这个变量用来储存收支情况里的数目 4.1.4界面设计家庭财务管理系统的界面设计主要遵循方便易用、界面友好的原则,具体设计如下。软件开始界面(1) 系统增加模块系统修改模块(2) 系统排序模块(4)系统查询模块4.2 核心代码#include#include /*这个头文件包含exit函数*/#define A 100 /*定义了结构体数组的大小*/int a; /*整体变量a控制函数中的选项*/int i; /*整体变量i用来控制函数中for循环的次数*/int k=0;char x;struct shouzhi /*定义结构体
10、struct shouzhi*/ int nian; int yue; int ri; /*三个变量用来储存收支情况里的日期*/ int xiangmu; /*这个变量用来储存收支情况里的项目,包括收入和各种支出,*/ int shumu; /*这个变量用来储存收支情况里的数目*/zhangmu100=2011,01,01,0,3500,2011,02,03,0,4000,2011,01,02,2,400,2011,01,12,3,500,2011,01,02,2,500,2011,02,04,2,4400,2011,01,30,1,400,2011,01,02,4,100,2011,02,0
11、4,3,10,2011,01,02,0,1000; /*为结构体数组赋初值*/void zengjia(struct shouzhi *p) /*增加函数*/ printf(请输入日期 (* * *)n); scanf(%d %d %d,&p-nian,&p-yue,&p-ri); /*输入日期*/ printf(请输入项目:n 0 收入n 1 食品消费n 2 房租n 3 子女教育费n 4 水电费n 5 医疗费n 6 储蓄n 7 其他n); scanf(%d,&p-xiangmu); /*输入项目*/ printf(请输入数目:n); scanf(%d,&p-shumu); /*输入数目*/v
12、oid xiugai(struct shouzhi *p,int u) /*修改函数*/ int n,y,r,m,s; /*5个变量用来存储要修改的日期,项目和数目*/ printf(请输入原日期 (* * *)n); scanf(%d %d %d,&n,&y,&r);- printf(请输入原项目:n 0 收入n 1 食品消费n 2 房租n 3 子女教育费n 4 水电费n 5 医疗费n 6 储蓄n 7 其他n); scanf(%d,&m); printf(请输入原数目:n); scanf(%d,&s); for(i=0;inian=n&p-yue=y&p-ri=r&p-xiangmu=m&p
13、-shumu=s) printf(%d.%d.%dn%dn%dn,p-nian,p-yue,p-ri,p-xiangmu,p-shumu); printf(请选择你要修改的选项:n1 日期n2 项目n3 数目n); /*找到后选择要修改的项目*/ scanf(%d,&x); if(x=1) printf(请输入要修改的日期 (* * *)n ); scanf(%d %d %d,&p-nian,&p-yue,&p-ri); printf(%d.%d.%dn%dn%dn,p-nian,p-yue,p-ri,p-xiangmu,p-shumu); /*修改完毕,输出修改完毕的项*/ else if(
14、x=2) printf(请输入要修改的项目:n 0 收入n 1 食品消费n 2 房租n 3 子女教育费n 4 水电费n 5 医疗费n 6 储蓄n 7 其他n); scanf(%d,&p-xiangmu); printf(%d.%d.%dn%dn%dn,p-nian,p-yue,p-ri,p-xiangmu,p-shumu);/*修改完毕,输出修改完毕的项*/ else if(x=3) printf(请输入要修改的数目:n); scanf(%d,&p-shumu); printf(%d.%d.%dn%dn%dn,p-nian,p-yue,p-ri,p-xiangmu,p-shumu); /*修改
15、完毕,输出修改完毕的项*/ else if(x!=1&x!=2&x!=3) printf(输入错误,请重新输入n);/*没找到所要查询的结构体,输出这句话*/ void chaxun(struct shouzhi *p) /*查询函数*/ int n,y,r,m,i,w; /*5个变量用来存储要修改的日期,项目和数目*/ char x; printf(1.日收支报表n2.月收支报表n); scanf(%d,&a); if(a=1) /*查询日收支报表*/ printf(1.整表输出n2.按类输出n); scanf(%d,&w); if(w=1) /*整表输出*/ printf(请输入要查询的年
16、月日(* * *)n); scanf(%d %d %d,&n,&y,&r); /*输入完毕要查询的年月日*/ for(i=0;inian=n&p-yue=y&p-ri=r) printf(年月日:%d.%d.%dn项目:%dn数目:%dn,p-nian,p-yue,p-ri,p-xiangmu,p-shumu); /*查找完毕,输出所查找到的项*/ else if(w=2) /*按类输出*/ printf(请输入要查询的年月日(* * *)n); scanf(%d %d %d,&n,&y,&r); printf(请输入要查询的项目:n 0 收入n 1 食品消费n 2 房租n 3 子女教育费n
17、4 水电费n 5 医疗费n 6 储蓄n 7 其他n); scanf(%d,&m); /*输入完毕,开始查询*/ for(i=0;inian=n&p-yue=y&p-ri=r&p-xiangmu=m) /*当年月日,项目都相同时进行一下操作*/ printf(年月: %d.%d.%d n项目: %dn数目:%dn,p-nian,p-yue,p-ri,p-xiangmu,p-shumu); /*查找完毕,输出所查找到的所有项*/ else if(a=2) /*查询月收支报表*/ printf(1.整表输出n2.按类输出n); scanf(%d,&a); switch (a) /*整表输出*/ ca
18、se 1:printf(请输入要查询的年月(* *)n); scanf(%d %d,&n,&y); /*输入年月*/ for(i=0;inian=n&p-yue=y) /*找出符合的所有项*/ printf(年月日:%d.%d.%dn项目:%dn数目:%dn,p-nian,p-yue,p-ri,p-xiangmu,p-shumu); /*输出查询到的项*/ break; /*查找完毕,跳出循环*/case 2:printf(请输入要查询的年月项目(* * *)n); /*按类输出*/ scanf(%d %d %d,&n,&y,&m); for(i=0;inian=n&p-yue=y&p-xia
19、ngmu=m) printf(年月日:%d.%d.%dn项目:%dn数目:%dn,p-nian,p-yue,p-ri,p-xiangmu,p-shumu); /*查找完毕,输出所查找到的所有项*/ void paixu(struct shouzhi *p,int u) /*排序函数,用来按从大到小的顺序排列数目*/ int t; int j; for(i=0;iu;i+) /*for循环用控制冒泡排序*/ for(int j=0,o=0;jshumu(p+1+o)-shumu) t=(p+o)-nian; (p+o)-nian=(p+o+1)-nian; (p+o+1)-nian=t; t=(
20、p+o)-yue; (p+o)-yue=(p+o+1)-yue; (p+o+1)-yue=t; t=(p+o)-ri; (p+o)-ri=(p+o+1)-ri; (p+o+1)-ri=t; t=(p+o)-xiangmu; (p+o)-xiangmu=(p+o+1)-xiangmu; (p+o+1)-xiangmu=t; t=(p+o)-shumu; (p+o)-shumu=(p+o+1)-shumu; (p+o+1)-shumu=t; /*冒泡排序*/ void main() /*主函数整合其他函数*/struct shouzhi *q=&zhangmu3,*p=&zhangmu0; int
21、 j,u=10;for(i=0;iA;) /*for循环开始执行家庭财务管理系统*/ printf(欢迎使用家庭财务管理系统n); printf( 0 退出n); printf( 1 增加n); printf( 2 修改n); printf( 3 查询n); /*输出友好界面*/ scanf(%d,&a); switch(a) /*选择其中的项,根据输入的数选择执行一下函数*/ case 0:printf(谢谢使用n); exit(0); /*选择0,退出系统*/ case 1:zengjia(q);u+;i+; paixu(p,u); break; /*增加函数,增加完后i自增一位,控制for循环的次数,u自增一位,控制冒泡排序中排序次数*/ case 2:xiugai(p,u);break; /*修改函数*/ case 3:paixu(p,u);chaxun(p); break; /*查询函数,查询前,先对函数进行排序*/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1