个人账簿管理系统
在本次的C语言程序设计中,我们可以很清晰的看到,c语言的模块程序化设计的特点,将账簿的七种相关的功能分别定义互不影响,通过主函数中switch函数进行选择与调用,简介方便,结构清楚,漂亮
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
typedef struct
{
int year;
int month;
int day;
double earn;
double pay;
double balance;
double basic;
double amuse;
double edu;
double med;
}ACC;
void MenuDisplay(void);
void EditDisplay(void);//
void load(ACC acc[],int *np);
void save(ACC acc[],int n);
int FindByDate(ACC acc[],int n);
void sort(ACC acc[],int n);
void SortByEarn(ACC acc[],int n);
void SortByPay(ACC acc[],int n);
void SortByBalance(ACC acc[],int n);
void SortByDate(ACC acc[],int n);
void InputRecord(ACC acc[],int i);
void find(ACC acc[],int n);
void del(ACC acc[],int *np);
void add(ACC acc[],int *np);
void edit(ACC acc[],int n);
void DeleteRecord(ACC acc[],int *np);
void output(ACC acc[],int n);
void PrintRecord(ACC acc);
int main()
{
system("color 2E");
ACC acc[N];
int n;
int select;
load(acc,&n);
while(1)
{
MenuDisplay();
scanf("%d",&select);
switch(select)
{
case 1:add(acc,&n);break;
case 2:edit(acc,n);break;
case 3:sort(acc,n);break;
case 4:find(acc,n);break;
case 5:del(acc,&n);break;
case 6:output(acc,n);break;
case 7:
system("CLS");
printf("\n 感谢本次使用,再见!\n");
return 0;
}
}
return 0;
}
void MenuDisplay(void)
{
system("CLS");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用本账簿管理系统☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
printf(" 说明:在本系统中欲执行某功能请输入相应数字!\n\n");
printf(" **********\n");
printf(" * 增添:1 *\n");
printf(" * 修改:2 *\n");
printf(" * 排序:3 *\n");
printf(" * 查找:4 *\n");
printf(" * 删除:5 *\n");
printf(" * 输出:6 *\n");
printf(" * 退出:7 *\n");
printf(" **********\n\n");
printf(" 请选择您要进行的操作:");
}
//将txt中记录复制到数组
void load(ACC acc[],int *np)
{
FILE *fp;
int i;
if((fp=fopen("d:\\account","r"))==NULL)
{
*np=0;
return;
}
for(i=0;fread(&acc[i],sizeof(ACC),1,fp)!=0;i++);
*np=i; //*np记录文件中当前学生数量
fclose(fp);
}
//将数组中记录复制到磁盘
void save(ACC acc[],int n)
{
FILE *fp;
if((fp=fopen("d:\\account","w"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
fwrite(acc,n*sizeof(acc[0]),1,fp);
fclose(fp);
}
//输出信息
void output(ACC acc[],int n)
{
system("CLS");
printf("所有账单信息如下:\n");
int i;
double money=0.0;
double out=0.0;
double in=0.0;
double abasic=0.0;
double aamuse=0.0;
double aedu=0.0;
double amed=0.0;
printf("%8s%10s%10s%10s %10s%9s%9s%10s\n","日期","收入","支出","储蓄","衣食住行","娱乐","教育","医疗");
for(i=0;i<n;i++)
{
PrintRecord(acc[i]);
out+=acc[i].pay;
in+=acc[i].earn;
money+=acc[i].balance;
abasic+=acc[i].basic;
aamuse+=acc[i].amuse;
aedu+=acc[i].edu;
amed+=acc[i].med;
}
printf("\n总收入: %.2f\n",in);
printf("总支出: %.2f\n",out);
printf("总储蓄: %.2f\n",money);
printf("\n总支出占总收入的: %.1f%%\n",out/in*100);
printf("衣食住行支出占总支出的: %.1f%%\n",abasic/out*100);
printf("娱乐支出占总支出的: %.1f%%\n",aamuse/out*100);
printf("教育支出占总支出的: %.1f%%\n",aedu/out*100);
printf("医疗支出占总支出的: %.1f%%\n",amed/out*100);
system("pause");
return;
}
void PrintRecord(ACC acc)
{
printf("%4d-%02d-%02d ",acc.year,acc.month,acc.day);
printf("%9.1f%10.1f%10.1f",acc.earn,acc.pay,acc.balance);
printf("%9.1f%10.1f%10.1f%10.1f\n",acc.basic,acc.amuse,acc.edu,acc.med);
return;
}
//添加记录
void add(ACC acc[],int *np)
{
system("CLS");
char sel='y';
while(sel=='y')
{
InputRecord(acc,(*np)++);
printf("\n 是否继续添加\n\n");
printf(" 是:y 否:n\n");
printf(" 请选择您要进行的操作:");
scanf(" %c",&sel);
}
save(acc,*np);
return;
}
void InputRecord(ACC acc[],int i)
{
printf("\n 请输入第%d天的账单记录\n",i+1);
printf("请输入日期(格式:年 月 日):\n");
scanf("%d%d%d",&acc[i].year,&acc[i].month,&acc[i].day);
printf("请按顺序输入:收入、衣食住行支出、娱乐支出、教育支出、医疗支出\n");
scanf("%lf%lf%lf%lf%lf",&acc[i].earn,&acc[i].basic,&acc[i].amuse,&acc[i].edu,&acc[i].med);
acc[i].pay=acc[i].basic+acc[i].amuse+acc[i].edu+acc[i].med;
acc[i].balance=acc[i].earn-acc[i].pay;
}
//修改记录
void edit(ACC acc[],int n)
{
system("CLS");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用账单修改功能!☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
int index;
index=FindByDate(acc,n);
if(index<0)
{
printf("该日期信息不存在!\n");
system("pause");
return;
}
printf(" 修改前的原记录如下:\n");
printf("%8s%10s%10s%10s %10s%9s%9s%10s\n","日期","收入","支出","储蓄","衣食住行","娱乐","教育","医疗");
PrintRecord(acc[index]);
while(1)
{
int select;
EditDisplay();
scanf("%d",&select);
switch(select)
{
case 1:
printf("\n 请输入收入:");
scanf("%lf",&acc[index].earn);
acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
acc[index].balance=acc[index].earn-acc[index].pay;
save(acc,n);
printf("\n 修改成功!\n");
break;
case 2:
printf("\n 请输入衣食住行支出:");
scanf("%lf",&acc[index].basic);
acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
acc[index].balance=acc[index].earn-acc[index].pay;
save(acc,n);
printf("\n 修改成功!\n");
break;
case 3:
printf("\n 请输入娱乐支出:");
scanf("%lf",&acc[index].amuse);
acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
acc[index].balance=acc[index].earn-acc[index].pay;
save(acc,n);
printf("\n 修改成功!\n");
break;
case 4:
printf("\n 请输入教育支出:");
scanf("%lf",&acc[index].edu);
acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
acc[index].balance=acc[index].earn-acc[index].pay;
save(acc,n);
printf("\n 修改成功!\n");
break;
case 5:
printf("\n 请输入医疗支出:");
scanf("%lf",&acc[index].med);
acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
acc[index].balance=acc[index].earn-acc[index].pay;
save(acc,n);
printf("\n 修改成功!\n");
break;
case 6:return;
}
}
}
void EditDisplay(void)
{
printf("*******************************************************************************\n");
printf("\n 请输入数字来使用相应的功能!\n");
printf(" ***************************\n");
printf(" * 修改收入·······1 *\n");
printf(" * 修改衣食住行支出···2 *\n");
printf(" * 修改娱乐支出·····3 *\n");
printf(" * 修改教育支出·····4 *\n");
printf(" * 修改医疗支出·····5 *\n");
printf(" * 返回主菜单······6 *\n");
printf(" ***************************\n\n");
printf(" 请选择您要进行的操作:");
}
void sort(ACC acc[],int n)
{
while(1)
{
system("CLS");
int i;
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用排序功能!☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
printf(" *********************\n");
printf(" * 按总收入排序··1 *\n");
printf(" * 按总支出排序··2 *\n");
printf(" * 按总储蓄排序··3 *\n");
printf(" * 按日期排序···4 *\n");
printf(" * 返回主菜单···5 *\n");
printf(" *********************\n");
printf(" 请选择您要进行的操作:");
scanf("%d",&i);
switch(i)
{
case 1:
SortByEarn(acc,n);
break;
case 2:
SortByPay(acc,n);
break;
case 3:
SortByBalance(acc,n);
break;
case 4:
SortByDate(acc,n);
break;
case 5:
return;
}
}
}
//排序 收入 asc desc
void SortByEarn(ACC acc[],int n)
{
int i,j,k;
ACC temp;
while(1)
{
system("CLS");
printf("按总收入排序\n");
printf("升序排列:1\n");
printf("降序排列:2\n");
printf("返回上一级:3\n");
printf("请选择您要进行的操作:");
scanf("%d",&k);
switch(k)
{
case 1:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(acc[i].earn>acc[j].earn)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
}
output(acc,n);
break;
case 2:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(acc[i].earn<acc[j].earn)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
}
output(acc,n);
break;
case 3:
return;
}
}
}
//排序 支出
void SortByPay(ACC acc[],int n)
{
int i,j,k;
ACC temp;
while(1)
{
system("CLS");
printf("按支出排序\n");
printf("升序排列:1\n");
printf("降序排列:2\n");
printf("返回上一级:3\n");
printf("请选择您要进行的操作:");
scanf("%d",&k);
switch(k)
{
case 1:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(acc[i].pay>acc[j].pay)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
}
output(acc,n);
break;
case 2:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(acc[i].pay<acc[j].pay)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
}
output(acc,n);
break;
case 3:
return;
}
}
}
//排序 储蓄
void SortByBalance(ACC acc[],int n)
{
int i,j,k;
ACC temp;
while(1)
{
system("CLS");
printf("按储蓄排序\n");
printf("升序排列:1\n");
printf("降序排列:2\n");
printf("返回上一级:3\n");
printf("请选择您要进行的操作:");
scanf("%d",&k);
switch(k)
{
case 1:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(acc[i].balance>acc[j].balance)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
}
output(acc,n);
break;
case 2:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(acc[i].balance<acc[j].balance)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
}
output(acc,n);
break;
case 3:
return;
}
}
}
void SortByDate(ACC acc[],int n)
{
int i,j,k;
ACC temp;
while(1)
{
system("CLS");
printf("按日期排序\n");
printf("升序排列(从早到晚):1\n");
printf("降序排列(从晚到早):2\n");
printf("返回上一级:3\n");
printf("请选择您要进行的操作:");
scanf("%d",&k);
switch(k)
{
case 1:
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(acc[i].year>acc[j].year)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
else if(acc[i].year==acc[j].year)
{
if(acc[i].month>acc[j].month)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
else if(acc[i].month==acc[j].month)
{
if(acc[i].day>acc[j].day)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
}
}
}
}
output(acc,n);
break;
case 2:
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(acc[i].year<acc[j].year)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
else if(acc[i].year==acc[j].year)
{
if(acc[i].month<acc[j].month)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
else if(acc[i].month==acc[j].month)
{
if(acc[i].day<acc[j].day)
{
temp=acc[i];
acc[i]=acc[j];
acc[j]=temp;
}
}
}
}
}
output(acc,n);
break;
case 3:
return;
}
}
}
//查找
void find(ACC acc[],int n)
{
system("CLS");
int k;
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用账单查找功能!☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
k=FindByDate(acc,n);
if(k>=0)
{
printf("\n所查找日期账单如下:\n");
printf("%8s%10s%10s%10s %10s%9s%9s%10s\n","日期","收入","支出","储蓄","衣食住行","娱乐","教育","医疗");
PrintRecord(acc[k]);
printf("\n支出占收入的: %.1f%%\n",acc[k].pay/acc[k].earn*100);
printf("衣食住行支出占总支出的: %.1f%%\n",acc[k].basic/acc[k].pay*100);
printf("娱乐支出占总支出的: %.1f%%\n",acc[k].amuse/acc[k].pay*100);
printf("教育支出占总支出的: %.1f%%\n",acc[k].edu/acc[k].pay*100);
printf("医疗支出占总支出的: %.1f%%\n",acc[k].med/acc[k].pay*100);
}
else
printf("您所输入的日期不存在!\n");
system("pause");
return;
}
//根据日期查找
int FindByDate(ACC acc[],int n)
{
int i;
int year,month,day;
printf("请输入日期:");
scanf("%d%d%d",&year,&month,&day);
for(i=0;i<n;i++)
{
if(year==acc[i].year&&month==acc[i].month&&day==acc[i].day)
return i;
}
return -1;
}
//删除数据
void DeleteRecord(ACC acc[],int *np)
{
int i,index;
index=FindByDate(acc,*np);
if(index<0)
{
printf("您所输入的日期不存在!\n");
system("pause");
return;
}
for(i=index;i<*np-1;i++)
acc[i]=acc[i+1];
(*np)--;
printf("\n删除成功!\n");
save(acc,*np);
system("pause");
return;
}
//删除记录
void del(ACC acc[],int *np)
{
while(1)
{
int i;
system("CLS");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用删除记录功能!☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
printf("删除某天记录:1\n");
printf("返回主菜单:2\n");
printf("请选择您要进行的操作:");
scanf("%d",&i);
switch(i)
{
case 1:
DeleteRecord(acc,np);
break;
case 2:
return;
}
}
}
后续在做补充进行具体说明,,,,,