C语言课程设计职工信息管理系统程序设计 .doc
C语言课程设计报告 设计题目:职工信息管理系统程序设计课程设计评语2目 录31课程论文题目42程序设计思路43功能模块图54数据结构设计55算法设计66程序代码137程序运行结果228编程中遇到的困难及解决方法259总结心得及良好建议2610致谢26 1 课程论文题目 职工信息管理系统程序设计一、 题目要求 职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。试设计一职工信息管理系统,使之能提供以下功能:(1) 系统以菜单的方式工作。(2) 职工信息录入功能 (职工信息用文件保存)。(3) 职工浏览功能。(4) 职工信息查询功能,查询方式可按学历查询或者工号查询。(5) 职工信息的删除、修改功能(可选项)。2程序设计思路1、设计思路(1)根据题目要求,应该把职工工资信息用结构体形式输入,在定义一个全局变量和文件指针进行整个程序的运行,然后把职工工资信息送到文件中,所以应该提供一个结构体和文件的输入输出等操作;(2)在程序中需实现职工工资浏览、查询、统计等功能的操作,所以需要建立相应的功能模块来实现;(3)另外还需要提供键盘式选择菜单实现功能,在运行时达到所要的目的。 3功能模块图职工信息管理系统信息修改信息查询信息浏览信息录入按学历查询按工号查询5算法设计1主函数提供输入、处理和输出部分的函数调用,各功能模块采用菜单方式选择。开 始显示一系列的功能选择输入n,判断n是否是0到6NY根据n值调用各功能模块2浏览模块【分析】该模块的功能是浏览职工的全部信息显示职工记录(10个一屏)按任意键显示下一屏按任意键返回主菜单3排序模块 开 始输入n判断n是否是0到2NY12浏览职工信息按实发工资排序按工资卡号排序返回?输出12主菜单4查询模块【分析】 该模块的功能是根据输入的职工按照工号和学历查找对应的记录,找到以后,可进行继续查找或修改信息的操作。流程图如下:开 始选择按工号还是学历查询输入职工工号或者学历是否找到职工记录?显示没有找到显示找到的记录询问用户是否继续查找?选择:1)查找另一个 2)修改 3)返回菜单结束5修改模块 【分析】该模块的功能是显示所有职工的信息,考虑到记录较多,建议采用分屏显示。显示完所有记录后,输入要修改的职工的工号,根据工号查到职工的记录,并提示用户修改该记录的哪部分信息,根据用户做的选择修改相应信息。流程图如下:开 始显示所有记录,让用户选择需修改的职工输入需修改的工号i!=0? Y显示找到的记录,调用修改记录询问用户是否继续修改 返回主菜单结束6程序代码#include<stdio.h>#define N 50struct workerchar id50;char name20;char sex10;char age10;char edu20;char salary10;char address20;char tel20;workerN;void save(int n) /保存函数,保存n个记录 FILE *fp; int i; if(fp=fopen("worker.txt","wb")=NULL) /以只写方式为输出打开一个二进制文件 printf("nCannot open filen"); for(i=0;i<n;i+) if(fwrite(&workeri,sizeof(struct worker),1,fp)!=1) printf("file write errorn"); fclose(fp);int load() /加载函数 FILE *fp; int i; if(fp=fopen("worker.txt","rb")=NULL) printf("nCannot open filen"); return NULL; for(i=0;!feof(fp);i+) fread(&workeri,sizeof(struct worker),1,fp); fclose(fp); return(i-1);void no_input(int i,int n) /工号输入函数,i表示第i个职工的信息,n表示比较到第n个职工 int j,k,w1; do w1=0; printf("工号:"); scanf("%s",workeri.id); for(j=0;workeri.idj!='0'j+) if(workeri.idj<'0'|workeri.idj>'9') /判断工号是否为数字 puts("请重新输入!n"); w1=1;break; if(w1!=1) for(k=0;k<n;k+) /比较到第N个职工 if(k!=i&&strcmp(workerk.id,workeri.id)=0) /判断职工号是否有雷同puts("请重新输入!n"); w1=1;break; while(w1=1);void input(int i) /输入一个记录的函数 no_input(i,i); printf("姓名:");scanf("%s",workeri.name); printf("性别:");scanf(" %s",&workeri.sex); printf("年龄:");scanf("%s",&workeri.age); printf("工资:");scanf("%s",workeri.salary); printf("学历:");scanf("%s",&workeri.edu); printf("住址:");scanf("%s",workeri.address); printf("电话:");scanf("%s",workeri.tel);void printf_one(int i) /显示一个记录的函数 printf("%10s %10s %5s %5s %8s %6s %10s %10sn", workeri.id,workeri.name,workeri.sex,workeri.age, workeri.salary,workeri.edu,workeri.address,workeri.tel);void printf_back() /一个任务结束后选择是好似浏览还是返回 int k,w; printf("nntSuccessful-.nn"); printf("接下来做什么?nnt1).浏览全部t2).返回: bb"); scanf("%d",&w); if(w=1)browse(); else menu();modify_data(int i,int n) /修改函数 int c,w1; do puts("nmodify by=>nn 1).工号 2).姓名 3).性别 4).年龄 5).工资 6).学历 7).地址 8).电话 9).取消"); printf("请选择?: bb"); scanf("%d",&c); if(c>9|c<1)puts("nChoice error!please again!");getchar(); while(c>9|c<1); do switch(c) case 1:no_input(i,n);break; case 2:printf("name:");scanf("%s",workeri.name);break;case 3:printf("sex:");scanf("%s",workeri.sex);break;case 4:printf("age:");scanf("%s",workeri.age);break;case 5:printf("salary:");scanf("%s",workeri.salary);break;case 6:printf("edu:");scanf("%s",workeri.edu);break;case 7:printf("address:");scanf("%s",workeri.address);break;case 8:printf("tel:");scanf("%s",workeri.tel);break; case 9:menu();break; puts("nNow:n"); printf_face(); printf_one(i); printf("n确定?nnt1).是 2).否,重新修改 3).不保存退出 bb"); scanf("%d",&w1); if(w1=1)save(n); while(w1=2); return(w1);printf_face() /显示数据结构项目 printf("nt工号 姓名 性别 年龄 工资 学历 地址 电话号码n"); void enter() /输入模块 int i,n; printf("输入多少个职工信息(0-%d):",N-1); scanf("%d",&n); printf("n 请输入职工信息nn"); for(i=0;i<n;i+) input(i); if(i!=0) save(n); printf_back();browse() /浏览模块 int i,j,n; n=load(); printf_face(); for(i=0;i<n;i+) if(i!=0)&&(i%10=0) printf("nn按任意键显示下一页."); getch(); puts("nn"); printf_one(i); printf("t这里有 %d 条记录.n",n); printf("n按任意键返回."); getch(); menu();modify() /修改模块struct worker s;FILE *fp;int i,n,k,w0=1,w1,w2=0;n=load();dok=-1;printf_face();for(i=0;i<n;i+)if(i!=0)&&(i%10=0) /目的是分屏显示printf("nn记住要修改的工号.按任意键显示下一页");getch();puts("nn");printf_one(i); /调用显示一个记录的函数doprintf("nn输入要修改的职工工号! 工号:");scanf("%s",s.id); /输入要修改的IDfor(i=0;i<n;i+) /查找要修改的数据if(strcmp(s.id,workeri.id)=0)k=i; /找到要修改的记录s=workeri; /把workeri备份,以便恢复if(k=-1)printf("nn未找到 请重输");while(k=-1); /当k=-1表示没有找到printf_face(); /调用显示数据结构项目的函数printf_one(k); /调用显示一个记录的函数w1=modify_data(k,n); /修改记录并返回保存控制值w1,w1=1表示用户已确认修改if(w1=1)printf("Successful_.nn修改另一个?nnt1).是 2).否,保存退出t bb"); scanf("%d",&w0); w2=1; /用来控制保存,使w2=1是标记已有过修改elsew0=0;if(w2=1)workerk=s;if(w0!=1&&w2=1)save(n);while(w0=1);menu();search() /查询模块 int c,w1; do puts("nsearch by=>nn1).工号 2.学历 3).取消并返回"); printf("Which you needed?: bb"); scanf("%d",&c); if(c>3|c<1) puts("nchoice error!please again!"); getchar(); while(c>3|c<1); switch(c) case 1:search1();break; case 2:search2();break; case 3:menu();break; search1() /按工号查询模块int i,n,k,w1=1,w2,w3,w4; struct worker s; n=load(); do do k=-1; printf("nn输入要查询的工号! id:"); scanf("%s",s.id); printf_face(); for(i=0;i<n;i+) if(strcmp(s.id,workeri.id)=0)k=i; printf_one(k);break; if(k=-1) printf("nnNo exit!please"); printf("nn继续查找?nt1).是 2).否,返回 bb"); scanf("%d",&w1); if(w1=2) menu(); while(k=-1&&w1=1); w4=0;w3=0; if(k!=-1)printf("nn接下来干什么?nt1).查找另一个 2).修改 3).返回菜单 bb"); scanf("%d",&w2); switch(w2) case 1:search1();break; case 2:w3=modify_data(k,n);break; case 3:menu();break; while(w2=1); menu();search2() /按学历查询模块int i,n,k,w1=1,w2,w3,w4; struct worker s; n=load(); do do k=-1; printf("nn请输入你要查询的学历:n"); scanf("%s",s.edu); printf_face(); for(i=0;i<n;i+) if(strcmp(s.edu,workeri.edu)=0)k=i; printf_one(k); if(k=-1) printf("nnNo exit!please"); printf("nn继续查找?nt1).是 2).否,返回 bb"); scanf("%d",&w1); if(w1=2) menu(); while(k=-1&&w1=1); w4=0;w3=0; if(k!=-1)printf("nn接下来干什么?nt1).查找另一个 2).修改 3).返回菜单 bb"); scanf("%d",&w2); switch(w2) case 1:search2();break; case 2:w3=modify_data(k,n);break; case 3:menu(); break; while(w2=1); menu(); menu() int n,w1; do puts("tt*菜单*nn");puts("tttt1.录入职工信息");puts("tttt2.浏览职工信息");puts("tttt3.查询职工信息"); puts("tttt4.修改职工信息");puts("tttt5.退出");puts("tt*nn");printf("请选择(15): bb");scanf("%d",&n); if(n<1|n>5) /对选择的数字作判断 w1=1;getchar(); else w1=0; while(w1=1); switch(n)case 1:enter();break; /录入 case 2:browse();break; /浏览 case 3:search();break; /查询 case 4:modify();break; /修改 case 5:exit(0); /退出main() menu();7程序运行结果 下面是各个模块的的界面截图(1)、主菜单(2)、输入模块(3)、浏览模块(3)、查找模块(4)、修改模块8.编程中遇到的困难及解决方法 温故而知新,可以为师矣。通过这次实习我深刻的认识了这点。这学期学习了C语言,了解了一些计算机语言方面的知识。借这次上机实习之际我又把课程重新复习了一遍,收获颇丰,以前没能弄懂的一些问题现在已有了一些认识,以前不太明白的问题现在也基本清楚了,虽然实习的题目对我来说还有些难,最终能在自己的努力下完成这次实习实感欣慰。以前遇到大的程序,心中总是有种恐惧感,不相信是自己的能力所能完成的,也没有胆量去尝试,这次正好也帮我克服了这种恐惧感,使我相信无论什么事只要自己真的下决心去做,都是可以做到的,即使不能一次成功,也不能放弃,失败的尽头一定有成功在等着我们的,失败乃成功之母。 实践总是检验真理的唯一方法,学了再多的知识不会运用,就如同鸟儿长了翅膀却不会飞翔。学习C语言就是为了运用它帮助我们解决一些日常生活中遇到的问题,而此次的课程设计就为我们提供了检验自己能力的一次机会,也给了我们一次弥补以前缺陷的机会。总而言之,这次课程设计使我获益匪浅啊。 我对VC使用操作的心得可以归结为以下几点:(1)在设计一些较复杂的程序时,要尽量采用程序模块,采用函数的相互调用,将一些调用次数较多的函数作为公共函数,放在整个程序的开头处,这样就免去了在调用时的声明,可以减少错误的出现。(2)尽可能将主函数设计得简洁一些,以便在调试程序时较容易找出错误。(3)采用菜单方式能够以最简洁的方式将程序内容呈现在用户眼前,并且,要尽可能地给出较详细较全面的使用提示,在每一次执行下一步骤是都要给出使用者具体的提示,以增加程序的实用性,而不只是让编程者看得懂。(4)一个程序的算法和数据结构虽然是最重要的,但是,作为一个实用性的软件或程序,要考虑到使用者的方便性,所以,要注意程序运行界面的美化工作,即:注意换行的位置,注意行距,数据在屏幕中的位置,菜单的显示方式,选项的排列方式等,还有,要在每次执行完一项指令后,要使函数运行界面返回到菜单,等等,这些问题也是编写一个好的程序必不可少的工作。 9总结心得及良好建议 经过一学期的C语言学习,我们掌握了C语言的基础知识,能够读懂别人用c语言设计的程序。平时的程序设计大多是以填空的形式出现,虽然有所接触,但都不完全。而这一周的课程设计,却让我们完完全全用自己学到的知识编写一个完整的体统程序。这是一个新的挑战,也是一种新的学习。 我们组选择的题目是第一个职工工资信息管理系统。初看到这个题目觉得很简单,但当我做到电脑前准备开始编写代码的时候才发现无从下手。通过去图书馆查找程序设计相关的书籍,和上网参考前人编写的类似程序,我脑中才有了一个大概方向。 终于开始着手写了。第一天下来,我只写好了两个函数,但还是很开心,因为这是我编的第一个小系统的成功的开始! 接下来几天都在宿舍整个下午的对着电脑不断的编译、调试、修改,每次编好一个能够成功运行的程序,都会感到很欣慰,但自己编的程序自己很难发现当中的错误,而电脑又没有提示的时候就很受打击,也会着急。但可以先放一放,让脑子休息一下,忘掉错误的记忆。或许等过段时间再回过头来,就会很容易的发现之前的错误了。随着编好的程序越多,累积的经验也越多,查找错误就越快了。还有会发现很多程序有很多相似之处,可以通过复制修改的发式来编写。虽然题目要求只需要一种查询方式,但当我编出规律之后自然就想多写两个,写完就会有很大的成就感了。 有一次发现之前辛辛苦苦编的两段代码没有保存。没办法,只能重新写。 总之,经过这一次的课程设计,我体会到成功的来之不易。当最后一次成功串联运行所有函数时,真的很开心。通过这次实践,我们能够更熟练掌握C语言,特别是循环和文件,当时在课堂上没有学太清楚的,这个程序设计之后都很明白了。同时增加了我们对程序设计的兴趣,暑假回家我还会尝试着做一些其他的小系统。C语言是一个有序的学习,学了最基本的替换,然后扩展到循环、嵌套,条例很清楚,不是一个零散的知识,实际爱好难过所有的客车个都如此,不过通过实习我也知道了自己的不足,存在很多的问题。比如自己些的小程序出了问题,不会了就叫老师或同学帮忙,虽然这样能节约时间,但是会样成一种依赖心理,碰到问题就是首先想到求助而不是自己解决,所以以后要多多锻炼自己的信心和增加自己的能力,争取可以做到自己可以做到一些简单的程序编写和错误排除。还有自己的基础知识不扎实,遇到的问题,没有很好的逻辑思维,亲手编写一个新的程序的时候会有种没法下手的感觉,找不到突破口,通过实习逐渐理清了顺序,对于简单的程序和相对比较繁琐的嵌套、循环,不再是看着一头雾水。其实知识理清了思路把基础知识掌握了,然后有条不紊地分析,一步一步理解,C语言还是很有意思的课程。“学习C语言主要是学习它的逻辑思维。”上课的时候老师就说,“不管以后从事什么行业,学习C语言都对自己的职业很有帮助。”初步接触C语言的时候,觉得甚是无聊,通过实习,摆脱了那种似懂非懂的状态!希望以后还会有更多类似的实习课程,在有限的大学时间学到更多的实用技能,为以后的工作打下良好基础。10致谢通过短短几天的C语言实习,我不仅巩固了基础知识,并有这样的一个机会自己独立编写程序,自学能力得到了很大的培养。在实习过程中,首先我要感谢老师,理论课老师通俗易懂的教学方法使得我把所学知识掌握牢固,实习阶段的老师耐心解答我们的问题。最后,我还要感谢给我帮助的同学,在一些程序问题上,我和同学交流经验,学到了很多在书本上学不到的东西,对一些自己学习的盲区进行了攻破,充分认识到自己的不足,提高了很多。所以,我真的感谢在这次实习中和我互相帮助的人!