家庭财务记账系统_第1页
家庭财务记账系统_第2页
家庭财务记账系统_第3页
家庭财务记账系统_第4页
家庭财务记账系统_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计报告设计题目家庭财务记账系统学院:通信与信息工程学院年级:通信1101班组长:组 员:2012年 07 月 07 日 通信与信息工程学院实验报告设计题目:家庭财务记账系统 一、程序设计的要求1、要求设计一个家庭财务的记录系统,记录家庭的收入、支出明细,并且对访问者有权限要求。2、要求写出设计报告,报告中要求写出总体设计框架和详细程序分析。3、6名学生分一组,选出组长共同完成。在报告中各个同学要明确写出自己所做的工作,并由组长认可评定。4、手写及设计方案均用A4制打印以便统一装订成册,并且要求上交电子文本。二、程序设计分组 本小组成员共6个人,可评出一个组长,其中有两人负责在图书管

2、查资料,一人负责写实验报告,剩余4个人每人编辑若干个程序功能,并且在运行无误后交上.。三、程序设计环境 1. 硬件环境:每生一台机2. 软件环境:Vc + 6.04、 总体设计()功能模块设计 1.添加收入信息 主菜单中选择 1的时候进行添加收入操作,系统调用 add_income()函数来添加收入信息,首先建立单链表,函数调用 input_info()函数提示用户输入收入信息,并存储到单链表中,输入完成后返回到主菜单界面。 2.查询收入明细 主菜单中选择 2的时候进行查询收入明细操作,系统调用 search_income()函数来查询收入的明细,调用 search_data()函数来完成具体

3、的查询操作。首先提示用户输入要查询的年月,如果用户输入错误,给出输入错误的提示信息,如果用户输入正确,在单链表中查找该年月的收入信息,如果查找成功,按照指定格式显示找到的收入信息。每页显示 9条收入信息,如果找到的收入信息多余 9条,按空格键翻页。如果没有找到任何信息,系统给出提示信息。查找成功后提示用户是否继续查询操作,如果用户输入“Y”或“y”,则再次进行查询操作;否则,返回主菜单界面。 3.删除收入信息 主菜单中选择 3的时候进行删除收入信息的操作,调用delete_data()函数进行删除收入的操作。首先提示用户输入要删除收入的年月,然后根据用户输入的年月信息在单链表中查找相关信息,如

4、果查找成功调用 show_info()函数显示查找到的收入信息,每页最多显示 9 条信息,如果查找到的收入信息多余 9 条,则按空格键翻页,最后提示用户输入要删除的收入信息的序号,完成删除的操作。如果查找不成功,给出相应的提示信息。删除操作结束后,提示用户是否继续删除的操作,如果用户输入“Y”或“y”,则再次进行查询操作;否则,返回主菜单界面。 4.更新收入信息 主菜单中选择 4 的时候进行更新收入信息的操作,调用update_data()函数进行更新收入的操作。首先,提示用户输入要更新收入的年月,然后,根据用户输入的年月信息在单链表中查找相关信息。如果查找成功则调用 show_info()函

5、数,显示查找到的收入信息,每页最多显示 9 条信息;如果查找到的收入信息多于 9 条,则按空格键翻页,最后提示用户输入要更新的收入信息的序号,调用input_info()函数,输入更新的收入信息,完成更新的操作。如果查找不成功,则给出相应的提示信息。更更新操作结束后,提示用户是否继续进行更新操作,如果用户输入“Y”或“y”,则再次进行查询操作;否则,返回主菜单界面。 5.添加支出信息 主菜单中选择 5 的时候进行添加支出操作,系统调用 add_income()函数来添加支出信息。添加支出信息的操作与添加收入信息的操作相似。 6.查询支出明细 主菜单中选择 6 的时候进行查询支出明细操作,系统调

6、用 search_income()函数来查询支出的明细,调用 search_data()函数来完成具体的查询操作。查询支出明细的操作与查询收入明细的操作相似。 7.删除支出信息 主菜单中选择 7 的时候进行删除支出信息的操作,调用 delete_data()函数进行删除支出的操作。删除支出的操作与删除收入的操作相似。 8.更新支出信息 主菜单中选择 8 的时候进行统计操作,调用 update_data()函数进行更新支出的操作。更新支出的操作与更新收入的操作相似。 9.统计收入、总支出 主菜单中选择 9 的时候进行统计操作,调用count_total()函数进行总收入、总支出的统计。在单链表中

7、,计算收入和支出的总和,并将两者想见得到家庭收入的结余,并按一定的格式显示出来。统计结束后,按任意键返回主菜单界面。 10.退出系统 主菜单中选择 0 的时候退出系统,调用quit()函数进行退出操作,首先调用save-to-file()函数,将单链表中的数据保存到文件,再调用clear_data()函数清空单链表,最后退出系统。家庭财务管理的功能模块如图所示。家庭财务记账系统收入管理支出管理统计退出添加收入查询收入明细删除收入修改收入添加支出查询支出明细删除支出修改支出 家庭财务管理的功能模块(2) 程序处理流程系统的执行应从系统菜单的选择开始,允许用户输入09之间的数值来选择要进行的操作,

8、输入其他字符都是无效的,系统会给出错误的提示信息。若用户输入0,调用quit()退出系统;若输入一,则调用add_income()函数,进行添加输入操作;如输入2,则调用search_income()函数,进行查询收入明细;若输入3,则调用delete_income函数,进行删除收入操作,若用户输入4,则调用update_income函数,修改收入操作;若输入5,则调用add_payout()函数,进行添加支出操作;若输入6,则调用search-payout()函数,进行查询支出明细操作;如输入7,则调用delete_payout(),进行删除支出操作;若输入8,则调用update_payou

9、t()函数,进行修改支出操作;若输入9,则调用counttotal()函数,进行统计总收入、总支出操作。其处理流程入图所示。开始继续查询询继续查询主菜单界面 主菜单界面0退出1添加收入2查询收入明 细3删除收入4修改收入5添加支出6查询支出明 细7删除支出8修改支出 9统计总收入总支 出结束1.添加操作 建立单链表,调用input_info()函数,提示用户输入要添加的收入或支出的信息;并将输入的信息存储到单链表中,输入完成后返回主菜单界面。2.查询操作 提示用户输入查询的年月,如果用户提示错误,则给出相应的出错提示信息;如果用户输入正确,则根据用户输入的数据在单链表中查找收入或支出的信息。如

10、果没有找到,则给出没有数据的提示;如果找到,则判断记录个数是否小于9,如果小于9,直接显示结果,否则提示用户按空格翻页。查询操作的处理流程如图所示。开始用户输入条件 输入正确?提示错误 否 是定义指针p指向头节点提示没有数据结果个数是0?P是NULL? 是 是取得p指向节点的数据 否 否显示结果P的值等于用户输入的条件? P是NULL? 否 是 提示用户按空格键翻页 否 是结果个数<9? 否用户翻页?将p的值添加到结果中 是 是 否提示是否再次查询P=p->next清空结果结果再次查询? 是 否结束2.查询操作 提示用户输入查询删除的年月,如果用户输入错误,则给出相应的出错提示信息

11、;如果用户输入正确,则根据用户输入的数据在单链表中查找收入或支出的信息。如果没有找到,则给出没有数据的提示信息;如果找到,显示找到的记录信息,并提示用户输入序号进行删除操作。删除成功后给出相应的提示信息。删除的处理流程如图所示。开始用户输入条件输入正确?提示错误 否定义指针p指向头节点 是结果个数为0?提示没有数据P是NULL? 是 是取得p指向节点的数据 否P的值等于用户输入的条件?显示结果提示用户按数字键删除数据删除链表中对应的值 否结果个数<9?P是NULL? 是 是 否 否将p的值添加到结果中提示用户按空格键翻页 是用户翻页?P=p->next清空结果 是在结果中删除第i个

12、值 否用户删除第i个? 是 否再次查询? 是 否 结束 4. 修改操作 首先提示用户输入查询的年月,如果用户输入错误,则给出相应的出错提示信息;如果用户输入正确,则根据用户输入的数据在单链表中查找收入或支出的信息。开始如果没有找到,则给出没有数据的提示信息;如果找到,显示找到的记录信息,并提示用户输入序号进行修改操作。修改成功后给出相应的提示信息。修改的处理流程如图所示。 用户输入条件输入正确?提示错误 否定义指针p指向头节点 是结果个数为0?提示没有数据P是NULL? 是 是 否取得p指向节点的数据 否显示结果P的值等于用户输入的条件? 否提示用户按数字键删除数据 是P是NULL?结果个数&

13、lt;9? 否 是将p的值添加到结果中 是 否提示用户按空格键翻页 清空结果用户翻页?P=p->next 是 更新链表中的数据 否用户删除第i个? 是 否再次查询? 是 否结束五详细设计及程序设计(一) 头文件<finance.h> 1.常量定义#define MAX_NAME 11 /*家庭成员姓名最大长度*/#define MAX_DETAIL 21 /*备注最大长度*/#define MENU_COUNT 9 /*菜单选项个数*/#define DATA_FILE "fs.dat" /*数据文件文件名*/2数据结构定义 (1)定义枚举,表示收入和支出

14、typedef enum _fi_typeincome =1,/*收入*/payout =-1/*支出*/fi_type; (2)定义储存家庭财务信息的结构体typedef struct _fi_infoint year;int month;fi_type type;char nameMAX_NAME;float money;char detailMAX_DETAIL;fi_info; (3)定义储存财务数据结构的结构体typedef struct _fi_datafi_info info;struct _fi_data*next;fi_data;3函数声明(1)主菜单对应的处理函数void

15、add_income(); /*添加收入*/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(); /*退出*/(2)主要处理函数void search_data(fi

16、_type type);/*查询处理*/void delete_data(fi_type type);/*删除处理*/void update_data(fi_type type);/*更新处理*/(3)辅助函数void mima();/*密码*/void initialize();/*系统初始化*/void save_to_file();/*数据保存文件*/void clear_data();/*清空链表数据*/fi_data*get_last();/*得到链表数据最后一个节点*/fi_data*get_previous(fi_data*p);/*取前一个节点*/void input_info

17、(fi_info*info);/*输入财务数据信息*/void show_info(fi_data*p,int count);/*显示财务信息*/ (二)模块设计1.文件包含 #include <stdio.h>#include"stdlib.h"#include < string.h >#include <finance.h>2.定义一个头节点fi_data*head;3.常量定义以下是主菜单中要显示的字符。char menu="=n""|家庭财务管理系统 |n""+ +n"&

18、quot;|收入管理 |n""| (1)添加收入 |n""| (2)查询收入 |n""| (3)删除收入 |n""| (4)修改收入 |n""+ +n""|支出管理 |n""| (5)添加支出 |n""| (6)查询支出 |n""| (7)删除支出 |n""| (8)修改支出 |n""| (9)合计 |""+-+n""| (0)退出 |n

19、""+-+n"4.定义函数指针数组 函数指针数组menu_main_func 储存的是主菜单项中10个功能函数的地址,分别对应09菜单项。void (*menu_fun)()=quit,add_income,search_income,delete_income,update_income,add_payout,search_payout,delete_payout,update_payout,;5.主函数int main() int seleted=0;mima();initialize();while(seleted>=0&&selete

20、d<=MENU_COUNT)system("cls");/清屏printf(menu);printf(">请选择要进行的操作(%d-%d)",0,MENU_COUNT);if(scanf("%d",&seleted)!=1|seleted<0|seleted>MENU_COUNT)printf(">输入错误!请选择%d-%d之间的数,按任意键重试。",0,MENU_COUNT);fflush(stdin);getchar();elsemenu_funseleted();sele

21、ted=0;6.主菜单对应的处理函数 (1)添加收入函数名称:add_income函数功能:用户在主菜单中选择1的时候调用此函数,用来添加收入信息的操作。处理流程:首先建立链表,调用input_info()函数,提示用户输入输入信息,并将输入的信息储存到单链表中,输入完成后返回到主菜单界面。程序清单: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=i

22、ncome;if(head=NULL)head=p;elseget_last(head)->next=p;(2)查询收入明细函数名称:search_income函数功能:用户在主菜单中选择2的时候调用此函数,用来查询收入明细的操作,函数中调用search_data()来完成收入明细的查询。程序清单:void search_income()search_data(income);(3)删除收入函数名称:delete_income函数功能:用户在主菜单中选择3的时候调用此函数,用来删除收入信息的操作。在函数中调用delete_data()来完成。程序清单:void delete_income

23、()delete_data(income);(4)修改收入函数名称:updata_income函数功能:用户在主菜单中选择4的时候调用此函数,用来修改收入信息的操作。函数中调用update_data()来完成的。程序清单:void update_income()update_data(income);(5)添加支出函数名称:add_payout函数功能:用户在主菜单中选择5的时候调用此函数,用来添加支出信息的操作。处理流程:首先建立链表,调用input_info()函数,提示用户输入输入信息,并将输入的信息储存到单链表中,输入完成后返回到主菜单界面。程序清单:void add_payout()

24、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;(6)查询支出明细函数名称:search_payout函数功能:用户在主菜单中选择6的时候调用此函数,用来查询收入明细的操作,函数中调用search_data()来完成收入明细的查询。程序清单:void search_payout()search_data

25、(payout);(7)删除支出函数名称:delete_payout函数功能:用户在主菜单中选择7的时候调用此函数,用来删除支出信息的操作。在函数中调用delete_data()来完成。程序清单:void delete_payout()delete_data(payout);(8)修改支出函数名称:updata_payout函数功能:用户在主菜单中选择8的时候调用此函数,用来修改收入信息的操作。函数中调用update_data()来完成的。程序清单:void update_payout()update_data(payout);(9)统计总收入总支出函数名称:count_total函数功能:主

26、菜单中选择9的时候进行统计的操作,在单链表中,计算收入和支出的总和,并将两者想减得到家庭收入的结余,并按一定的格式显示出来。程序清单: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->info.money;p=p->next;printf("+-+-+-+n");printf

27、("| 合计收入 | 合计支出 | 结余 |n"); printf("+-+-+-+n");printf("|%12.2f|%12.2f|%12.2f|n",total_income,total_payout,total_income-total_payout); printf("+-+-+-+n");printf("按任意键返回主菜单。n");fflush(stdin);getchar();(10)退出系统函数名称:quit函数功能:将链表中的数据释放,退出系统。程序清单:void quit(

28、)save_to_file();clear_data();exit(0);7.主要处理函数(1)查询处理 函数名称:search_data函数功能:收入和支出的查询操作。处理流程:提示用户按照指定格式输入要查询的年月,如果用户输入错误,给出提示;如果用户输入正确,则在单链表中查找该年月的收入信息。如果查询成功,判断查询结果个数是否小于9,调用函数show_info()显示找到的收入信息;如果大于9,按空格进行翻页操作。如果没有找到任何信息,系统给出提示信息。提示用户是否继续查询,如果用户输入Y或y,则再次进行查询操作;否则,返回主菜单界面。程序清单:/*查询处理*/void search_da

29、ta(fi_type type)int year=0;int month=0;fi_data*p=NULL;fi_data*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;memset(result,0,sizeof(fi_data*);whil

30、e(p!=NULL)if(p->info.year=year&&p->info.month=month&&p->info.type=type)if(count<9)resultcount=p;count+;elseshow_info(result,count);printf(">输入空格并回车翻页。其余键退出。");fflush(stdin);input=getchar();if(input='')memset(result,0,sizeof(fi_data*);count=0;resultcou

31、nt=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')continue;elsebreak;(2)删除处理 函数名称:delete_data函数功能:收入和支出的删除操作。处理流程:提示用户输入要删除收入的年月,然后

32、根据用户输入的年月信息在单链表中查找相关信息。如果查找成功,且查找到的数据小于9,直接调用show_info()函数显示查找到的收入信息;入过查到的数据大于9,则按空格键翻页。最后提示用户输入要删除的收入信息的序号,完成删除的操作。如果查找不成功,给出相应的提示信息。提示用户是否继续删除的操作,如果用户输入“Y”或“y”,则再进行查询操作;否则,返回值菜单界面。程序清单:void delete_data(fi_type type)int year=0;int month=0;fi_data*p=NULL;fi_data*pre=NULL;fi_data*result9=NULL;int cou

33、nt=0;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&&

34、;p->info.type=type)if(count<9)resultcount=p;count+;elseshow_info(result,count);printf(">输入空格并翻页。输入对应的序号删除。其他键退出。");fflush(stdin);input=getchar();if(input='')memset(result,0,sizeof(fi_data*);count=0;resultcount=p;count+;else if(input>='1'&&input<=48+co

35、unt)i=input-49;pre=get_previous(resulti);if(pre=NULL)head=head->next;elsepre->next=resulti->next;free(resulti);for(;i<count-1;i+)resulti=resulti+1;resulti=p;printf(">删除成功!n");elsebreak;p=p->next;if(count!=0)show_info(result,count);printf(">输入对应的序号删除,其它键退出");

36、fflush(stdin);input=getchar();if(input>='1'&&input<=48+count)i=input-49;pre=get_previous(resulti);if(pre=NULL)head=head->next;elsepre->next=resulti->next;free(resulti);for(;i<count-1;i+)resulti=resulti+1;resulti=NULL;count+;printf(">删除成功!n");elseprintf(

37、">没有找到数据!n");printf(">继续查找其它数据?(y or n)");fflush(stdin);input=getchar();if(input='y'|input='Y')continue;elsebreak;(3)更新处理 函数名称:update_data 函数功能:收入和支出的更新操作。处理流程:首先提示用户输入要更新收入或支出的年月,然后根据用户输入的年月信息在单链表中查找相关信息。遇过查找成功,且查找到的数据小于9,直接调用show_info()函数显示查找到的收入或支出信息;如果大于

38、9,则按空格键翻页。最后提示用户输入要更新的收入或支出信息的序号,调用input_info()函数输入更新的收入或支出信息,完成更新操作。如果查找不成功,则给出相应的提示信息。提示用户是否继续更新操作,如果用户输入“Y”或“y”,则再次进行查询操作;否则,返回主菜单界面。程序清单:void update_data(fi_type type)int year=0;int month=0;fi_data*p=NULL;fi_data*pre=NULL;fi_data*result9=NULL;int count=0;char input=''int i=0;while(1)prin

39、tf(">请输入要查询的年月(例如: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(coumt<9)resultcoun

40、t=p;count+;elseshow_info(result,count);printf(">输入空格并翻页。输入对应的序号删除。其他键退出。");fflush(stdin);input=getchar();if(input='')memset(result,0,sizeof(fi_data*);count=0;resultcount=p;count+;else if(input>='1'&&input<=48+count)i=input-49;input_info(&(resulti->in

41、fo);printf(">修改成功!n");p=get_previous(p);elsebreak;p=p->next;if(count!=0)show_info(result,count);printf(">请输入对应的序号修改,其它键退出。");fflush(stdin);input=getchar();if(input>='1'&&input<=48+count)i=input-49;input_info(&(resulti->info);show_info(result,

42、count);printf(">修改成功!n"); elseprintf(">没有找到数据!n");printf(">继续查找其它数据?(y or n)");fflush(stdin);input=getchar();if(input='y'|input='Y')continue;elsebreak;8.辅助函数 (1)系统初始化 函数名称:initialize 函数功能:系统初始化操作,包括数据文件和单链表的初始化。 函数清单:void initialize()FULE*fp=NUL

43、L;fi_data*p=NULL;fi_data*last=NULL;int count=0;/*判断数据文件是否存在,不存在创建一个*/fp=fopen("d:data.dat","rb"); if(fp=NULL)fp=fopen("d:data.dat","w");/*创建文件*/fclose(fp);return;p=(fi_data*)malloc(sizeof(fi_data);memset(p,0,sizeof(fi_data);p->next=NULL;while(fread(&(p-

44、>info),sizeof(fi_data),1,fp)=1)if(head=NULL)/*链表为空*/head=p;elselast=get_last();/*头节点不为空时,在链表中找到最后一个*/last->next=p;/*将b连到最后一个节点之后*/count+;fseek(fp,count*sizeof(fi_info),SEEK_SET);/*将文件指针指到下个*/ p=(fi_data*)malloc(sizeof(fi_data);memset(p,0,sizeof(fi_data);p->next=NULL;free(p);p=NULL;fclose(fp

45、);(2)将财务数据保存到文件函数名称:save_to_file函数功能:将单链表中的数据保存到文件。程序清单:void save_to_file()FILE*fp=fopen("d:data.dat","wb");fi_data*p=head;while(p!=NULL)fwrite(&(p->info),sizeof(fi_info),1,fp);fseek(fp,0,SEEK_END);p=p->next;fclose(fp);(3)清空链表中的数据函数名称:clear_data函数功能:退出系统时调用该函数,清空单链表中的数据。函数清单:void cl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论