c语言个人消费管理系统.docx
c语言个人消费管理系统重庆科技学院C语言程序设计课程设计报告 第1章 设计题目的内容、任务及具体要求 1.1 设计题目的内容 明确课程设计的目的,能根据课程设计的要求,查阅相关文献,为完成设计准备必要的知识; 提高学生用高级语言进行程序设计的能力,重点提高用C语言进行文件操作和绘图应用的编程技术水平;初步了解软件开发的一般方法和步骤; 提高撰写技术文档的能力. 1.2 设计题目的任务 主要利用c语言的文件操作能力设计开发一个小型的管理信息系统。至少具备如下功能:个人消费记录登记,消费信息查询和分类统计。操作界面要符合用户的一般习惯,图形或文本界面皆可 1.3设计具体的要求 可以对记录的信息进行添加,修改;能对历史记录进行查询与删除;要求功能界面设计美观,清晰,方便操作. 1).进一步掌握运用C进行程序设计的能力; 2).进一步理解和运用面向过程程序设计的思想和方法; 3).初步掌握开发一个小型实用系统的基本方法; 4).学会调试一个较长程序的基本方法; 5).学会利用互联网查找相关的知识并学习; 1 重庆科技学院C语言程序设计课程设计报告 第2章 总体设计思路 2.1数据录入模块设计 本模块的设计主要包括三个函数,mainmenu(), Record (), Recordxinxi()函数 。 mainmenu()函数主要是对录入数据时录入时录入方法的选择操作。函数在屏幕上显示选择主菜单,以供操作者进行录入选择。 Record ()函数的主要实现程序的初始建库,把数据写如到文件中。其主要过程是一二进制写入文件打开文件,然后调用Recordxinxi()函数,将需要录入的数据从键盘输入到计算机内,然后写入到文件。 2.2查询模块设计 本模块主要设计Seekxinxi()函数、print()函数。 Seekxinxi()函数主要是程序查询菜单的显示、输出你要查询的信息。查询菜单包括输入日期查询、输入名称查询、输入消费类别查询、查询所有历史记录信息。他首先在屏幕显示查询选择菜单,然后利用一个switch选择语句来根据输入的信息以读的方式打开文件,进行读取。如果找到相应的信息,将该信息通过调用print函数将该信息输入到屏幕上,若没找到则显示当前无记录。 Print函数是将信息输出到屏幕上。 2.3信息删除模块设计 本模块的设计是Deletexinxi()函数 ,它主要的功能是删除已有的信息、显示要删除的信息。 Deletexinxi()函数先以录入信息的日期进行历史记录的查找,然后再根据自己要删除的文件输入记录信息的名称,即可将已有的信息删除掉。要是输入有错,屏幕就会显示无次信息,输入有错。要是输入的名称文件存在,屏幕将显示你是否确定删除此条记录,这样就达到删除的功能。 2 重庆科技学院C语言程序设计课程设计报告 2.4数据显示模块设计 本模块主要包括print函数,主要用与输入数据的浏览,将录入文件中的数据输出到屏幕上,其过程是以读的方式打开文件,然后进行读取,将读到的结果显示在屏幕上。若文件中无记录,则显示无此信息,输入有错。 2.5修改已有信息模块设计 本模块主要是Revisexinxi()函数,主要是先根据信息记录日期查找出历史信息记录,然后在历史信息记录中找出要修改的文件,输入消费名称,若输入有错,屏幕会出现无此信息输入有错的提示。若输入的名称正确,此时屏幕会出现提示,是否确定修改此条记录。这样即达到修改的目的。此函数的编写和信息的删除函数差不多,但要把已经修改的信息保持到文件中才能达到修改的目的。 3 重庆科技学院C语言程序设计课程设计报告 2.6总体框价图 信息录入 录入具体信息 信息修改 输入记录日期 输入修改信息 确认修改 输入编号 信息删除 输入记录日期 输入名称删除 确认删除 输日期 信息查询 选查询项目 输名称 输类别 信息保持 输入保存名称 查所有 信息读取 输读取名称 0) 退出 图2.6.1总体框架图 4 重庆科技学院C语言程序设计课程设计报告 第3章 各功能模块流程图 3.1 主函数模块 开始 选择 信息录入模块 输出信息 信息修改模块 信息删除模块 信息查询模块 信息保持模块 信息读取模块 0) 结束 图3.1 总体程序模块运行流程图 5 重庆科技学院C语言程序设计课程设计报告 3.2 调用函数流程图 3.2.1信息的删除 变量和过程 在删除过程中,定义了变量I,j,op,和两个数组char name.char date。在删除过程中先是通过输入日期进行历史纪录查找,然后再通过查找结果输入名称进行删除。 关键代码分析: 该段代码为: int Deletexinxi /信息删除函数 char date50,name30,op; int i,j; system("color 5d"); printf("*n"); printf("请输入要删除的历史记录信息n"); printf(" 信息记录日期:"); scanf("%s",date); for(i=0;i<zd;i+) if(strcmp(date,JiLui.date)=0) print(i); printf("请在以上选择要删除的纪录n"); printf(" 消费名称:"); scanf("%s",name); for(i=0;i<zd;i+) if( strcmp(name,JiLui.name)=0) printf(" 下面的记录将要被删除n"); print(i); printf(" 是否确定要删除这条记录(y/n)? "); printf("n"); op=getchar; if(op='Y' | op='y') for(j=i;j<totalnum-1;j+) 6 重庆科技学院C语言程序设计课程设计报告 JiLuj=JiLuj+1; totalnum-=1; printf(" 信息已删除!nn "); return 1; printf(" 无此信息,输入错误 !n"); return 0; 该删除程序主要通过for循环语句,对输入的内容进行判断,删除是只需在历史查找出来的纪录中输入要删除的名称,在通过函数strcmp进行判断信息是否输入正确,让后再提示是否进行删除操作。 7 重庆科技学院C语言程序设计课程设计报告 信息删除模块图 图3.2信息删除模块流程图 8 重庆科技学院C语言程序设计课程设计报告 3.2.2信息查询模块图 功能:该模块可以查询历史消费记录,查询过程有通过日期查询,通过名称查询,通过类别查询,还可以查询所有历史记录。 关键代码分析: void Seekxinxi /信息查询函数 int i; char opercode,info20; system("color 12"); printf(" 个人消费信息查询nnn"); printf(" 1.输入日期查询 2.输入名称查询 nn "); printf(" 3.输入消费类别查询 4.查询所有历史记录nn"); opercode=getchar; switch(opercode) case '1': printf("输编日期查询:"); scanf("%s",info); for(i=0;i<zd;i+) if(strcmp(info,JiLui.date)=0) print(i); else printf("n当前无记录!nnn"); break; break; case '2': printf("输名称查询:"); scanf("%s",info); for(i=0;i<zd;i+) if(strcmp(info,JiLui.name)=0) print(i); else printf("n当前无记录!nnn"); break; 9 重庆科技学院C语言程序设计课程设计报告 break; case '3': printf("输消费类别查询:"); scanf("%s",info); for(i=0;i<zd;i+) if(strcmp(info,JiLui.type)=0) print(i); else printf("n当前无记录!nnn"); break; break; case '4': if(totalnum !=0 ) printf("所有历史记录显示如下n"); printf("*n"); for(i=0;i<totalnum;i+) print(i); else printf("n当前无记录!nnn"); break; default: printf("n输入错误,请检查!n"); 该函数也是先通过定义switch(opercode)函数,用4条case语句来对信息进行查询,最后通过调用函数print(i)来读查询结果进行输出。 10 重庆科技学院C语言程序设计课程设计报告 流程图: 图3.2.2信息查询模块流程图 上图的流程图上点击IF后的流程图如图3.2.2.1所示: 11 重庆科技学院C语言程序设计课程设计报告 图3.2.2.1查询模块流程图 12 重庆科技学院C语言程序设计课程设计报告 3.2.3信息修改流程图 功能:该函数可对一记录的历史信息进行修改。 关键代码分析: int Revisexinxi /信息修改函数 char date50,name30,op; FOOD pp; int i; system("cls"); system("color 0c"); printf("*n"); printf("请在下面输入要修改的消费信息nn"); printf(" 信息记录日期:"); scanf("%s",date); for(i=0;i<zd;i+) if(strcmp(date,JiLui.date)=0) printf("请在以上选择要修改信息的消费名称n"); printf(" 消费名称:"); print(i); 13 重庆科技学院C语言程序设计课程设计报告 scanf("%s",name); printf("n"); for(i=0;i<zd;i+) if(strcmp(name,JiLui.name)=0) printf(" 下面的记录将要被修改!nn"); print(i); printf(" n请输入修改后的记录值:nn"); Record(&pp); printf(" 是否确定修改此条记录(y/n)? n "); op=getchar; printf(" 无此信息,输入有错!nn"); if(op='Y' | op='y') return 1; JiLui=pp; printf(" 信息已修改!nnn"); 14 重庆科技学院C语言程序设计课程设计报告 return 0; 该函数也是主要通过函数strcmp对信息进行修改,先是输入要修改的名称,在通过函数strcmp进行比较判断是否存在,若存在则通过函数print打印出要修改的信息,最后通过提示输入修改后的新信息。 流程图: 图3.2.3信息修改模块流程图 15 重庆科技学院C语言程序设计课程设计报告 3.2.4信息保存函数流程图 功能:该函数可对输入的信息进行保存。 关键代码分析:int Savexinxi /信息保存函数 char Savename30; FILE *fp=0; system("color 1a"); printf("*n"); printf(" 请输入保存文件的文件名:n"); scanf("%s",Savename); fp=fopen(Savename,"wb"); if(fp=NULL) fwrite(&totalnum,sizeof(int),1,fp); fwrite(JiLu,sizeof(FOOD),totalnum,fp); fclose(fp); printf("注意:%5d记录已经被成功的写入文件:%s!n",totalnum,Savename); printf("*printf("不能保存文件:%sn",Savename); return -1; 16 重庆科技学院C语言程序设计课程设计报告 *n"); 该函数主要通过函数fopen与fowrite对已输入的信息进行保存。 return totalnum; 流程图: 已图3.2.4信息保存模块流程图 17 重庆科技学院C语言程序设计课程设计报告 3.2.5信息读取函数流程图 功能:对一保存好的信息进行读取显示。 关键代码分析: int Readxinxi / 信息读取函数 char Filename30; FILE *fp=0; system("color 6b"); printf("*n"); printf("要读取文件,请输入一个包含完整路径的文件名:n"); scanf("%s",Filename); fp=fopen(Filename,"rb"); if(fp=NULL) fread(&totalnum,sizeof(int),1,fp); fread(JiLu,sizeof(FOOD),totalnum,fp); fclose(fp); printf("注意:%5d记录已从文件%s中成功读取出来!n",totalnum,Filename); printf("不能打开指定的文件:%s,或文件不存在!n",Filename); return -1; 18 重庆科技学院C语言程序设计课程设计报告 printf("*n"); return totalnum; 该函数的实现与上面信息的保存的思路基本上相同 流程图: 图3.2.5信息读取模块流程图 19 重庆科技学院C语言程序设计课程设计报告 第4章 设计效果 4.1进入程序 在下面的屏幕中选择一个功能编号,即可对系统进行相应操作 图4.1系统主界面 4.2 信息的添加 注意:在进行信息记录的过程中,输入消费名称时不能有空格键输入 图4.2息添加模块界面 20 重庆科技学院C语言程序设计课程设计报告 43信息的修改 在主界面上点击修改历史信息纪录后将出现如下所示界面,根据提示即可对历史信息进行修改与保存. 图4.3信息修改模块界面 图4.3信息修改后的界面 21 重庆科技学院C语言程序设计课程设计报告 44信息的删除 图4.3信息的修改界面 45信息的查询 在主页面输入查询功能键,即可对已有信息进行查询 图4.3信息的查询界面 22 重庆科技学院C语言程序设计课程设计报告 46信息的保存 在保存信息时,在要保存的地址后面输入两个然后后面才是文件名. 图4.6信息保存界面 47信息的读取 图4.7信息读取界面 23 重庆科技学院C语言程序设计课程设计报告 第5章 总结 设计体会 这次课程设计虽然只有短短的一周时间,但我却在此过程中获益匪潜。在这期间,我刚开始对于设计非常的茫然,还有在设计过程中面对不熟悉的知识的焦急,更有面对程序运行出错时的惆怅不过当我最后把程序调试出来后,内心有着说不出的狂喜,成果的背后却有一丝丝的艰辛,但辛苦劳动后换来的是成功的喜悦 在程序的前期编译过程中,我感到很茫然,由于以前从来都没设计过这样的大程序,觉得无从下手。不过最后在老师的一点一点的指导下,我渐渐的有了一个大概的思路,寻着这点思路,我边开始我的程序编译。当然,在此过程中,遇到了很多的问题,有时程序编译事没错但就是连接不上,不能运行,于是我有再次细细的修改。这是我深深体会到编程是一件很谨慎的工作,必须要有科学的严谨态度才能避免少出现错误。而且编这样的程序也不是一朝一夕的事,要经过不断的尝试与努力,而且在编的过程中,有点什么灵感就要马上记下来。 一周的时间真是太短暂了,感觉好像一晃就过去了,通过这次的课题设计实践活动真让我获益不少。 24 重庆科技学院C语言程序设计课程设计报告 致谢 在此,我正无比激动的写下这篇感谢辞,因为我已经完成了我的课题设计。我首先要感谢学校给了我一个在这里安心学习的机会,感谢学校提供了一个这么好的平台供我们展示自己的才华,感谢学校为我们提供了这么好的设施,感谢学校对我们的无微关怀还有感谢我的老师,如果没有老师的指导,我也不会这么顺利的的完成我的课题设计感谢我的同学们,在我遇到困难和疑问时,是他们不求回报和耐心的讲解,才让我克服重重困难,完成课题设计我还要感谢我的父母,是他们的殷殷关怀和默默的支持,才让我有机会在这里学习 25 重庆科技学院C语言程序设计课程设计报告 参考文献 1谭浩强等.C语言程序设计教程.北京:高等教育出版社,1997. 2谭浩强.C程序设计.第2版.北京:清华大学出版社,1999. 3郭浩志.C语言程序设计.北京.北京邮电大学出版社,2005. 4林学焦.Turbo C2.0用户手册.北京.学苑出版社,1993. 5谭浩强、张基温. C语言程序设计教程.北京:高等教育出版社,2006. 26 重庆科技学院C语言程序设计课程设计报告 附录 6.1主函数程序代码 int main( ) char choice; int opercode; do mainmenu; choice=getchar; getchar; printf("nnn"); switch(choice) 27 case'1': Recordxinxi; break; case'2': Revisexinxi; break; case'3': Deletexinxi; break; case'4': Seekxinxi; break; case'5': Savexinxi; 重庆科技学院C语言程序设计课程设计报告 break; case'6':Readxinxi; break; case '0': opercode=ExitSystem; if(opercode=1) printf("n系统已经退出!n"); exit(0); else break; default: printf("nn错误的功能编号,请重新输入!n"); while(1); return 0; 6.2数据录入程序代码 void Record (FOOD *pp ) system("color 9d"); printf("请输入信息记录日期(nnnn-yy-rr):n");gets(pp->date); printf("请输入消费名称:n");gets(pp->name); printf("请输入所属类别:n");gets(pp->type); printf("请输入消费次数(次):n");gets(pp->amount); printf("请输入消费所花金额(元):n");gets(pp->price); 28 重庆科技学院C语言程序设计课程设计报告 printf("请输入情况描述:n");gets(pp->describe); void print(int index) void Recordxinxi printf("*system("cls"); if(index>=0&&index<zd) printf(" n"); printf(" 信息记录日期:%-15sn",JiLuindex.date); getchar; printf(" 消费名称:%-15sn",JiLuindex.name); printf(" 消费次数:%-15sn",JiLuindex.amount); printf(" 消费所花金额:%-15sn",JiLuindex.price); printf(" 所属类别:%-15sn",JiLuindex.type); printf(" 情况描述:%-15sn",JiLuindex.describe); printf(" n"); *n"); if(totalnum<zd-1) printf(" 请输入消费信息:n"); Record(&(JiLutotalnum); totalnum+; 29 重庆科技学院C语言程序设计课程设计报告 system("cls"); else printf(" 信息已满!n "); system("cls"); printf("*nnn"); 6.3信息删除程序代码 int Deletexinxi char date50,name30,op; int i,j; system("color 5d"); printf("*n"); printf("请输入要删除的历史记录信息n"); printf(" 信息记录日期:"); scanf("%s",date); for(i=0;i<zd;i+) if(strcmp(date,JiLui.date)=0) print(i); printf("请在以上选择要删除的纪录n"); 30 重庆科技学院C语言程序设计课程设计报告 printf(" 消费名称:"); scanf("%s",name); for(i=0;i<zd;i+) if( strcmp(name,JiLui.name)=0) printf(" 下面的记录将要被删除n"); print(i); printf(" 是否确定要删除这条记录(y/n)? "); printf("n"); op=getchar; if(op='Y' | op='y') printf(" 信息已删除!nn "); return 1; for(j=i;j<totalnum-1;j+) JiLuj=JiLuj+1; totalnum-=1; printf(" 无此信息,输入错误 !n"); return 0; 6.4数据查询程序代码 void Seekxinxi int i; char opercode,info20; system("color 12"); 31 重庆科技学院C语言程序设计课程设计报告 printf(" 个人消费信息查询nnn"); printf(" 1.输入日期查询 2.输入名称查询 nn "); printf(" 3.输入消费类别查询 4.查询所有历史记录nn"); opercode=getchar; switch(opercode) case '1': printf("输编日期查询:"); scanf("%s",info); for(i=0;i<zd;i+) break; if(strcmp(info,JiLui.date)=0) print(i); case '2': printf("输名称查询:"); scanf("%s",info); for(i=0;i<zd;i+) if(strcmp(info,JiLui.name)=0) print(i); break; case '3': printf("输消费类别查询:"); scanf("%s",info); for(i=0;i<zd;i+) if(strcmp(info,JiLui.type)=0) print(i); 32 重庆科技学院C语言程序设计课程设计报告 break; case '4': if(totalnum !=0 ) printf("所有历史记录显示如下n"); printf("*n"); break; for(i=0;i<totalnum;i+) else printf("n当前无记录!nnn"); print(i); default: printf("n输入错误,请检查!n"); 6.5修改程序代码 int Revisexinxi /信息修改函数 char date50,name30,op; FOOD pp; int i; system("cls"); system("color 0c"); printf("*33 重庆科技学院C语言程序设计课程设计报告 *n"); printf("请在下面输入要修改的消费信息nn"); printf(" 信息记录日期:"); scanf("%s",date); for(i=0;i<zd;i+) if(strcmp(date,JiLui.date)=0) printf("请在以上选择要修改信息的消费名称n"); printf(" 消费名称:"); scanf("%s",name); printf("n"); for(i=0;i<zd;i+) if(strcmp(name,JiLui.name)=0) printf(" 下面的记录将要被修改!nn"); print(i); printf(" n请输入修改后的记录值:nn"); print(i); Record(&pp); printf(" 是否确定修改此条记录(y/n)? n "); op=getchar; if(op='Y' | op='y') return 1; 34 JiLui=pp; printf(" 信息已修改!nnn"); 重庆科技学院C语言程序设计课程设计报告 printf(" 无此信息,输入有错!nn"); return 0; 35