课程设计账户管理系统(3)
2011-11-28 13:11
288 查看
个人帐簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的月份查询每月的收支情。
关于本次课程设计虽然做得有些急,但是主要的功能还是实现了,虽然比较简单,但是还是遇到好多问题,有语言上的基本问题,有算法设计上的问题,在开始由于要求比较高而且想于要快,就是前面两个的原型主要功能没有实现,最后用啦一个简单的方法把功能实现了,钱面两个就是初步实现功能的,但是效率不是很好,比如用到数组保存数据,但是主要功能的到实现了,这次就把数组的固定内存分配问题改为用单链表实现动态空间分配,由于是数据结构的课程设计,这也是老师要求的吧。对于这次的还是基本满意的,但还是有许多需要优化的地方,因为考试较多,就没有经行优化,也厚有时间再来优化,排版上也有好多问题,这次课程设计有好多感悟,今天写完的代码在今天晚上睡觉后明天起来就觉得不行了,就要删掉,有时候这种感觉就是要把所有的代码都要删掉,流程模块都要重新设计,对这中事情又爱又恨,但还是觉得重新设计比较好,这样的收获也比较大,最终付出了努力,收获还是蛮大的,下面还是把代码弄出来吧,本来代码是分还多文件的,我只能把他们合并后再贴上来,这样就更没层次了。
PS:代码有许多不当,注意不是有语法或逻辑之类的错误,而是设计上的不当,恳请指出!
关于本次课程设计虽然做得有些急,但是主要的功能还是实现了,虽然比较简单,但是还是遇到好多问题,有语言上的基本问题,有算法设计上的问题,在开始由于要求比较高而且想于要快,就是前面两个的原型主要功能没有实现,最后用啦一个简单的方法把功能实现了,钱面两个就是初步实现功能的,但是效率不是很好,比如用到数组保存数据,但是主要功能的到实现了,这次就把数组的固定内存分配问题改为用单链表实现动态空间分配,由于是数据结构的课程设计,这也是老师要求的吧。对于这次的还是基本满意的,但还是有许多需要优化的地方,因为考试较多,就没有经行优化,也厚有时间再来优化,排版上也有好多问题,这次课程设计有好多感悟,今天写完的代码在今天晚上睡觉后明天起来就觉得不行了,就要删掉,有时候这种感觉就是要把所有的代码都要删掉,流程模块都要重新设计,对这中事情又爱又恨,但还是觉得重新设计比较好,这样的收获也比较大,最终付出了努力,收获还是蛮大的,下面还是把代码弄出来吧,本来代码是分还多文件的,我只能把他们合并后再贴上来,这样就更没层次了。
/* * Count.c * * 个人帐簿管理系统设计 1.0 * 个人帐簿管理系统记录某人每月的全部收入及各项开支情况, * 包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。 * 进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序, * 可以根据输入的月份查询每月的收支情况。 * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define MONTH 20 /*账户开支信息*/ struct Count{ int month; //月份 float income; //总收入 float outcome; //总支出 float food; //食品消费 float rent; //房租 float education; //子女教育费 float water; //水电费 float hospital; //医疗费 float save; //储蓄 float other; //其他 }; struct Node { struct Count acount; struct Node *next; //指向下一个月的信息节点 }; typedef struct Node *PNode; typedef struct Node *LinkList; typedef struct LinkList *PLinkList; int MenuSlect(); int EndWithZero(); int IsMonthExist(char *name,int month); int IsCountExist(char* name); void AboutIt(); void NewCount(); void LoadCount(char*); void SortCount(char *); void LookCount(char *); void LookMonthCount(char *,int); void ResetMonthCount(char *); void AddMonthData(char *name); void ReadCount(char *,LinkList *); void OutputCount(LinkList countlist); void SaveToFile(char *name,LinkList plist); struct Count InputData(int ); LinkList BubbleMonthSort(LinkList head); void AboutIt(){ FILE *fp; char ch; fp = fopen("about.txt","r"); printf ("\n"); while((ch=getc(fp)) != EOF) printf("%c",ch); fclose(fp); printf("\n按任意键继续......."); getch(); system("cls"); } /*按月添加数据到文件末尾*/ void AddMonthData(char *name) { FILE *fp; int mon,i; int month; LinkList countlist; //账户节点 countlist = (LinkList) malloc (sizeof (struct Node)); struct Count myCount; printf("输入要添加的月份数目:"); scanf("%d",&mon); /*把刚添加的数据写入到文件*/ for(i=0;i<mon;i++) { printf("输入要添加的月份:"); scanf("%d",&month); myCount.month = month; while(1) { if(IsMonthExist(name,month)){ printf("月%d的账户信息已经存!\n",month); break; } else { myCount = InputData(month); fp = fopen(name,"a"); fprintf(fp,"%-4d%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f\n", myCount.month,myCount.rent,myCount.education, myCount.water,myCount.hospital,myCount.save, myCount.other,myCount.outcome); fclose(fp); ReadCount(name,&countlist); BubbleMonthSort(countlist); SaveToFile(name,countlist); break; } } } return ; } void RmCount() { char name[15]; int isRm; printf("请输入要删除账户:"); gets(name); isRm = remove(name); if(isRm == 0) { printf("账户删除成功!"); } else printf("账户删除失败!"); printf("按任意键继续...."); getch(); } int main() { system("color fd"); char name[16]; printf("\t\t欢迎使用天才账户管理系统,祝你愉快!\n"); while(1) { out: switch(MenuSlect()) { case 1: system("cls"); NewCount(); //新建账户 break; case 2: system("cls"); printf("请输入你的账户名:"); while(1) { gets(name); if (!IsCountExist(name)) { printf("账户不存在,请核对或者选择1新建账户:"); goto out; } break; } LoadCount(name); //登录账户 break; case 3: system("cls"); RmCount(); //删除账户 break; case 4: system("cls"); AboutIt(); //关于我们 break; case 0: exit(0); //退出 } } printf("\n退出系统!按任意键关闭窗口......"); getch(); return 0; } int EndWithZero() { char ch[2]; int zero; printf("\n按0返回,或者按其他任意键继续......"); scanf("%s",ch); zero = atoi(ch); return zero; } struct Count InputData(int m) { struct Count myCount; myCount.month = m; printf("%20s","输入房租:"); scanf("%f",&myCount.rent); printf("%20s","输入子女教育费:"); scanf("%f",&myCount.education); printf("%20s","输入水电费:"); scanf("%f",&myCount.water); printf("%20s","输入医疗费:"); scanf("%f",&myCount.hospital); printf("%20s","输入储蓄费:"); scanf("%f",&myCount.save); printf("%20s","输入其他费用:"); scanf("%f",&myCount.other); myCount.outcome = myCount.rent + myCount.education + myCount.water + myCount.hospital + myCount.save + myCount.other; return myCount; } /*判断账户是否存在*/ int IsCountExist(char* name) { FILE *fp; if((fp = fopen(name,"r")) != NULL) return 1; else return 0; } int LoadSlect() { int n; char ch[4]; //system("cls"); printf("\n\t\t 查询菜单"); printf("\n\t\t 1.查询个人账户信息"); printf("\n\t\t 2.添加个人账户信息"); printf("\n\t\t 3.修改个人账户信息"); printf("\n\t\t 4.对每月总支出排序"); printf("\n\t\t 5.查询某月账户信息"); printf("\n\t\t 0.返回"); printf("\n\t\t\t根据功能菜单选择相应的操作0--5:"); while(1) { scanf("%s",ch); n = atoi(ch); if(n>=0 && n<=5) break; printf("\t\t\t选择错误,请重新选择0--5:"); } return n; } void LoadCount(char *name) { int month; printf("\n\t登录成功!欢迎你%s你可以对你的账户进行如下管理:",name); while(1) { switch(LoadSlect()) { case 1: system("cls"); LookCount(name); break; case 2: system("cls"); AddMonthData(name); printf("\n\t\t\t账户添加完成,请按任意键继续......"); getch(); system("cls"); break; case 3: system("cls"); ResetMonthCount(name); break; case 4: system("cls"); SortCount(name); break; case 5: system("cls"); printf("\t\t\t请输入要查看的月:"); scanf("%d",&month); LookMonthCount(name,month); printf("\n\t\t\t账户按月查看完成,请按任意键继续......"); getch(); system("cls"); break; case 0: printf("\n\t\t\t账户成功退出!"); printf("\n\t\t\t按任意键继续......."); getch(); system("cls"); return ; } } } LinkList BubbleMonthSort(LinkList head) { struct Node *p,*q,*tail,*s; tail = NULL; while(head->next != tail) { p= head; q= p->next; while(q->next != tail) { /*相邻两个节点比较,满足就交换*/ if(p->next->acount.month > q->next->acount.month) { s= q->next; p->next = q->next; q->next = q->next->next; p->next->next = q; q = s; /*实现链表的向前移动*/ } p = p->next; q = q->next; } tail = q; } return head; } void SaveToFile(char *name,LinkList plist) { FILE *fp; LinkList tp; fp = fopen(name,"w"); fprintf( fp," %s你好!欢迎使用天才账户管理系统,你的账户信息如下:\n",name); fputs( "月份 房 租 子女教育 水电费 医 疗 储 蓄 其 他 总支出\n",fp); tp = plist; tp = tp->next; while((tp != NULL) ) { fprintf(fp,"%-4d%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f\n", tp->acount.month,tp->acount.rent,tp->acount.education, tp->acount.water,tp->acount.hospital,tp->acount.save, tp->acount.other,tp->acount.outcome); tp = tp->next; } fclose(fp); } /*判断输入的月份month账户是否存在*/ int IsMonthExist(char *name,int month) { LinkList countlist; PNode p; //账户节点 countlist = (LinkList) malloc (sizeof (struct Node)); ReadCount(name,&countlist); p = countlist; p = p->next; while((p != NULL)) { if(p->acount.month == month) return 1; p = p->next; } return 0; } void LookCount(char *name) { //FILE fp; LinkList countlist; //账户节点 countlist = (LinkList) malloc (sizeof (struct Node)); ReadCount(name,&countlist); BubbleMonthSort(countlist); printf("\n %s你好!欢迎使用天才账户管理系统,你的账户信息如下:",name); puts( "\n月份 房 租 子女教育 水电费 医 疗 储 蓄 其 他 总支出"); SaveToFile(name,countlist); OutputCount(countlist); printf("\n\t\t\t账户查看完成,请按任意键继续......"); getch(); system("cls"); } void LookMonthCount(char *name,int month) { //int month; PNode p; LinkList countlist; //账户节点 countlist = (LinkList) malloc (sizeof (struct Node)); ReadCount(name,&countlist); p = countlist; p = p->next; while((p != NULL)) { if(month == p->acount.month) { printf(" %s你好!你%d月的账户信息如下:",name,month); puts("\n月份 房 租 子女教育 水电费 医 疗 储 蓄 其 他 总支出"); printf("%-4d%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f\n", p->acount.month,p->acount.rent,p->acount.education, p->acount.water,p->acount.hospital,p->acount.save, p->acount.other,p->acount.outcome); return ; } else p = p->next; } printf("\t\t\t对不起你要查看的月份不存在,你可以选择2添加账户信息"); } int MenuSlect() { char ch[4]; int n; printf("\n\t\t 主功能菜单 "); printf("\n\t\t 1.新建个人账户 "); printf("\n\t\t 2.登录个人账户 "); printf("\n\t\t 3.删除个人账户 "); printf("\n\t\t 4.关于我们 "); printf("\n\t\t 0.退出程序 "); printf("\n\t\t根据功能菜单选择相应的操作0--3:"); while(1) { gets(ch); n = atoi(ch); if(n>=0 && n<=4) break; else printf("\t\t\t选择错误,请重新选择0--4:"); } return n; } void NewCount(){ FILE *fp; char name[10]; printf("\t\t\t输入账户名:"); gets(name); if (IsCountExist(name)){ printf("\t\t\t账户已经存在!请进行其他操作!\n"); return ; } /*账户不存在新建账户*/ fp = fopen(name,"w"); fprintf( fp," %s你好!欢迎使用天才账户管理系统,你的账户信息如下:\n",name); fputs( "月份 房 租 子女教育 水电费 医 疗 储 蓄 其 他 总支出\n",fp); fclose(fp); AddMonthData(name); printf("\n\t\t\t新建账户完成!按任意键继续....."); getch(); } void OutputCount(LinkList countlist) { PNode p; p = countlist; p = p->next; while((p != NULL)) { printf("%-4d%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f\n", p->acount.month,p->acount.rent,p->acount.education, p->acount.water,p->acount.hospital,p->acount.save, p->acount.other,p->acount.outcome); p = p->next; } } void ReadCount(char *name,LinkList *plist) { FILE *fp; char ch; PNode p,q,tp; tp = (PNode) malloc (sizeof (struct Node)); q = (PNode) malloc (sizeof (struct Node)); if(NULL == q) { printf("\n\t\t\t内存错误!"); return ; } *plist = q; q->next = NULL; fp = fopen(name,"r"); while((ch=fgetc(fp)) != (int)'\n'); //跳过第一行 while((ch=fgetc(fp)) != (int)'\n'); //跳过第二行 while(1) { if((ch=fgetc(fp)) == EOF) break; if((ch=fgetc(fp)) == EOF) break; else fseek(fp,-2,SEEK_CUR); /*从文件中读出数据到单链表中*/ p = (PNode) malloc (sizeof (struct Node)); if(NULL == p) { printf("\n\t\t\t内存错误"); exit(0); } fscanf(fp,"%d%f%f%f%f%f%f%f", &p->acount.month, //&p->acount.food, &p->acount.rent, &p->acount.education, &p->acount.water, &p->acount.hospital, &p->acount.save, &p->acount.other, &p->acount.outcome); p->next = q->next; q->next = p; q = p; } fclose(fp); } void ResetMonthCount(char *name) { PNode tp,p,temp; int month; LinkList countlist; ReadCount(name,&countlist); tp = (PNode) malloc (sizeof (struct Node)); tp->next = NULL; /*判断要重置的月份是否存在*/ printf("\t\t\t输入你要修改的月份:"); scanf("%d",&month); if(IsMonthExist(name,month)) { LookMonthCount(name,month); printf("\n\t\t\t开始修改,请输入修改后的信息:\n"); tp->acount = InputData(month); p = countlist; while((p->next != NULL)) { if(p->next->acount.month == month) { temp = p->next->next; //最容易有bug的地方 p->next = tp; tp->next = temp; SaveToFile(name,countlist); break; } p = p->next; } printf("\t\t\t账户修改完成,"); } else { printf("\t\t\t你需要修改的月份不存在,返回!"); } printf("\t\t\t请按任意键继续......"); getch(); system("cls"); } LinkList BubbleOutcmeSort(LinkList head) { struct Node *p,*q,*tail,*s; tail=NULL; while(head->next!=tail) { p=head; q=p->next; while(q->next!=tail) { if(p->next->acount.outcome>q->next->acount.outcome) { s=q->next; p->next=q->next; q->next=q->next->next; p->next->next=q; q=s; } p=p->next; q=q->next; } tail=q; } return head; } void SortCount(char *name) { LinkList countlist; //账户节点 countlist = (LinkList) malloc (sizeof (struct Node)); ReadCount(name,&countlist); BubbleOutcmeSort(countlist); printf(" %s你好!你的账户支出排序情况信息如下:\n",name); puts("月份 房 租 子女教育 水电费 医 疗 储 蓄 其 他 总支出\n"); OutputCount(countlist); printf("\n\t\t\t账户支出排序完成,请按任意键继续......"); getch(); system("cls"); }
PS:代码有许多不当,注意不是有语法或逻辑之类的错误,而是设计上的不当,恳请指出!
相关文章推荐
- 课程设计账户管理系统(2)
- 课程设计账户管理系统(1)
- C语言课程设计---歌厅歌曲管理系统
- 数据库课程设计(电脑配件库存管理系统)
- 数据库课程设计_实验室管理系统_设备报废查询
- 超市商品管理系统(课程设计)
- C语言课程设计—图书管理系统
- C++课程设计报告--通讯录管理系统
- 数据结构实践课程设计【通讯录管理系统】
- 人事管理系统(数据库课程设计)
- 数据结构课程设计-学生信息管理系统
- 数据结构课程设计—图书信息管理系统
- 课程设计之医药管理系统
- C++课程设计:学生成绩管理系统
- Java课程设计—学生成绩管理系统(54号童欢)
- 课程设计:大学生信息管理系统
- 课程设计--考试报名管理系统
- C语言课程设计---歌厅歌曲管理系统
- 课程设计--学生信息管理系统
- 数据结构课程设计-ytu职工信息管理系统