当前位置:文档之家› C语言财务管理系统(源代码)

C语言财务管理系统(源代码)

C语言财务管理系统(源代码)
C语言财务管理系统(源代码)

#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

{

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);

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<0||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->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();

}

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;

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*));

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=' ';

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++;

}

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

{

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(">继续查找数据?(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(">请输入要查询的年月(例如: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;

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(DA TA_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(">请输入家庭成员姓名(最大长度为%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

{

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]->https://www.doczj.com/doc/b58657069.html,,

p[i]->info.money,

p[i]->info.detail);

printf("+---+--------+-------+-------------+-------------+---------------------+\n"); }

}

相关主题
文本预览
相关文档 最新文档