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