资源描述
. .
#include"stdio.h"
#include"stdlib.h"
#define MAX_NAME 11
#define MAX_DETAIL 21
#define MENU_COUNT 9
#define DATA_FILE "fa.dat"
typedef wnum_fi_type
{
ine=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_ine();
void search_ine();
void delete_ine();
void update_ine();
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[],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_ine,
search_ine,
delete_ine,
update_ine,
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<0||selected>MENU_COUNT)
{
printf(">输入错误!请选择[ %d - %d]之间的数字!按任意键重试...",0,MENU_COUNT);
fflush(stdin);
getchar();
}
else
{
menu_fun[selected]();
}
selected=0;
}
}
void add_ine()
{
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=ine;
if(head==NULL)
{
head=p;
}
else
{
get_last(head)->next=p;
}
}
void search_ine()
{
search_data(ine);
}
void delete_ine()
{
delete_data(ine);
}
void update_ine()
{
update_data(ine);
}
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_ine=0.0;
float total_payout=0.0;
fi_data *p=head;
while(p!=NULL)
{
if(p->info.type==ine)
{
total_ine+=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_ine, total_payout,total_ine - total_payout);
printf("+---------+---------+---------+\n");
printf(">按任意键继续返回主菜单...");
fflush(stdin);
getchar();
}
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(">请输入要查询的年月〔例如:2021/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(">继续查找其他数据?(y or n)");
fflush(stdin);
input=getchar();
if(input=='y'||input=='Y')
{
continue;
}
else
{
break;
}
}
}
}
void delete_data(fi_type type)
{
int year=0;
int 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(">请输入要查询的年月〔例如:2021/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++;
}
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')
{
continue;
}
else
{
break;
}
}
}
}
void update_data(fi_type type)
{
int year=0;
int 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(">请输入要查询的年月〔例如:2021/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;
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(">继续查找数据?(y or n)");
fflush(stdin);
input=getchar();
if(input=='y' || input=='Y')
{
continue;
}
else
{
break;
}
}
}
}
void initialize()
{
FILE *fp=NULL;
fi_data *p=NULL;
fi_data *last=NULL;
int count=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);
}
void save_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);
}
void clear_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)
{
return p;
}
while((p!=NULL) && (p->nezt!=NULL))
{
p=p->next;
}
return p;
}
fi_data *get_previous(fi_data *p)
{
fi_data *previous=head;
while(previous!=NULL)
{
if(previous->next==p)
{
break;
}
previous=previous->next;
}
return previous;
}
void input_info(fi_info *info)
{
printf(">请输入年月〔YYYY/M〕:");
scanf("%d/%d",*(info->year),&(info->month));
printf(">请输入家庭成员XX(最大长度为 %d):",MAX_NAME - 1);
scanf("%s",info->name);
printf(">请输入金额:");
scanf("%f",&(info->money));
printf(">请输入备注〔最大长度为 %d〕:",MAX_DETAIL - 1);
scanf("%s",info->detail);
}
void show_info(fi_data *p[],int count)
{
int i=0;
printf("+---+--------+-------+-------------+-------------+--------------------+\n");
printf("|No.| 年-月 | 类型 | | 金额 | 备注 |\n");
printf("+---+--------+-------+-------------+-------------+--------------------+\n");
for(i=0;i<count;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==ine?"收入":"支出",
p[i]->info.name,
p[i]->info.money,
p[i]->info.detail);
printf("+---+--------+-------+-------------+-------------+---------------------+\n");
}
}
. .word..
展开阅读全文