家庭财务管理系统给家庭成员提供了一个管理家庭财务的平台,系统可以对家庭成员的收入和支出进行增加,删除、修改和查询等操作,并能统计总收入和总支出。其主要功能需求描述如下:
(1)系统主菜单界面:充许用户选择想要进行的操作,包括输入收入管理、支出管理、统计和退出系统等操作。其中收入管理包括添加收入、查询收入明细、删除收入和修改收入的操作,支出管理包括添加支出、查询支出明细、删除支出和修改支出的操作。统计是对总收入和总支出进行统计操作。
(2)添加收入处理:用户根据提示,输入要添加的收入信息,包括收入的日期,添加收入的家庭成员姓名、收入的金额以及备注信息。输入完一条收入记录,将其暂时保存在单链表中,然后返回到主菜单。
(3)查询收入明细处理:根据用户输入的年月信息在单链表中查找收入信息,如果查询成功,按照预定格式显示该收入明细。如果没有该数据,则给出提示信息。查询结束后,询问用户是否继续查找,根据用户的输入进行下一步操作。
(5)修改收入处理:首先提示用户输入要进行修改的信息的年月,如果单链表中有该收入信息存在,则提示用户输入要修改的收入日期,家庭成员姓名等信息并将结果重新存储到单链表中。如果没有找到要修改的收入信息,则给出提示信息。
(6)添加支出处理完成用户支出信息的添加,与添加收入处理类似。
(7)查询支出明细处理查询支出信息,与查询收入明细信息类似。
(8)删除支出处理,删除支出信息,与删除收入信息处理类似。
(9)修改支出处理,修改支出信息与修改收入信息类似。
(10)统计总收入和总支出处理:计算单链表中所有的收入总和和支出总和,并计算出家庭收入的结余信息
(11)退出系统。
2.总体设计
2.1功能模块设计
1.添加收入信息
主菜单中选择1,进入添加收入操作,系统调用add_income()函数来添加收入信息,首先建立单链表,函数调用input_info()函数提示用户输入收入信息,并存储到单链表中,输入完成后返回到主菜单界面。
2.查询收入明细
主菜单中选择2,进入查询收入明细操作,系统调用search_income()函数来查询收入的明细,调用search_data()函数来完成具体的查询操作。首先提示用户输入要查询的年月,如果用户输入错误,则给出输入有误提示信息,如果输入正确,在单链表中查找该年月的收入信息,如果查找成功,按照指定格式显示找到的收入信息。每页显示9条收入信息,如果找到收入的信息多于9条,按空格键翻页。如果没有找到任何信息,则给出相应的提示信息。查找成功后提示用户是否继续查找操作,如果用户输入"y"或"Y“,则再次调用次函数进行相应的操作。否则,直接返回主菜单界面。
3.删除收入信息
4.更新收入信息
5.添加支出信息
主菜单中选5,进入添加支出信息操作。系统调用add_income()函数来添加支出信息。添加支出信息的操作和添加收入信息的操作相似。
6.查询支出明细
主菜单中选6,进入查询支出明细操作,系统调用search_income()函数来查询支出明细操作。调用search_data()函数来完成具体的查询操作。查询支出明细的操作与查询收入明细的操作相似。
7.删除支出信息
主菜单选择7,进入删除支出信息操作,调用delete_data()函数进行删除支出的操作。删除支出操作与删除收入操作相似。
8.更新支出信息
主菜单中选择8,进入更新支出信息操作。调用update_data()函数进行更新支出信息操作。具体操作过程与更新收入信息操作相似。
9.统计总收入,总支出
主菜单中选择9,进入统计操作。调用count_total()函数进行总收入,总支出的统计。在单链表中,计算收入和支出的总和,并将两者相减得到家庭收入的结余,并按相应格式显示出来。统计结束之后,按任意键返回主菜单界面。
10.退出系统
主菜单中选择10,进入退出系统操作。调用quit()函数进行退出操作,首先调用save_to_file()函数,将单链表中的数据保存到文件,再调用clear_data()函数清空单链表,最后退出系统。
2.2系统处理流程
系统执行应从主菜单的选择开始,充许用户输入0-9之间的数值来选择要进行的操作,输入其它字符都是无效的,系统会给出出错的提示信息。若用户输入0,调用quit()函数退出系统;
若输入1,则调用add_income()函数,进行添加收入操作;
若输入2,则调用search_income()函数,进行查询收入明细;
若输入3,则调用delete_income()函数,进行删除收入操作;
若输入4,则调用update_income()函数,进行修改收入操作;
若输入5,则调用add_payout()函数,进行添加支出操作;
若输入6,则调用search_payout()函数,进行查询支出明显;
若输入7,则调用delete_payout()函数,进行删除支出操作;
若输入8,则调用update_payout()函数,进行更新支出操作;
若输入9,则调用count_total()函数,进行统计总收入,总支出操作。
1.添加操作
首先建立单链表,调用input_info()函数,提示用户输入要添加的收入或支出信息,并将输入信息存储到单链表中,输入完成之后返回主菜单界面。
2.查询操作
首先提示用户输入要查询的年月,如果用户输入错误,给出相应的提示信息;如果用户输入正确,则根据输入的数据在单链表中查找收入或支出的信息。如果没有找到,则给出没有数据的提示信息,如果找到,则判断记录个数是否小于9,如果小于9,直接显示结果,否则提示用户按空格键翻页。查询操作的处理流程图如下所示:
3.删除操作
首先提示用户输入要删除的年月,如果用户输入错误,给出相应的提示信息,如果输入正确,则在单链表中查询收入或支出的信息,如果没有找到,给出没有数据的提示信息,如果找到,显示找到的记录信息,并提示用户输入对应的序号进行删除操作。删除成功之后,给出提示信息。删除操作的处理流程如图:
4.修改操作
首先提示用户输入要查询的年月,如果输入错误,给出相应的提示信息,如果输入正确,则先在单链表中查找收入或支出的信息,如果没找到,则给出提示信息,否则显示找到的记录信息,并提示用户输入序号,进行修改,用户可以根据提示信息输入要修改的收入或支出信息。修改操作的处理流程如图:
2.3详细设计与系统实现
打开vs,新建win32consoleApplication,选择EmptyProj,点击Finished完成FinanceMng项目创建
//HeaderInformation#include
//DataStructDefinition//自定义枚举类型fi_type,用来表示收入支出typedefenum_fi_type{income=1,//收入payout=-1//支出}fi_type;.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}接下来定义一个存储家庭财务信息的结构体fi_info
typedefstruct_fi_info{intyear;intmonth;fi_typetype;//数据类型,即财务类型是收入还是支出charname[MAX_NAME];//家庭成员姓名,属于TA的收入或由TA支出floatmoney;//收入或支出的金额chardetail[MAX_DETAIL];//备注信息}fi_info;.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}还需要定义一个存储财务数据结构的结构体fi_data,通过此结构把财务数据连接成链表,具体实现如下:
#includeFinanceMain.h
系统的执行应从主菜单处开始,所以首先来实现main入口函数,将主菜单打印出来,并等待用户输入相应的操作选项,如果输入有误,则给出提示信息,并提示重新输入,直到输入正确为止。具体实现如下:
1.添加收入
函数名称:add_income
函数功能:用来添加收入信息的操作。
处理过程:首先建立单链表,调用input_info()函数,提示用户输入收入信息,并将输入的信息存储到单链表中,输入完成后返回到主菜单界面。具体实现如下:
//添加收入voidadd_income(){//定义一个存储财务数据的结构体指针p,并申请内存fi_data*p=(fi_data*)malloc(sizeof(fi_data));if(NULL==p)throwprintf("内存申请失败...\n");//如果内存申请失败则抛出异常memset(p,0,sizeof(fi_data));//置空p->next=NULL;input_info(&(p->info));//录入相应的财务数据信息p->info.type=income;//财务类型标识为收入//如果当前头指针为空,表示当前单链表为空,则把p作为头节点并将地址赋值给headif(NULL==head){head=p;}else{//否则寻找当前单链表的最后一个节点并把p连接到这个节点后面get_last(head)->next=p;}}因为查询,删除和修改信息在收入管理中的查询收入明细、删除收入信息、更新收入信息这三项操作和支出管理中的查询支出明细、删除支出以及更新支出等三项操作操作几乎相同,仅仅只是财务数据类型不同,所以我们直接把查询、删除和修改信息这三项独立出来,写成公共模块,来供收入管理或支出管理需要使用时作相应的调用即可,即避免代码冗余,亦便于维护。
函数名称:search_income
函数功能:用来查询收入明细的操作。函数中调用search_data()来完成收入明细的查询。具体实现如下:
//查询收入明细voidsearch_income(){search_data(income);}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}3.删除收入
函数名称:delete_income
函数功能:用来删除收入信息的操作,在函数中调用delete_data()来完成收入信息的删除,具体实现如下:
//删除收入信息voiddelete_income(){delete_data(income);}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}4.修改收入
函数名称:update_income
函数功能:用来修改收入信息的操作,通过调用update_data()函数来完成收入信息的修改,具体实现如下:
//更新收入信息voidupdate_income(){update_data(income);}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}5.添加支出信息
函数名称:add_payout
函数功能:添加支出信息的操作
处理过程:首先建立单链表、调用input_info()函数提示用户输入支出信息,并将输入信息存储在单链表中,输入完成后返回到主菜单界面。实现过程和添加收入雷同,只是录入的财务类型为支出。具体实现如下:
//添加支出信息voidadd_payout(){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=payout;if(NULL==head){head=p;}else{get_last(head)->next=p;}}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}6.查询支出明显
函数名称:search_payout
函数功能:用来查询支出明细操作,通过调用search_data()来实现,具体实现如下:
//查询支出信息明显voidsearch_payout(){search_data(payout);}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}7.删除支出
函数名称:delete_payout
函数功能:通过调用delete_data()函数来完成删除支出信息的操作,具体实现如下:
//删除支出信息voiddelete_payout(){delete_data(payout);}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}8.修改支出
函数名称:update_payout
函数功能:通过调用update_data()来修改支出信息,具体实现如下:
//更新支出信息voidupdate_payout(){update_data(payout);}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}9.统计总收支结余信息
函数名称:count_total
函数功能:在单链表中,分别计算出收入和支出的总和,并将两者相减算出结余信息,具体实现如下:
函数名称:quit
函数功能:将单链表中的数据先保存到本地磁盘文件中,然后清空单链表中的数据,最后退出系统。具体实现如下:
//退出系统voidquit(){save_to_file();clear_data();exit(0);}接下来对前面抽象出来的查询、删除和修改三个处理函数进行实现
1.查询处理
函数名称:search_data
函数功能:收入和支出的查询操作。
处理过程:
(1)提示用户按照指定格式输入要查询的年月,如果用户输入错误,则给出提示信息;如果输入正确,则在单链表中查找该年月的信息
(2)如果查找成功,则调用show_info()函数显示找到的信息,并判断查询结果是否小于9条,如果大于9条信息,则提示按空格键进行翻页操作。
(3)如果没有找到符号年月的信息,则给出提示信息
(4)提示用户是否继续进行查询操作,如果用户输入"y"或"Y",则再次调用本函数进行处理,否则返回主菜单界面。具体实现如下:
函数名称:delete_data
函数功能:收入与支出的删除操作
处理流程:
(2)如果查找成功,且查找的记录条数小于9条,则直接调用show_info()函数显示查找到收支信息,如果查找的记录条数大于9,则调用show_info()函数将当前查询到的9条信息显示出来,并提示用户按空格键进行翻页操作。
(3)最后提示用户输入要删除的的收支信息的序号,完成删除操作。
(4)如果查找不成功,则给出相应的提示信息
(5)删除完成之后,提示用户是否继续进行删除操作,如果用户输入"y"或"Y",则继续进入删除操作界面,否则返回主菜单界面。具体实现如下:
3.更新处理
函数名称:update_data
函数功能:收支信息的更新操作
(1)首先提示用户输入要更新的信息所属的年月,然后根据此输入进行查询
(2)如果查询成功,且查找的记录条数小于9,则直接调用show_inof()函数显示出来,如果大于9,则提示空格键翻页操作。
(3)提示用户输入要更新的信息的序号,然后调用input_info()函数输入要更新的信息,完成更新操作。
(4)如果查找不成功,则给出提示信息
(5)提示用户是否继续进行更新操作,如果用户输入"y"或'Y",则继续进行更新操作,否则直接返回主界面
更新操作和删除操作类似,只是将删除操作中完成具体删除操作的部分替换成调用input_info()来完成更新数据的录入工作。其它几乎是一样的。具体实现如下:
1.系统初始化
函数名称:initialize
函数功能:系统初始化操作,包括数据文件和单链表的初始化,具体实现如下:
函数名称:save_to_file
函数功能:将单链表中的数据保存到文件中。具体实现如下:
函数名称:clear_data
函数功能:退出系统时调用此函数,清空单链表中的数据。具体实现如下:
//清空单链表中的数据voidclear_data(){fi_data*p=NULL;while(NULL!=head){fi_data*p=NULL;//从链表开始处开始清空数据if(NULL!=head->next){p=head;head=head->next;free(p);p=NULL;}else{free(head);head=NULL;}}}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}4.取得最后一个节点地址
函数名称:get_last
函数功能:取得收支数据链表中的最后一个节点指针。具体实现如下:
//取得最后一个节点,并返回此节点指针fi_data*get_last(fi_data*head){fi_data*p=head;if(p==NULL){returnp;}while((NULL!=p)&&(NULL!=p->next)){p=p->next;}returnp;}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}5.取参数p的前一个节点
函数名称:get_previous
函数功能:取得数据节点p的前驱节点。具体实现如下:
//取得当前节点的前驱节点fi_data*get_previous(fi_data*p){fi_data*previous=head;while(previous!=NULL){if(previous->next==p){break;}previous=previous->next;}returnprevious;}.csharpcode,.csharpcodepre{font-size:small;color:rgba(0,0,0,1);font-family:consolas,"CourierNew",courier,monospace;background-color:rgba(255,255,255,1)}.csharpcodepre{margin:0}.csharpcode.rem{color:rgba(0,128,0,1)}.csharpcode.kwrd{color:rgba(0,0,255,1)}.csharpcode.str{color:rgba(0,96,128,1)}.csharpcode.op{color:rgba(0,0,192,1)}.csharpcode.preproc{color:rgba(204,102,51,1)}.csharpcode.asp{background-color:rgba(255,255,0,1)}.csharpcode.html{color:rgba(128,0,0,1)}.csharpcode.attr{color:rgba(255,0,0,1)}.csharpcode.alt{background-color:rgba(244,244,244,1);width:100%;margin:0}.csharpcode.lnum{color:rgba(96,96,96,1)}6.输入收支的数据信息
函数名称:input_info
函数功能:提示用户按指定格式输入收支信息。具体实现如下:
函数名称:show_info
函数功能:按指定格式显示收支信息。具体实现如下:
1.F5运行,首先进入主菜单界面,充许用户输入0-9之间的数值,以实现不同的操作,如图:
====================================================
|家庭财务管理系统|
+--------------------------------------------------+
|收入管理|
|<1>添加收入|
|<2>查询收入明细|
|<3>删除收入|
|<4>修改收入|
|支出管理|
|<5>添加支出|
|<6>查询支出明细|
|<7>删除支出|
|<8>修改支出|
|统计|
|<9>统计总收入总支出|
|输入<0>退出系统|
>请选择要进行的操作[0-9]:
2.添加收入信息
>请选择要进行的操作[0-9]:1
>请输入年月(YYYY/M):2010/1
>请输入家庭成员姓名(最大长度为10):Mike
>请输入金额:100000
>请输入备注(最大长度为20):payforworking
3.查询收入明细
选择操作2,可以查询某年月的收入明细情况。首先系统提示输入要查询的年月,然后进行查询如果查询成功则显示查询到的信息,如果查询到的信息超过9条,则提示用户可以空格键翻页。如图:
>请选择要进行的操作[0-9]:2
>请输入要查询的年月(例如:2009/1)2010/1
+---+---------+------+----------+----------+------------------------+
|No.|年-月|类型|姓名|金额|备注|
|1|2010-01|收入|Mike|10000.00|payforworking|
|2|2010-01|收入|Jhon|100.00|payment|
|3|2010-01|收入|Stive|203.00|working|
|4|2010-01|收入|Yse|3923.00|workingforhours|
|5|2010-01|收入|Sasu|395.00|workingforhours|
|6|2010-01|收入|Jane|8958.00|payment|
|7|2010-01|收入|Xlie|485.00|loanfrombank|
|8|2010-01|收入|Xeson|495.00|working|
>继续查找其它数据?(YorN)
查询信息超过9条时的情况(图示情况是已经按下空格键将余下的信息也一起显示出来了):
|9|2010-01|收入|Weon|987.00|fortestmorethan9|
>输入空格并回车翻页,按其它键退出....
|1|2010-01|收入|Mik|618.00|fortestingnow|
|2|2010-01|收入|Jhons|781.00|fortesting9|
4.删除收入信息
选择操作3,则进行删除操作,系统提示输入要查询的年月,然后进行查询,如果查询成功,系统会将符号查询条件的信息显示出来,然后提示用户输入要删除的信息的序号,完成删除操作。如果查询到,则给出提示信息。删除完成之后将删除完之后的信息重新打印出来,并可继续删除操作或返回主界面。如图:
>请选择要进行的操作[0-9]:3
>请输入要查询的年月(例如:2009/1):2010/1
>输入空格并回车翻页.输入对应的序号删除.其它键退出.请输入:9
>删除成功!
|9|2010-01|收入|Mik|618.00|fortestingnow|
>输入空格并回车翻页.输入对应的序号删除.其它键退出.请输入:
5.修改收入信息
选择操作4,进行修改收入信息的操作,系统提示输入要查询的年月,如果查询成功,系统会将符合条件的信息显示出来,再提示用户输入要修改的收入信息的序号,然后调用input_info函数使按照提示信息进行修改操作。修改完成后,系统会立即打印修改后的信息,并提示是否继续操作。如图:
>请选择要进行的操作[0-9]:4
>请输入要查询的年月(例如:2009/1):2010/2
|1|2010-02|收入|Alice|2003.00|working|
>输入对应的序号修改,其它键退出,请输入:1
>请输入年月(YYYY/M):2010/2
>请输入家庭成员姓名(最大长度为10):Mikes
>请输入金额:9589
>请输入备注(最大长度为20):payment
|1|2010-02|收入|Mikes|9589.00|payment|
>修改成功...
>继续查找其它数据?(YorN)
支出管理操作与收入管理操作类似,下面就不再赘述操作过程,而直接上图了
6.添加支出信息,如图:
>请选择要进行的操作[0-9]:5
>请输入年月(YYYY/M):2010/3
>请输入家庭成员姓名(最大长度为10):Woen
>请输入金额:85
>请输入备注(最大长度为20):forbreakfirst
7.查询支出明细,如图:
>请选择要进行的操作[0-9]:6
>请输入要查询的年月(例如:2009/1)2010/3
|1|2010-03|支出|Stensn|623.00|watchmoving|
|2|2010-03|支出|Woen|85.00|forbreakfirst|
8.删除支出信息,如图:
>请选择要进行的操作[0-9]:7
>请输入要查询的年月(例如:2009/1):2010/3
>输入对应的序号删除.其它键退出.请输入:1
>删除成功...
>继续查找其它数据?(YorN)N
9.修改支出信息,如图:
>请选择要进行的操作[0-9]:8
>请输入要查询的年月(例如:2009/1):2010/3
|1|2010-03|支出|Woen|85.00|forbreakfirst|
>请输入家庭成员姓名(最大长度为10):Stenph
>请输入金额:2039
>请输入备注(最大长度为20):lunchfee
|1|2010-03|支出|Stenph|2039.00|lunchfee|
10.统计收支结余,如图:
>请选择要进行的操作[0-9]:9
+------------+------------+------------+
|合计收入|合计支出|结余|
|125647.00|2039.00|123608.00|
>按任意键返回主菜单...
4.总结与Bug
Bug.1
在函数实现的时候把get_last()函数写错了,本应该写成:fi_data*get_last(fi_data*head)
Bug.2
delete_data()函数,
//修改input-48为input-48-1因为数组的下标是从0开始的i=input-48-1;
否则输入最后一个序号,则最后删除的时候因为数组越界,造成错误,因为数组小标是从0开始排起的