C语言实践之职工信息录入_第1页
C语言实践之职工信息录入_第2页
C语言实践之职工信息录入_第3页
C语言实践之职工信息录入_第4页
C语言实践之职工信息录入_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计课程实践报告职工信息管理系统设计班 级:学 号:学生姓名:指导老师:日 期: 1 ·设计目标.本小组的设计题目是职工信息管理系统的设计,使系统以菜单方式工作,该题目主要需要完成对职工信息的录入、查询、修改、删除和统计功能。1.查询需要满足能按工号查询,按姓名查询,按电话号码查询,按工资多少排序查询并输出。2.修改需要满足准确输入员工工号之后能按意愿修改所需要修改的部分,并完成保存。3.删除需要满足能按员工工号进行删除,并在删除之后重新完成保存。4.统计需要完成对姓名、性别、年龄、学历、工资、住址相同的人数的统计。开始2 总体设计建立并打开一个文件 录入数据并保存重新打开

2、该文件统计删除修改查询关闭文件重新保存并关闭文件结束3. 详细设计1.信息采用结构体数组Work实现,包括SIZE(定义20)个员工数据 #include <stdio.h> /*标准输入输出函数库*/ #include <stdlib.h> /*标准函数库*/ #include <string.h> /*字符串函数库*/ #define SIZE 20 /*预处理指令,定义个数*/struct Work_type /*定义关于职工的结构体*/int num; /*职工工号*/char name20; /*职工姓名*/char sex10; /*职工性别*/

3、int age; /*职工年龄*/char degree15; /*职工学历*/int money; /*职工工资*/char adde15; /*职工住址*/int tel; /*职工电话*/ WorkSIZE,max; /*变量名列表*/2.定义保存函数开始 打开文件是否有该文件 Y N输出cannot open file打开并执行所需操作结束开始3.定义主界面函数即face函数 利用printf函数输出各种功能的选择 输入n调用统计函数调用删除函数调用修改函数调用查询函数调用录入函数 n=1 n=2 n=3 n=4 n=5结束4.定义录入函数开始是否有该文件 Y N 打开并写入数据并保存

4、输出cannot open file结束开始5.定义查询函数 输入n调用工资排序函数调用个体查询函数调用全体查询函数结束开始5.a全体查询函数 是否有该文件 打开并且将数据显示到屏幕上输出cannot open file Y N 结束开始5.b.1定义个人查询中按工号查询函数打开文件 输入n判断工号是否和n相等 Y N 将该工号员工的信息输出到屏幕上回到主菜单结束5.b.2.定义个人查询中按名字查询函数开始打开文件输入姓名判断文件中是否和输入姓名相同的人 Y N将该工号员工的信息输出到屏幕上回到主菜单结束5.b.3定义个人查询中按手机号查询开始打开文件输入姓名判断文件中是否有员工的手机和输入的

5、n相同 Y N将该工号员工的信息输出到屏幕上回到主菜单 结束5.c按工资高低排序并输出的函数(需要先打开文件work.dat) i=0 Worki.money<Workj.money是 否max=WorkiWorki=WorkjWorkj=max直到i>SIZEi=0依次输出Workii=i+1直到i>SIZE6定义修改函数(需要先打开文件work.dat) 输入一个整数ni=0 Worki.num=n是 否选择要修改的部分(1.工号,2.姓名,3.性别,4.年龄,5.学历,6.收入,7.住址,8.电话)输入一个数aif(a=1) 重写工号;if( a=2) 重写姓名;if(

6、 a=3) 重写性别;if (a=4) 重写年龄;if( a=5) 重写学历;if (a=6) 重写收入;if (a=7) 重写地址;if (a=8) 重写电话;直到i>SIZE调用save函数 7.定义删除函数(需要先打开文件work.dat)输入一个数ni=0是 否 Worki=Worki+1i=i+1 直到i>SIZE调用save函数8.定义统计函数(需要先打开文件work.dat,定义一个一维数组d6=0,0,0,0,0,0)a=0b=a+1if(strcmp(W,W)=0) d0+;if(strcmp(Worka.sex,Workb.s

7、ex)=0) d1+;if(Worka.age=Workb.age) d2+;if(strcmp(Worka.degree,Workb.degree)=0) d3+;if(Worka.money=Workb.money) d4+;if(strcmp(Worka.adde,Workb.adde)=0) d5+;直到b>SIZEprintf("姓名相同的有%d人n",d0);printf("性别相同的有%d人n",d1);printf("年龄相同的有%d人n",d2);printf("学历相同的有%d人n",d3

8、);printf("工资相同的有%d人n",d4);printf("住址相同的有%d人n",d5);4. 调试与测试a.调试方法:打开Microsoft Visual C+ 6.0,先将各个功能函数的的内容清空,只保留主函数main(),然后编译检验main()函数中是否有错,如果没有错误,再连接、运行。确认main()函数一切无误后,然后加入功能函数face()函数、save()以及input_data()函数,由于face()函数与save()函数比较简单,所以与input_data()函数一起进行调试,save()函数中主要注意读取文件,与写入文件

9、,这都是二进制的形式。若main()函数、face()函数以及save的()函数编译、连接、运行没问题,继续加入find_data()函数,就这样方法依次检查调试repair_data()函数、del_data()函数以及count_data()函数。当所有的功能函数都加上且正确无误时,就可以进入下一个环节程序的测试。b.测试方法:运行程序,然后进入职工信息管理系统的界面,在这里需要做的就是把自己当成一个企业人事管理者,来对该程序进行使用,看该程序有哪些方面用着不够完善,把这些问题依次整理出来,再对源程序进行修改,在这个过程中也需要对程序进行调试,不过不必将各个功能函数的的内容清空再进行如上述

10、的调试方法,而是,改一部份运行一次,看是否有无。如input_data()函数有误,则先修改input_data()函数,一块一块的进行修改,就是遵循C语言的模块化设计原理,若所有的都改过来了,且运行无误,那就大功告成了。c.在调试中遇到的问题:在调试过程中,我遇到了诸多问题,很多在老师的帮助以及自己翻阅资料下解决了问题1:标点符号在输入的时候,使用的是中文输入法,这种错误一般都难以发现,让修改的时候找不到目标。解决方法:用“替换”。如果程序中的error很多,不管error是什么,先将标点替换成英文的标点。问题2:调试时,有的时候编译后没什么问题,就是在点击连接link时出现了错误。而且,这

11、种错误让我们不知道怎么修改。但是我们的程序的确正确。解决方法:首先检查是否将运行窗口关闭,若关闭后任然不行则将源程序保存(save),然后关掉win-vc,重新启动win-vc。问题3:在调试时,编译等都不出现问题,但是在进行调用input_data()录入时,却总出现问题,不能完整预想的录入。解决方法:首先看是不是在save()函数中,输入完一次后就讲文件关闭,即将fp(close)函数放在for()循环之内。接着看是不是在scanf()函数中指明变量地址时候出错,若是数组变量则不加“&”,若非数组变量则需要加“&”。修改完成后再次编译,调试,看是否能正确录入了。问题4:在定

12、义修改函数时,起初只能实现整条记录的修改,不能做到想改什么改什么。解决方法:利用switch-case语句,通过输入不同的数字进而实现不同部分的修改,真真做到想改什么改什么。问题5:在定义删除函数时,虽然删除了想删除的记录,但是依旧输出SIZE条记录,只是最后一条是(“0 0 0 ”)。解决方法:在save()函数中,增加条件将工号不为0的输出。问题6:定义统计函数时,对于if()函数后面的条件判断没有错误,但是运行时却怎么也得不到想要的结果。解决方法:首先看有没有将数据从文件中读到定义的数组变量总,其次再看比较时是不是两个不同的Worka与Workb在比较,若不是则修改下标的下界,使他们是不

13、同的两个数组在比较。问题7:在运行过程中,有事误操作,输入界面上没有的数字,导致运行直接结束。解决方法:利用if判断是否是界面上的这几个数,如果不是就调用当前操作的函数,使得界面保持不动,能实现重新输入。5分析及结论实现功能:(1)系统将显示菜单栏,提供选项,并提示用户输入需要实行的功能的代号,同时实现了针对用户误操作就关闭的系统的问题;(2)录入所要存档的职工信息;(3)对录入的职工信息能实现全部显示;(4)由用户输入要查找的职工工号,输出所查找的职员资料;(5)由用户输入要查找的职员姓名,输出所查找的职员资料;(6)由用户输入要查找的职员电话,输出所查找的职员资料;(7)能按工资由高到低的

14、顺序输出所有职工的信息;(8)按工号查找到所需要的职工,并且能按意愿修改其工号、姓名、性别、学历、年龄、收入、住址、电话,改完后能重新保存,又能调出修改后所有员工的信息。(9)按工号查找到需要将信息删除的职工,将其信息删除后重新保存,又能调出删除后剩余员工信息(10)将信息正确录入后,能统计相同姓名、性别、学历、年龄、收入、住址的人数;难点:(1)对于偶数个人(以4为例),若有A和B姓名相同,C和D姓名相同,在统计相同人数时该怎么统计(2)在定义修改函数时,不能想到是利用数组,将下一条记录放入当前想删除的记录内,一下的以此类推,做到删除该员工记录,即使做到了删除在输出时也会因为不注意还是输出S

15、IZE条记录,而不是输出SIZE-1条记录;(3)在定义统计函数时,经常会有不注意下标的情况,不能实现不同两条信息的比较; 不足:(1)在查询信息时,不能完美的将输出的信息与中文提示字相对应;(2)在进行员工信息的修改与删除时,若输入的工号数据库中没有,则直接跳回主界面,不能像实现功能选择错误停留在当前界面从而进行重新进行输入;6运行结果 (以下结果均为2个数据的运行结果)1.主菜单 2.录入功能 3.查询功能 3.a.整体查询3.b.按工号查询 3.c.按姓名查询3.d.按电话查询 3.e.按工资高低排序并输4.修改功能5.删除功能 6.统计功能 7.结束语平时的程序设计大多是以填空的形式出

16、现,虽然有所接触,但都不完全。而这一周的课程设计,却让我们完完全全用自己学到的知识编写一个完整的体统程序。这是一个新的挑战,也是一种新的学习。我们组选择的题目是第三个职工信息管理系统。初看到这个题目觉得很简单,但当我做到电脑前准备开始编写代码的时候才发现无从下手。通过去图书馆查找程序设计相关的书籍,和上网参考前人编写的类似程序,我脑中才有了一个大概方向。这次的实践让我体会到了一个企业的人事管理员是十分辛苦的,除了在录入员工信息时需要小心,谨慎,同时还要做好今后在有人事变迁随时做到正确修改,删除等,因此一个人事管理员需要有一套十分完善,人性的管理系统。这个编程过程中老师对我的帮助很大。尤其在调试

17、程序时,老师教给我如何进行快速调试,即少定义几个数据和变量,先总体运行下,看是否有问题,再进行修改。这让我体会到老师在以后的学习生活中将对学生起很大的作用。当看到自己的程序能完整运行,并且能实现自己所预定的功能时,心里十分开心。这次的编程实践将对我今后的学习、工作起很大的影响,我十分感谢这次实践。经过这么多天的课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,使用它,通过实践,我也发现我还有许多不足之处。首先对对函数调用的正确使用不够熟悉,还有对文件的输入输出不够熟悉,犯了许多错误。通过这次的实践,使我在这几个方面的认识有所提高。还有就

18、是通过这次的程序设计,让我更加深刻的明白了程序设计的重要性,同时也更加激起了我要继续学习这门课程的兴趣,现在我还有许多不明白的地方,还需多加努力。我了解到了C语言的博大精深,体会到编制程序的复杂性,困难性。8.参考文献1 谭浩强.C程序设计(第三版).北京:清华大学出版社,2005.2 谭浩强. C程序设计题解与上机指导(第三版).北京:清华大学出版社,20053 罗朝盛,余文芳.C程序设计实用教程,人民邮电出版社,20054 杨超宇,赵光明,孟祥瑞,李铁锋. C语言程序设计,华东理工大学出版社,20065张基温 C程序设计案例教程 清华大学出版社6王宏 C#程序设计案例教程 清华大学出版社7

19、 C语言之家()8 C语言教室()9 百度文库 9附录 (源程序代码及其注释)#include <stdio.h> /*标准输入输出函数库*/#include <stdlib.h> /*标准函数库*/#include <string.h> /*字符串函数库*/#define SIZE 20 /*预处理指令,定义个数*/struct Work_type /*定义关于职工的结构体*/int num; /*职工工号*/char name20; /*职工姓名*/char sex10; /*职工性别*/int age; /*职工年龄*/char degree15; /

20、*职工学历*/int money; /*职工工资*/ char adde15; /*职工住址*/int tel; /*职工电话*/ WorkSIZE,max; /*变量名列表*/void face(); /*调用face函数*/void save() /*编写保存成文件的函数*/FILE *fp;int i;if(fp=fopen("work.dat","wb")=NULL) /*以只写方式打开名为"work.dat"的二进制文件*/printf("cannot open filen");return;for(i=

21、0;i<SIZE;i+)if(fwrite(&Worki,sizeof(struct Work_type),1,fp)!=1)printf("file write error");fclose(fp); /*关闭文件*/void input_data() /*编写输入数据函数*/int a;system("cls"); /*清屏*/printf("请按顺序输入以下信息:n");printf("工号 姓名 性别 年龄 学历 收入 住址 电话 n");for(a=0;a<SIZE;a+) scanf

22、("%d%s%s%d%s%d%s%d",&Worka.num,W,Worka.sex,&Worka.age,Worka.degree,&Worka.money,Worka.adde,&Worka.tel);save(); system("cls"); /*清屏*/ face(); /*调用face函数*/void find_data1() /*编写按全部输入查找的函数*/int i;FILE*fp;system("cls"); /*清屏*/if(fp=fopen("work.

23、dat","rb")=NULL) /*以只读方式打开名为"work.dat"的二进制文件*/printf("cannot open file");exit(0);printf("全体员工信息如下:n");printf("工号 姓名 性别 年龄 学历 收入 住址 电话 ");for(i=0;i<SIZE;i+)fread(&Worki,sizeof(struct Work_type),1,fp); if(Worki.num!=0)printf("%-5d %-5s

24、 %-5s %-5d %-5s %-5d %-5s %-5dn",Worki.num,W,Worki.sex,Worki.age,Worki.degree,Worki.money,Worki.adde,Worki.tel);void find_data2_1() /*定义工号查询函数*/int n,i;system("cls"); /*清屏*/printf("按工号查询,请输入员工工号:");/*调试阶段输入10011002即可*/scanf("%d",&n);system("cls&qu

25、ot;); /*清屏*/printf("工号 姓名 性别 年龄 学历 收入 住址 电话 ");for(i=0;i<SIZE;i+)if(Worki.num=n) printf("%-5d %-5s %-5s %-5d %-5s %-5d %-5s %-5dn",Worki.num,W,Worki.sex,Worki.age,Worki.degree,Worki.money,Worki.adde,Worki.tel);void find_data2_2() /*定义姓名查询函数*/char str20;int i;system(&q

26、uot;cls"); /*清屏*/printf("按姓名查询,请输入员工姓名:");scanf("%s",str);system("cls"); /*清屏*/ printf("工号 姓名 性别 年龄 学历 收入 住址 电话 ");for(i=0;i<SIZE;i+)if(strcmp(W,str)=0) printf("%-5d %-5s %-5s %-5d %-5s %-5d %-5s %-5dn",Worki.num,W,Worki.sex

27、,Worki.age,Worki.degree,Worki.money,Worki.adde,Worki.tel);void find_data2_3() /*定义电话查询函数*/int i,n; system("cls"); /*清屏*/ printf("按电话查询,请输入员工电话:"); /*调试阶段输入10011002即可*/scanf("%d",&n);system("cls"); /*清屏*/ printf("工号 姓名 性别 年龄 学历 收入 住址 电话 ");for(i=0

28、;i<SIZE;i+)if(Worki.tel=n) printf("%-5d %-5s %-5s %-5d %-5s %-5d %-5s %-5dn",Worki.num,W,Worki.sex,Worki.age,Worki.degree,Worki.money,Worki.adde,Worki.tel);void find_data2() /*编写按工号查找的函数*/int n;FILE *fp;system("cls"); /*清屏*/if(fp=fopen("work.dat","rb&qu

29、ot;)=NULL) /*以只读方式打开名为"work.dat"的二进制文件*/printf("cannot open filen");exit(0);printf("请选择你希望的查询方式(1.工号,2.姓名,3.电话):");scanf("%d",&n);if(n!=1&&n!=2&&n!=3) /*判断是否选择正确的功能,若没有则重新选择正确功能*/find_data2();switch(n)case 1:find_data2_1();break; /*调用工号查询函数

30、find_data2_1()*/case 2:find_data2_2();break; /*调用姓名查询函数find_data2_2()*/case 3:find_data2_3();break; /*调用电话查询函数find_data2_3()*/void find_data3() /*编写按工资高低排序并输出的函数*/int i,j;FILE *fp;system("cls"); /*清屏*/if(fp=fopen("work.dat","rb")=NULL) /*以只读方式打开名为"work.dat"的二进

31、制文件*/printf("cannot open filen");exit(0); printf("按员工工资高低排序为: n");printf("工号 姓名 性别 年龄 学历 收入 住址 电话 ");for(i=0;i<SIZE;i+)for(j=i+1;j<SIZE;j+)if(Worki.money<Workj.money)max=Worki;Worki=Workj;Workj=max;for(i=0;i<SIZE;i+)printf("%-5d %-5s %-5s %-5d %-5s %-5d

32、 %-5s %-5dn",Worki.num,W,Worki.sex,Worki.age,Worki.degree,Worki.money,Worki.adde,Worki.tel);void find_data() /*编写查找函数*/char ch;system("cls"); /*清屏*/printf("全体查询请按Q/q,个人查询请按G/g,工资高低排序查询请按P/p:");scanf(" %c",&ch);if(ch!='G'&&ch!='Q'

33、;&&ch!='P'&&ch!='g'&&ch!='q'&&ch!='p') /*判断是否选择正确的功能,若没有则重新选择正确功能*/find_data(); switch(ch) /*选择希望的功能*/ case 'q':case 'Q':find_data1();break; /*输入Q/q后,调用全体查询函数find_data1()*/ case 'g': case 'G':find_data2()

34、;break; /*输入G/g后,调用个人查询函数find_data2()*/case 'p':case 'P':find_data3();break; /*输入P/p后,调用工资排序函数find_data3()*/system("pause"); /*使屏幕停留*/face(); /*调用face函数*/void repair_data() /*编写修改函数*/FILE *fp;int i,n;system("cls"); /*清屏*/if(fp=fopen("work.dat","wb+&

35、quot;)=NULL) /*以读写方式打开名为"work.dat"的二进制文件*/printf("cannot open filen");exit(0);printf("请输入您想修改的工号:"); /*调试阶段输入10011002即可*/scanf("%d",&n);system("cls");for(i=0;i<SIZE;i+)if(Worki.num=n)printf("1.工号,2.姓名,3.性别,4.年龄,5.学历,6.收入,7.住址,8.电话n")

36、;printf("请输入你想修改的部分:"); scanf("%d",&n);system("cls");switch(n)case 1:printf("请输入新工号:");scanf("%d",&Worki.num);break;case 2:printf("请输入新姓名:");scanf("%s",W);break;case 3:printf("请输入新性别:");scanf("%s&qu

37、ot;,Worki.sex);break;case 4:printf("请输入新年龄");scanf("%d",&Worki.age);break;case 5:printf("请输入新学历:");scanf("%s",Worki.degree);break;case 6:printf("请输入新工资:");scanf("%d",&Worki.money);break;case 7:printf("请输入新住址:");scanf("

38、;%s",Worki.adde);break;case 8:printf("请输入新电话:");scanf("%d",&Worki.tel);break;save(); /*调用save函数*/system("pause"); /*使屏幕停留*/face(); /*调用face函数*/void del_data() /*编写删除函数*/FILE *fp;int i,n,p;system("cls"); /*清屏*/if(fp=fopen("work.dat","wb+

39、")=NULL) /*以读写方式打开名为"work.dat"的二进制文件*/printf("cannot open filen");exit(0);printf("请输入您想删除的工人工号:"); /*调试阶段输入10011002即可*/scanf("%d",&n);system("cls"); /*清屏*/for(i=0;i<SIZE;i+) if(Worki.num=n)p=i;for(i=p+1;i<SIZE+1;i+) Worki-1.num=Worki.n

40、um; strcpy(W,W); strcpy(Worki-1.sex,Worki.sex); Worki-1.age=Worki.age; strcpy(Worki-1.degree,Worki.degree); Worki-1.money=Worki.money; strcpy(Worki-1.adde,Worki.adde); Worki-1.tel=Worki.tel; save(); /*调用save函数*/ system("pause"); /*使屏幕停留*/face(); /*调用face函数*/void count_d

41、ata() /*编写统计函数*/int i,a,b,d6=0,0,0,0,0,0;FILE *fp;if(fp=fopen("work.dat","rb")=NULL) /*以只读方式打开名为"work.dat"的二进制文件*/printf("cannot open filen");exit(0);for(i=0;i<SIZE;i+)if(fread(&Worki,sizeof(struct Work_type),1,fp)!=1)printf("file write error"

42、); system("cls"); /*清屏*/ for(a=0;a<SIZE-1;a+) for(b=a+1;b<SIZE;b+) if(strcmp(W,W)=0)d0+;if(strcmp(Worka.sex,Workb.sex)=0)d1+;if(Worka.age=Workb.age)d2+; if(strcmp(Worka.degree,Workb.degree)=0)d3+;if(Worka.money=Workb.money) d4+;if(strcmp(Worka.adde,Workb.adde)=0) d5+; printf("n");pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论