个人账簿管理系统
在本次的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; } } } 后续在做补充进行具体说明,,,,,