C语言财务管理系统源代码.docx
《C语言财务管理系统源代码.docx》由会员分享,可在线阅读,更多相关《C语言财务管理系统源代码.docx(20页珍藏版)》请在冰豆网上搜索。
C语言财务管理系统源代码
#include"stdio.h"
#include"stdlib.h"
#defineMAX_NAME11
#defineMAX_DETAIL21
#defineMENU_COUNT9
#defineDATA_FILE"fa.dat"
typedefwnum_fi_type
{
income=1,
payout=-1
}fi_type;
typedefstruct_fi_info
{
intyear;
intmonth;
fi_typetype;
charname[MAX_NAME];
floatmoney;
chardetail[MAX_DETAIL];
}fi_info;
typedefstruct_fi_data
{
fi_infoinfo;
struct_fi_data*next;
}fi_data;
voidadd_income();
voidsearch_income();
voiddelete_income();
voidupdate_income();
voidadd_payout();
voidsearch_payout();
voiddelete_payout();
voidupdate_payout();
voidcount_total();
voidquit();
voidsearch_data(fi_typetype);
voiddelete_data(fi_typetype);
voidupdate_data(fi_typetype);
voidinitialize();
voidsave_to_file();
voidclear_data();
fi_data*get_last();
fi_data*get_previous(fi_data*p);
voidinput_info(fi_info*info);
voidshow_info(fi_data*p[],intcount);
fi_data*head;
charmenu[]=
"===============================================\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
};
intmain()
{
intselected=0;
initialize();
while(selected>=0&&selected<=MENU_COUNT)
{
system("cls");
printf(menu);
printf(">请选择要进行的操作(%d-%d):
",0,MENU_COUNT);
if(scanf("%d",&selected)!
=1||selected<0||selected>MENU_COUNT)
{
printf(">输入错误!
请选择[%d-%d]之间的数字!
按任意键重试...",0,MENU_COUNT);
fflush(stdin);
getchar();
}
else
{
menu_fun[selected]();
}
selected=0;
}
}
voidadd_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;
}
}
voidsearch_income()
{
search_data(income);
}
voiddelete_income()
{
delete_data(income);
}
voidupdate_income()
{
update_data(income);
}
voidadd_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;
}
}
voidsearch_payout()
{
search_data(payout);
}
voiddelete_payout()
{
delete_data(payout);
}
voidupdate_payout()
{
update_data(payout);
}
voidcount_total()
{
floattotal_income=0.0;
floattotal_payout=0.0;
fi_data*p=head;
while(p!
=NULL)
{
if(p->info.type==income)
{
total_income+=p->info.money;
}
else
{
total_payout+=p->info.money;
}
p=p->next;
}
printf("+---------+---------+---------+\n");
printf("|合计收入|合计支出|结余|\n");
printf("+---------+---------+---------+\n");
printf("|%12.2f|%12.2f|%12.2f|\n",total_income,total_payout,total_income-total_payout);
printf("+---------+---------+---------+\n");
printf(">按任意键继续返回主菜单...");
fflush(stdin);
getchar();
}
voidsearch_data(fi_typetype)
{
intyear=0;
intmonth=0;
fi_data*p=NULL;
fi_data*result[9]={NULL};
intcount=0;
charinput='';
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
{
break;
}
}
}
p=p->next;
}
if(count!
=0)
{
show_info(result,count);
}
else
{
printf(">没有找到数据。
\n");
}
printf(">继续查找其他数据?
(yorn)");
fflush(stdin);
input=getchar();
if(input=='y'||input=='Y')
{
continue;
}
else
{
break;
}
}
}
}
voiddelete_data(fi_typetype)
{
intyear=0;
intmonth=0;
fi_data*p=NULL;
fi_data*pre=NULL;
fi_data*result[9]={NULL};
intcount=0;
charinput='';
inti=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&&p->info.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++;
}
elseif(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{
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{
result[i]=result[i+1];
}
result[i]=NULL;
count--;
printf(">删除成功.\n");
}
}
else
{
printf(">没有找到数据。
\n");
}
printf(">继续查找数据?
(yorn)");
fflush(stdin);
input=getchar();
if(input=='y'||input=='Y')
{
continue;
}
else
{
break;
}
}
}
}
voidupdate_data(fi_typetype)
{
intyear=0;
intmonth=0;
fi_data*p=NULL;
fi_data*pre=NULL;
fi_data*result[9]={NULL};
intcount=0;
charinput='';
inti=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++;
}
elseif(input>='1'&&input<=48+count)
{
i=input-49;
input_info(&(result[i]->info));
printf(">修改成功。
\n");
p=get_previous(p);
}
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;
input_info(&(result[i]->info));
show_info(result,count);
printf(">修改成功。
\n");
}
}
else
{
printf(">没有找到数据。
\n");
}
printf(">继续查找数据?
(yorn)");
fflush(stdin);
input=getchar();
if(input=='y'||input=='Y')
{
continue;
}
else
{
break;
}
}
}
}
voidinitialize()
{
FILE*fp=NULL;
fi_data*p=NULL;
fi_data*last=NULL;
intcount=0;
fp=fopen(DATA_FILE,"rb");
if(fp==NULL)
{
fp=fopen(DATA_FILE,"w");
fclose(fp);
return;
}
p=(fi_data*)malloc(sizeof(fi_data));
memset(p,0,sizeof(fi_data));
p->next=NULL;
while(fread(&(p->info),sizeof(fi_info),1,fp)==1)
{
if(head==NULL)
{
head=p;
}
else
{
last=get_last();
last->next=p;
}
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);
}
voidsave_to_file()
{
FILE*fp=fopen(DATA_FILE,"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);
}
voidclear_data()
{
fi_data*p=NULL;
while(head!
=NULL)
{
if(head->next!
=NULL)
{
p=head;
head=head->next;
free(p);
p=NULL;
}
else
{
free(head);
head=NULL;
}
}
}
fi_data*get_last()
{
fi_data*p=head;
if(p==NULL)
{
returnp;
}
while((p!
=NULL)&&(p->nezt!
=NULL))
{
p=p->next;
}
returnp;
}
fi_data*get_previous(fi_data*p)
{
fi_data*previous=head;
while(previous!
=NULL)
{
if(previous->next==p)
{
break;
}
previous=previous->next;
}
returnprevious;
}
voidinput_info(fi_info*info)
{
printf(">请输入年月(YYYY/M):
");
scanf("%d/%d",*(info->year),&(info->month));
printf(">请输入家庭成员姓名(最大长度为%d):
",MAX_NAME-1);
scanf("%s",info->name);
printf(">请输入金额:
");
scanf("%f",&(info->money));
printf(">请输入备注(最大长度为%d):
",MAX_DETAIL-1);
scanf("%s",info->detail);
}
voidshow_info(fi_data*p[],intcount)
{
inti=0;
printf("+---+--------+-------+-------------+-------------+--------------------+\n");
printf("|No.|年-月|类型|姓名|金额|备注|\n");
printf("+---+--------+-------+-------------+-------------+--------------------+\n");
for(i=0;i{
printf("|%3d|%4d-%02d|%4s|%-10s|%10.2f|%-20s|\n",
i+1,
p[i]->info.year,p[i]->info.month,
p[i]->info.type==income?
"收入":
"支出",
p[i]->info.name,
p[i]->info.money,
p[i]->info.detail);
printf("+---+--------+-------+-------------+-------------+---------------------+\n");
}
}