C语言课程设计——家庭财务管理系统
课程设计报告课程设计题目:家庭财务管理系统
学生姓名:
专业: 信息工程
班级:
指导教师:
2018年1月8日
1.需求分析
根据家庭账务管理的需要,建立一个“家庭账务管理系统”,以方便对家庭日常收入及支出进行记录和管理。该系统要求:①家庭月收入管理②家庭月支出管理③统计家庭总收入/总支出④系统提供收入/支出的添加、删除和修改功能。
2. 总体设计
根据以上分析,本家庭账务管理系统主要包括:
①从键盘键入家庭月收入、月支出数据;
②查询月收入、月支出明细;
③删除收入、支出数据;
④修改收入、支出数据;
⑤统计总收入/总支出;
⑥退出系统。
除main()函数之外,系统还定义了以下函数来实现各部分内容:
①add_income():添加收入数据函数。
②add_payout():添加支出数据函数。
③search_data():查找数据函数。
④initialize():初始化函数,读取文本数据。
⑤show_info():显示数据函数。
⑥count_total():统计函数,统计总收入、总支出。
⑦update_data():修改信息函数。
⑧delete_data():删除数据函数。
⑨quit():退出函数。
程序结构功能图如下:
3.详细设计3.1收入管理
3.2支出管理
4.测试结果
4.1 程序运行主菜单
4.2 添加收入测试
4.3 查询收入明细测试
4.4 删除收入测试
4.5 修改收入测试
4.6 添加支出测试
4.7 查询支出明细测试
4.8 删除支出测试
4.9 修改支出测试
4.10 统计总收入/支出测试
4.11 退出系统测试
5.软件操作使用说明书
本系统采用命令行对话方式进行操作,运行后出现主界面(如下图所示),然后按照主界面菜单指引操作即可。
6.总结
编写程序之前要有一个整体的思路,不能写到哪里算哪里。这样很容易遗漏,连续性也不好。通过本次的课程设计让我对于数组、文件的存放、循环结构等知识有了更加透彻的理解。希望在以后的课程设计中对于知识的运用能够更加的熟练。
代码:
#include
#include
#include
#include
#define MAXNAME 11 //家庭成员姓名的最大长度
#define MAXDETAIL 21 //注最大长度
//自定义枚举类型fi_type,用来表示收入与支出typedef enum _fi_type
{
income=1,//收入
payout =-1 //支出
} fi_type;
// 家庭财务信息结构体
typedef struct _fi_info
{
int year;
int month;
fi_type type;
char name[9];
float money;
char detail[11];
}fi_info;
// 存储财务数据结构的结构体
typedef struct _fi_data
{
fi_info info;
struct _fi_data* next;
} fi_data;
fi_data *head;//财务数据的头结点
void menu();//菜单函数
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);
void input_info(fi_info *info);
void show_info(fi_data *p);
void menu()
{
printf("\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t\t 家庭财务管理系统\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t*******************************************\n");
printf("\t\t收入管理:");
printf("1.添加收入");
printf(" 2.查询收入明细\n");
printf("\t\t\t 3.删除收入");
printf(" 4.修改收入\n");
printf("\t\t*******************************************\n");
printf("\t\t支出管理:");
printf("5.添加支出");
printf(" 6.查询支出明细\n");
printf("\t\t\t 7.删除支出");
printf(" 8.修改支出\n");
printf("\t\t*******************************************\n");
printf("\t\t统计:");
printf("9.统计总收入/总支出\n");
printf("\t\t*******************************************\n");
printf("\t\t退出:0.退出系统\n");
printf("\t\t*******************************************\n\n\n");
}
void main()
{
int selected=0;
initialize();
while(selected>=0&&selected<=9)
{
system("cls");
menu();
printf("\t\t>请选择要进行的操作(0-9):");
if(scanf("%d",&selected)!=1||selected<0||s elected>9)
{
printf("\t\t>输入有误!请选择(0-9)之间的数字!按任意键重试"); getchar();
}
else
{
switch(selected)
{
case 0:exit(0);clear_data();break;
case 1:add_income();save_to_file();break;
case 2:search_income();break;
case 3:delete_income();save_to_file();break;
case 4:update_income();save_to_file();break;
case 5:add_payout();save_to_file();break;
case 6:search_payout();break;
case 7:delete_payout();save_to_file();break;
case 8:update_payout();save_to_file();break;
case 9:count_total();break;
}
}
}
}
void add_income()//添加收入
{
fi_data *p=(fi_data *)malloc(sizeof(fi_data)); p->next=NULL;
input_info(&(p->info));
p->info.type=income;
if(head==NULL)
head=p;
else
get_last()->next=p;
}
void add_payout()//添加支出
{
fi_data *p=(fi_data *)malloc(sizeof(fi_data)); p->next=NULL;
input_info(&(p->info));
p->info.type=payout;
if(head==NULL)
head=p;
else
get_last()->next=p;
}
//输入函数
void input_info(fi_info *info)
{
printf("\t\t>请输入年月(YYYY/M)");
scanf("%d/%d",&(info->year),&(info->month));
printf("\t\t>请输入家庭成员姓名(最大长度为%d):",MAXNAME-1); scanf("%s",info->name);
printf("\t\t>输入金额:");
scanf("%f",&(info->money));
printf("\t\t>请输入备注(最大长度为%d):",20);
scanf("%s",info->detail);
}
//查找数据函数
void search_data(fi_type type)
{
int year=0;
int month=0;
fi_data *p=NULL;
int count=0;
char input=' ';
while(1)
{
printf("\t\t>请输入要查询的年月(YYYY/M)");
if(scanf("%d/%d",&year,&month)!=2)
{
printf("\t\t>输入有误\n");
}
else
{
p=head;
count=0;
while(p!=NULL)
{
if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==typ e))
{
show_info(p);
system("PAUSE");
count++;
}
p=p->next;
}
if(count==0)
{
printf("\t\t>没有找到数据\n");
}
printf("\t\t>继续查找其他数据?(y or n)");
input=getchar();
if(input=='y'||input=='Y')
continue;
else