1、精品文档就在这里-各类专业好文档,值得你下载,教育,管理,论文,制度,方案手册,应有尽有-课 程 设 计 说 明 书课程名称: C语言课程设计设计题目: 家庭财务管理院 系: 计算机科学与信息工程学院学生姓名: 任超俊 学 号: 201103040061 专业班级: 软件工程 指导教师: 周晏 2012 年 06 月 11 日课 程 设 计 任 务 书设计题目家庭财务管理学生姓名任超俊所在院系计算机科学与信息工程系学院专业、年级、班、软件工程11级二班设计要求:完成一个家庭财务管理,具体要求如下: 1.添加收入信息 2.查询收入信息3.删除收入信息4.更新收入信息5.添加支出信息 6.查询支出
2、信息 7.删除支出信息8.更新支出信息 9.统计总收入、总支出 10.退出学生应完成的工作:1 学生应认真学习参考程序,理解每个文件、每个函数以及各个变量的作用和意义。在此基础上进一步改进程序,最后正确地运行程序。2对程序进行测试,设计详细的测试计划,然后根据测试计划设计测试用例,对程序进行测试。测试时应注意对各种边缘情况进行测试。3 完成课程设计报告参考文献:1 梁旭等 C程序设计课程设计 电子工业出版社 20112 谭浩强 C程序设计(第四版) 清华大学出版社2010工作计划:1. 小组审题,查阅资料,进行设计前的必要资料准备(2天)。 2. 把程序完整运行出来(3天)。 3. 增加改进程
3、序(2天)。 4. 写课程设计报告(2天)。 5. 提交课程设计报告及答辩(1天)任务下达日期:2011 年 6 月 4 日 任务完成日期:2011 年 6 月 18 日指导教师(签名): 学生(签名):任超俊目 录一 设计要求4二 系统的功能模块4三 数据结构设计描述4四 函数功能及参数说明、相互调用关系6五 各变量的定义和作用6六 各功能模块的算法处理流程图及相关说明7七 改进或增加功能模块说明11八 程序测试14九 程序设计过程中遇到的问题及解决过程16十 课程设计心得及体会17十一 参考文献17十二 源程序17一、设计要求1.要求使用多文件方式实现设计.2.要求在各个文件内实现结构化设
4、计.3.每个模块作为一个单独的C文件.4.宏和数据结构等放在头文件中,并使用条件编译.二、系统的功能模块根据设计要求,通讯录管理系统功能模块如图6-1所示:图6-1 家庭财务管理系统功能模块:家庭财务管系统理系统收入管理支出管理统计退出添加收入查询收入明细删除收入修改收入添加支出查询支出明细删除支出修改支出三、数据结构设计描述(1)自定义枚举类型fi_type,用来表示收入和支出typedef enum _fi_typeincome = 1;/收入payout = -1;/支出fi_type;(2)用来存储家庭财务信息的结构体fi_infotypedef struct _fi_infoint
5、year;/年int month;/月fi_type type;/数据类型char name MAX_NAME;/家庭成员姓名float money;/收入或支出金额char detailMAX_DETAIL;/备注fi_info;(3)存储财务数据结构的结构体fi_datatypedef struct _fi_datafi_info info;/财务数据struct _fi_data *next;/指向下一个节点的指针fi_data;四、 函数功能及参数说明、相互调用关表4-1函数相互调用关系源文件函数名或其他成分功 能finance.cmain总控函数menu_select菜单选择hand
6、le_menu菜单处理newRecords新建学生信息记录quit结束运行add_disp.cshowTable打印表头getIndex按升序排序的位置addRecord在表尾追加信息display显示信息que_remv_modi.cremoveRecord删除制定的记录findRecord查找制定的记录queryInfo查找制定学生的信息copyRecord复制记录modifyRecord修改制定学生信息save_loadsave_loadsave文件储存load文件读取sort.csortInfo排序finance.h常数提供常数结构声明学生成绩结构库函数及函数原型声明引用库函数及函数1
7、、添加收入信息 主菜单中选择1的时候进行台南家收入操作,系统调用add_income()函数来添加收入信息,先建立单链表,函数调用input_info()函数提示用户输入收入信息,并存储到单链表中,输入完成后返回到主菜单界面。2、查询收入明细主菜单中选择2的时候进行查询收入明细操作,系统调用search_income()函数来查询收入明细,调用search_data()函数来完成具体的查询操作。首先提示用户输入要查询的年月,如果用户输入错误,给出输入错误的提示信息,如果用户输入正确,在单链表中查找该年月的收入信息,如果查找成功,按照指定格式显示找到输入信息。每页显示9条收入信息,如果找到输入信
8、息多于9条,按空格键翻页。如果没有找到任何信息,系统给出提示信息。查询成功后提示用户是否继续查询操作,如果用户输入“Y”或“y”,则再次进行查询操作;否则,返回主页界面。4、更新输入信息主菜单中选择4的时候进行更新输入信息操作,调用updare_data()函数进行更新收入操作。首先,提示用户输入要更新收入的年月,然后,根据用户输入的年月信息在单链表中查找相关信息。如果查找成功则调用show_info()函数,显示查找到的收入信息,每页最多显示9条信息;如果查找到的收入信息多余9条,则按空格键翻页,最后提示用户输入要更新的收入信息的序号,调用input_info()函数,输入更新的收入信息,完
9、成更新的操作。如果查找不成功,则给出相应的提示信息。更新操作结束后,提示用户是否进行继续更新操作,如果用户输入“Y”或“y”,则再次进行查询操作;否则,返回主菜单界面。5、添加指出信息主菜单中选择5的时候进行添加支出操作,系统调用sdd_income()函数来添加支出信息。添加支出信息的操作与添加收入信息的操作相似。6、查询支出明细主菜单中选择6的时候进行查询支出明细的操作,系统调用search_income()函数来查询支出明细,调用search_data()函数来完成具体的查询操作。查询支出明细的操作与查询收入明细的操作相似。7、删除支出信息主菜单中选择7的时候进行删除支出信息的操作,调用
10、delete_data()函数进行删除支出的操作。删除支出的操作与收入的操作相似。8、更新支出信息主菜单中选择8的时候进行更新支出信息的操作,调用update_data()函数进行更新支出操作。更新支出操作与更细收入操作相似。9、统计总收入、总支出主菜单中选择9的时候进行统计操作,调用count_total()函数进行总收入、总支出的统计。在单链表中,计算收入和支出的总和,并将两者相减得到家庭收入结余,并按一定的格式显示出来。统计结束后,按任意键返回主菜单界面。10、退出系统主菜单中选择0的时候退出系统,调用quit()函数进行退出操作,首先调用save_to_file()函数,将单链表中的数
11、据保存到文件,在调用clear_data()函数晴空单链表,最后退出系统。家庭财务管理功能模块如图6-1所示。五、各变量的定义和作用#includefinance.h#define MAX_NAME 11/家庭成员姓名最大长度#define MAX_DETAIL 21/备注最大长度#define MENU_COUNT 9/菜单选项个数#define DATA_FILE fs.dat/数据文件文件名2.数据结构定义(1)自定义枚举类型fi_type,用来表示收入和支出typedef enum _fi_typeincome = 1;/收入payout = -1;/支出fi_type;(2)用来存储
12、家庭财务信息的结构体fi_infotypedef struct _fi_infoint year;/年int month;/月fi_type type;/数据类型char name MAX_NAME;/家庭成员姓名float money;/收入或支出金额char detailMAX_DETAIL;/备注fi_info;(3)存储财务数据结构的结构体fi_datatypedef struct _fi_datafi_info info;/财务数据struct _fi_data *next;/指向下一个节点的指针fi_data;除此之外还有部分函数内部变量,用作循环和判断条件。家庭财务管理系统应用软
13、件给家庭成员提供一个管理家庭财务的平台,系统采用的开发工具是Visual C+6.0,主要用于系统可以对家庭成员提供的收入和支出进行增加、删除、修改和查询等操作,并能统计总收入和总支出。其主要功能需求描述如下:(1) 系统主菜单界面 允许用户选择想要进行的操作,包括输入收入管理、支出管理、统计和退出系统等操作。其中收入管理包括添加收入、查询收入明细、删除收入和修改收入操作,指出管理包括添加指出、查询指出明细、删除支出明细和修改支出明细的操作。统计是对总收入和总支出进行统计操作。(2) 添加收入处理 用户根据提示,输入要添加的收入信息,包括收入的日期(要求4位的年和月份)、添加收入的家庭成员、收
14、入的金额及备注信息。输入完一条收入记录,将其暂时保存在单链表中,返回到主菜单界面。(3) 查询收入明细处理 根据用户输入的年月信息在单链表中查找收入信息,如果查询成功,按照预定格式显示该收入明细。如果没有数据,则给出相应的提示信息。查询结束后,提示用户是否继续查找,根据用户的输入进行下一步的操作。删除收入处理 首先提示用户输入要删除的年月,根据用户的输入在单链表中查询。(4) 提示用户输入对应的序号,删除该收入信息,用户输入对应的序号就删除相关的收入信息,并给出删除成功的提示信息。用户输入其他键则重新进行删除操作。(5) 修改收入处理 首先提示用户输入要进行修改收入的年月,如果单链表中有该收入
15、信息存在,则提示用户输入要修改的收入日期、家庭成员姓名、收入金额及备注等信息,并将修改结果重新储存在单链表中。如果没有和找到要修改的收入信息,系统将给出提示信息。(6) 添加支出处理 完成用户支出信息的添加,与添加收入信息相似。(7) 查询住处明细处理 查询支出信息,与查询收入明细处理相似。(8) 删除支出处理 删除支出信息,与删除收入信息相似。(9) 修改支出信息 修改支出信息与修改收入信息相似。(10) 统计总收入和总支出处理 计算单链表中所有的收入的总和和所有支出的总和,并将两者相减,得到家庭收入的结余。(11) 退出 退出系统。六、各功能模块的算法处理流程图及相关说明七、改进或增加功能
16、模块说明(1) 查询处理函数功能:收入和支出的查询操作。处理流程:提示用户按照指定格式输入要查询的年月,如果用户输入错误,给出提示信息;如果用户输入正确,则在单链表中查找该年月的信息。如果查找成功,判断查询结果个数是否小于9,调用函数 show_info() 显示找到的收入信息;如果大于9,按空格进行翻页操作。如果没有找到任何信息,系统给出提示信息。提示用户是否继续查询,如果用户输入“Y”或“y”,则再次进行查询操作;否则,返回主菜单界面。程序清单:void search_data(fi_type type)int year=0;int month=0;fi_data *p=NULL;fi_d
17、ata *result9=NULL;int count=0;char input= ;while(1)printf(请输入要查询的年月(例如:2009/1);if(scanf(%d/%d,&year,&month)!=2)printf(输入错误。n);elsep=head;count=0;menset(result,0,sizeof(fi_data*);while(p!=NULL)if(p-info.year=year&p-info.month=month&p-info.type=type)if(count输入空格并回车翻页。其他键退出。);fflush(stdin);input=getcha
18、r();if(input= )memset(result,0,sizeof(fi_data*);count=0;result=0;resultcount=p;count+;elsebreak;p=p-next;if(count!=0)show_info(result,count);elseprintf(没有查找到数据。n);printf(继续查找其他数据?(y or n);fflush(stdin);input=getchar();if(input=y|input=Y)coutinue;elsebreak;(2)删除处理函数名称:delete_data处理流程:提示用户输入要删除的年月,然后根
19、据用户输入的年月在单链表中查找相关信息。如果查找成功,且查找到的数据小于9,直接调用show_info()函数显示查找到的收入信息;如果查找到的数据大于9条信息,则按空格键翻页。最后提示用户输入要删除的收入信息的序号,完成删除的操作。如果查找不成功,给出相应的提示信息。提示用户是否继续删除操作,如果用户输入“Y”或“y”,则再进行查询操作;否则,返回主菜单界面。程序清单:void delete_data(fi_type type)int year=0;month=0;fi_data*p=NULL;fi_data*pre=NULL:fi_data*result9=NULL;int count=0
20、;char input= ;int i=0;while(1)printf(请输入要查询的年月(例如: 2009/1);if(scanf(%d/%d,&year,&month)!=2)printf(输入错误。n);elsep=head;count=0;memset(result,0,sizeof(fi_data*);while(p!=NULL)if(p-info.year=year&p-info.month=month&p-info.type=type)if(count输入空格并回车翻页。输入对应的序号删除。其他键退出。);fflush(stdin);input=getchar();if(inp
21、ut= )memset(result,0,sizeof(fi_data*);count=0;resultcount=p;count+;elseif(input=1&inputnext;elsepre-next=resulti-next;free(resulti);for(;i删除成功。n);elsebreak;p=p-next;if(count!=0);show_info(result,count);printf(输入对应的序号删除。其他键退出。);fflush(stdin);input=getchar();if(input=1&inputnext;elsepre-next=resulti-n
22、ext;free(resulti);for(;i删除成功。n);elseprintf(没有找到数据。n);printf(继续查找其他数据?(y or n);fflush(stdin);input=getchar();if(input=y|input=Y)coutinue;elsebreak;八、程序测试:1、主界面系统运行后,首先进入主菜单界面,允许用户输入09之间的不同的数字,以实现不同的操作。主菜单界面如图所示。2、添加收入信息进入主菜单界面后,输入数字1进入添加收入信息操作,用户可以根据提示信息输入收入的年月、家庭成员姓名、收入明细和备注信息,输入完后返回主界面。输入信息情况如图67所示
23、。3、查询收入明细如果在主菜单界面中输入数字3,则进行删除收入信息操作,系统提示输入要查询的年月,如果查询成功,系统会将单链表中的收入信息按照预定的格式显示出来,在提示用户输入要删除的收入信息的序号,完成删除操作。删除收入信息的操作在操作界面如图所示。4、删除收入明细如果在菜单中输入3,则进行删除收入信息的操作,系统提示输入要查询的年月,如果查询成功,系统会将单链表中的收入信息按照预定的格式显示出来,在提示用户输入要删除的收入信息的序号,完成删除的操作。删除收入信息的操作界面如图所示:5、 修改输入信息如果在主菜单中输入4,则进行修改收入信息的操作,系统提示输入要查询的年月,如果查询成功,系统
24、会将单链表中的收入信息按照预定的格式显示出来,在提示用户输入要修改的收入信息的序号,用户可以按照系统的提示进行修改的操作。修改收入信息的操作界面如图6-10所示。6、 添加支出信息在主菜单中输入数字5,则进入添加支出信息操作,输入信息情况如图6-11所示。7、 查询支出明细如果在主菜单中输入数字6,则查询支出明细的操作。查询支出明细的操作如图6-12所示。8、 删除支出信息如果在主菜单中输入7,则进行删除支出信息的操作。删除支出信息的操作界面如图6-13所示。9、 修改支出信息在主菜单中输入8,则进行修改支出信息的操作,修改支出信息的操作界面如图6-14所示。10、 统计在主菜单中如果输入9,
25、则进行总收入和总支出的信息的统计操作,操作界面如图6-15所示。6.5小结本章实现了一个简单的家庭财务管理系统,对于系统的分析、设计、创建的全过程进行了详尽的阐述,包括家庭财务管理系统过程中对收入信息的增加、删除、修改和查询等。由于收入和支出的操作流程几乎相同,所以对与相同操作通过调用同一函数,传递的参数不同来完成,有效地实现了代码的重用,也使得程序变的简洁易懂。九、程序设计过程中遇到的问题及解决过程. 1、 对程序整体理解,但在设计过程中,细节问题处理不当,使得整个程序中出现了一些人为的错误。为了要排除这些问题,首先我先对着课本把自己打的程序与书本上的程序进行了一一的对照,然后就是通过问题找
26、到具体是哪里错了,然后对着课本进行修改。 2、把书本上的程序都打到运行环境当中,无法进行,出现了很多的错误和警告。有一个是比较明显的就是delete,运行环境好像是把它当成了库函数,所以在运行的过程当中在delete处总是出现一些系统错误,在没有办法的情况下,就把delete换成了delete1,这样的运行环境就不会把它当成库函数了。从而解决了这个问题。整个环境就可以运行了。3.在刚开始程序设计的时候,不了解什么是组建工程,什么是模块,对于程序设计本身也有不理解的地方,不知道该从何下手。然后我就先认真的看c程序设计课程设计,了解怎样组建工程,理解每个模块的作用,弄清楚参考程序上的逻辑顺序以及如
27、何设计等问题,然后再进行课程设计。十、课程设计心得及体会以前我对计科系应该学的东西基本上就不了解,这是我第一次做课件,虽然不怎么会在过程中遇到了好多困难和迷茫,程序看了一遍又一遍终于搞懂一些,然后就开始敲程序经过检查程序可以运行了,但我感觉在做前面的内容是确实需要耐心和好好理解。不懂得问同学和老师。花费了很长时间。在设计过程中一直都有错误存在,困难重重。遇到困难就开始用大量的时间进行修改以及整理,理出思路。最终将工程调试成功,添加模块成功,而这些成功的瞬间是最快乐最开心的时刻。而且通过这次课程设计我学会了好多东西,觉得自己设计的东西更加接近实际的程序要求。知道团队合作的重要性,知道怎样使团队一
28、起合作构建程序。而且我也了解到了我们也应该去帮助别人,只要我们能够帮助他们的。十一、参考文献:1、旭等 C程序设计课程设计 电子工业出版社 20112、谭浩强 C程序设计(第四版) 清华大学出版社20103、谭浩强著.C程序设计教程.北京:清华大学出版社,2007十二、源程序:#include#include#include/#includefinance.h#define MAX_NAME 11/家庭成员姓名最大长度#define MAX_DETAIL 21/备注最大长度#define MENU_COUNT 9/菜单选项个数#define DATA_FILE fs.dat/数据文件文件名ty
29、pedef enum _fi_typeincome = 1,/收入payout = -1/支出fi_type;typedef struct _fi_infoint year;/年int month;/月fi_type type;/数据类型char name MAX_NAME;/家庭成员姓名float money;/收入或支出金额char detailMAX_DETAIL;/备注fi_info;typedef struct _fi_datafi_info info;/财务数据struct _fi_data *next;/指向下一个节点的指针fi_data;void add_income ();/
30、添加收入void search_income();/查询收入明细void delete_income();/删除收入void update_income();/修改收入void add_payout();/添加支出void search_payout();/查询支出明细void delete_payout();/删除支出void update_payout();/修改支出void count_total();/统计总收入总支出void quit();/退出系统void search_data(fi_type type);/查询处理void delete_data(fi_type type);/
31、删除处理void update_data(fi_type type);/更新处理void initialize();/系统初始化void save_to_file();/将财务数据保存到文件void clear_data();/清空链表中的数据fi_data *get_last();/得到财务数据链表的最后一个节点fi_data *get_previous(fi_data *p);/取得财务数据节点p的前一个节点void input_info(fi_info *info);/输入财务数据信息void show_info(fi_data *p,int count);/显示财务数据fi_data*
32、 head;char menu =n|家庭财务管理系统 |n+-+n|收入管理 |n| 添加收入 |n| 查询收入明细 |n| 删除收入 |n| 修改收入 |n|支出管理 |n| 添加支出 |n| 查询支出明细 |n| 删除支出 |n| 修改支出 |n|统计 |n| 统计总收入总支出 |n+-+n|输入退出系统 |n+-+n;void (* menu_fun)()=quit,add_income,/退出系统search_income,/添加收入delete_income,/查询收入明细update_income,/删除收入add_payout,/修改收入search_payout,/添加支出d
33、elete_payout,/查询支出明细update_payout,/删除支出count_total/统计总支出总收入;int main()int selected=0;initialize();while(selected= 0 & selected请选择要进行的操作(%d - %d):,0,MENU_COUNT);if(scanf(%d,&selected)!=1|selectedMENU_COUNT)printf(输入错误!请选择%d - %d之间的数字!按任意键重试.,0,MENU_COUNT);fflush(stdin);getchar();else menu_funselected
34、();selected=0;void add_income()fi_data *p= (fi_data *)malloc(sizeof(fi_data);memset(p,0,sizeof(fi_data);p-next=NULL;input_info(&(p-info);p-info.type=income;if(head=NULL)head=p;else get_last(head)-next=p;void search_income()search_data(income);void delete_income()delete_data(income);void update_incom
35、e()update_data(income);void add_payout()fi_data*p=(fi_data*)malloc(sizeof(fi_data);memset(p,0,sizeof(fi_data);input_info(&(p-info);p-info.type=payout;if(head=NULL)head=p;elseget_last(head)-next=p;void search_payout()search_data(payout);void delete_payout()delete_data(payout);void update_payout()update_data(payout);void count_total()float total_income=0.0;float total_payout=0.0;fi_data*p=head;while(p!=NULL)if(p-info.type=income)total_income+=p-info.money;elsetotal_payout+=p-