员工管理系统

上传人:MM****y 文档编号:26133228 上传时间:2021-08-06 格式:DOC 页数:32 大小:510.50KB
收藏 版权申诉 举报 下载
员工管理系统_第1页
第1页 / 共32页
员工管理系统_第2页
第2页 / 共32页
员工管理系统_第3页
第3页 / 共32页
资源描述:

《员工管理系统》由会员分享,可在线阅读,更多相关《员工管理系统(32页珍藏版)》请在装配图网上搜索。

1、员工管理系统xx 学院计算机科学与技术系06 级专升本班设计题目:员工管理系统员工管理系统:每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统能够完成员工信息的查询、更新、插入、删除、排序等功能。要求:( 1)排序:按不同关键字对所有员工的信息进行排序。( 2)查询:按特定条件查找员工。( 3)更新:按编号对某个员工的某项信息进行修改。( 4)插入:加入新员工的信息。( 5)删除:按编号删除已离职的员工信息。一、问题分析和任务定义根据题目要求对问题进行如下分析:1. 问题分析根据题目要求首先应知道如何存放每个员工的信息以及所有员工的信息存储;接着要了解具体需要编写哪

2、些函数来实现各项功能;然后就是通过主函数来进行调用;最后当你输入的非法字符时,应该以怎样的方式给出提示信息。2.任务的定义首先定义一个员工结构体,用它来存放每个员工的信息,即编号、姓名、性别、出生年月、学历、职务、电话、住址以及一个指针域。在这个程序中采用了单链表作为数据的存储结构,即用它来存放所有的结点信息。接着根据要求编写查询、更新、插入、删除、排序等函数。虽然各函数之间并没有规定其先后的顺序,但是如果信息不存在,那么有的函数就无需进行。所以,首先还是要进行信息的录入,即主函数中的创建操作或者插入操作,创建操作是创建一个单链表,将原有的员工信息存入,插入操作是插入新员工的信息,但是必须在合

3、适的位置插入。然后就可以进行查询、更新、排序、删除等功能了。如果你输入的是非法字符时,就提示你重新输入。 3. 输入与输出及其值的范围输入完全按照提示信息一一输入,输出是按照程序所设计的内容输出,其值的范围是程序开始时结构体里面定义的范围。例如,在本程序中,所有的信息都是定义成字符型的,如果输入的类型与定义的发生冲突,将无法实现以下功能。二、概要设计和数据结构的选择本课程设计要求设计一个员工管理系统,需要存放每个员工的信息并且实现所有员工的信息存储。所以我建立一个 employ 员工结构体,结构体中包含的信息有编号、姓名、性别、出生年月、学历、职务、电话、住址以及一个指针域。具体形式如下:ty

4、pedef struct node /定义员工结构体char num10; /编号char name10; /姓名char sex4; /性别char birthdate20; /出生年月char degree20; /学历char position20; /职务char telnum20; /电话char address100; /住址node *next; /指针域employ;1计算机科学与技术系06 级专升本班主函数流程图如图1 所示:开 始建立新结点,分配内存空间输 入 xx= =1? x= =2 ? x= =3?NNYYYN创建函数查询函数更新函数x= =6? x= =5? x=

5、=4?NNYYY显示函数插入函数排序函数x= =7? x= =8?NNYY退出删除函数图 1. 主函数流程图三、详细设计和编码详细设计和编码如下所示:1.员工信息创建的函数void Create(employ *L,int m)首先新建一个结点employ *M ,并分配内存给该结点M=(employ*)malloc(sizeof(employ),然后将员工的各项信息赋值给新结点,再将新结点的指针域置为空 M-next=NULL,并将新结点链到单链表上 L-next=M,将指针指向新结点L=M,当 inext ,输 2计算机科学与技术系 06 级专升本班入要查找员工的编号,当结点不为空时一个结

6、点一个结点地查找,如果结点中有与输入编号相等的信息,则显示出该信息;若结点为空时则输出“不存在该员工的信息,请重新输入:”,最后还要将指针L 指回头结点。按其他三个关键字查询与按编号查询方法一致。3.更新函数 void Updata(employ *L)本函数是先按照编号查询到某个员工的信息显示出来,然后选择是否更新数据,若需要更新,则重新输入新数据,更新后显示出该员工的新信息,否则退出循环。如果输入的是非法字符,则提示重新输入。4.排序函数 void Order(employ *L)本函数使用的是冒泡排序法,为了方便后面操作先定义了一个指针数组,并将所有的结点全都存放在指针数组中,代码如下所

7、示:employ *strmaxwhile(L!=NULL) /将所有结点放入指针数组stri=L;L=L-next;i+;n+;然后分别按照编号、姓名、职务三个关键字对员工信息进行冒泡排序,最后将排序后指针数组直接链到单链表中并将最后一个结点的指针域置空。以下为按编号对员工信息进行排序的代码,按其他两个关键字排序方法与此类似。if(x=1) /按编号对员工信息进行排序for(i=0;in-1;i+) /用冒泡法对数据进行排序for(j=0;jnum,strj+1-num)=1)/当前一数组大于后一数组q=strj;strj=strj+1;strj+1=q;/交换两数组for(i=0;inex

8、t=stri;p=p-next;p-next=NULL; /将最后一个结点的next 置为空break;5.插入函数 void Insert(employ *L,int i)首先新建一个结点employ *p ,并分配内存给该结点p=(employ*)malloc(sizeof(employ),再输入结点信息,当插入的位置为0 时,将该结点插入到头结点之后,否则寻找到要插入位置的前一个结点,然后执行语句p-next=L-next;L-next=p;进行插入,若插入到最后一个位置则执行语句L-next=p;p-next=NULL; 具体代码如下:if(i=0)/当插入的位置为 0 时,则将该结点

9、插入到头结点后p-next=L-next;L-next=p;elseif(L-next!=NULL)L=L-next;while(L!=NULL&j!=i-1) /寻找插入位置L=L-next;j+;3计算机科学与技术系06 级专升本班if(L!=NULL) /在中间任意位置插入p-next=L-next;L-next=p;if(j=Length(L) /插入到最后一个结点之后L-next=p;p-next=NULL; 6.删除函数 void Delete(employ *L)本函数是先按照编号查询到某个员工的信息显示出来,然后选择是否删除数据,若该员工已离职则需删除该员工的信息,删除部分的代

10、码如下所示:if(x=1) /删除数据q=p-next; /q指向p 的下一个结点p-next=q-next; /p指向 q 的下一个结点free(q); /释放该结点break;7.显示函数 void Display(employ *L)当结点不为空时执行循环体,将结点信息显示出来,当结点为空时输出“当前没有任何员工的信息 ! ”四、上机调试1 在上机调试的过程中,遇到了以下几个问题:1.1在创建员工单链表时,没有遇到太大的问题,只是在输入员工的信息的时候,如果输入的字符长度超过了系统定义的字符数组的长度,那么显示的时候就会出现错误,比如重复的出现某一个关键字,后来增加了字符数组的长度,便解

11、决了问题。1.2在查询函数中有一个问题,就是只能查询一次,然后如果再进行查询的话,就会找不到你所要找的信息,或者出现错误,经过查找,发现问题出在指针上,由于查询一次以后,指针还是指向该位置,没有返回成原来的头结点,当在最后加上指针重新指向头结点以后,就能进行多次查询了。1.3在排序函数中,还是出现了比较多的问题,比如刚开始的时候,对多个数据进行排序的时候,它所显示的数据并不是按关键字从小到大排序的,后来经过分析,知道是由于控制的变量出现错误,因为是用冒泡法进行排序的,第二层循环的条件要根据第一层循环的变量来写的,经过修改,排序是正确的,但是显示的时候又出现了错误的现象,它显示的还是老的数据,也

12、就是说新的数据根本就没有传过去,经过长时间的分析,发现指针那块还是出现了问题,没有将新的数据链到单链表上,所以显示数据的时候,它还是指向老的数据链,经修改,将指针指向新的数据链后,再显示,便能显示出最新的员工的信息。1.4在插入函数中,调试也花了不少的时间,刚开始调试的时候,数据能够在除两头以外的其他地方进行插入,但是当在尾结点后进行插入时,显示不出来数据,经过分析,在尾结点后进行插入给予特殊的处理,如果是尾结点,就直接将最后一个结点指向新的结点,但是如果在别的位置进行插入时,它没有进行判断位置是否正确,而是直接要求你输入新数据,这跟实际情况不符,后来在此基础上增加了判断语句,如果插入的位置不

13、正确,那么就直接退出,重新输入,再进行调试,便实现了所有的可能出现的情况。 1.5 最后是删除函数,在该部分进行调试时,问题不是很大,有一个小问题,就是如果将所有的数据都删除完后,这时系统应该显示为空,但是系统没有任何说明,经过修改,在主函数中,将头结点的尾指针置为空,如果没有任何员工的信息时,则增加一条判断语句,如4计算机科学与技术系06 级专升本班果头结点的尾指针置为空,则直接输出此系统没有任何信息,再进行调试,是正确的,可以实现所有的功能。2. 算法的时间与空间性能分析本设计中主要对插入算法和排序算法进行分析:2.1时间性能分析插入算法的时间复杂度为O(n), 排序算法中最坏的情况下总的

14、比较次数为:n(n-1)/2,2 总的移动次数为: 3n(n-1)/2次,所以其时间复杂度为:O(n) 2.2空间性能分析单链表中的每个结点都要增加一个指针空间,相当于增加了n 个指针变量。其空间复杂度 O(n), 冒泡排序法的空间复杂度为:O(1) ,总体来讲整个算法的空间性能良好。五、用户使用说明首先创建一个单链表用于存储各员工的相关信息,然后按照提示的信息就可以进行查询、更新、排序、删除等功能了。1. 运行程序时,首先出现一个界面,首先选择 1. 创建,创建一个单链表,将原有的员工信息录入。2. 如果你想查询某个员工的信息,你就选择 2. 查询。 3. 如果你要更新某个员工的信息,请选择

15、 3. 更新。4. 如果你要对员工信息进行排序,请选择 4. 排序。5. 如果有新员工进入公司,你要插入该员工的信息,请选择5. 插入。 6. 如果有员工离职,需要删除该员工的信息,请选择7. 删除。 7. 每次调用一个函数后你想显示所有员工信息,请选择6. 显示。 8. 如果你输入的是非法字符时,系统会提示你重新输入。六、测试结果5计算机科学与技术系06 级专升本班6计算机科学与技术系06 级专升本班7计算机科学与技术系06 级专升本班8计算机科学与技术系06 级专升本班七、心得与体会本次课程设计已经接近尾声,从这次课程设计中令我感触最深的是自己设计出来的东西很有成就感,尽管做得不是很完善,

16、但是毕竟是自己一点一点设计出来的。刚开始拿到题目时觉得挺高兴的,因为题意很明显,属于那种一看到题目就知道大概需要做什么的,可是实际设计起来就并不像想象中那么简单了,由于要求设计的函数比较多,要一一实现的话还是比较困难的。最终经过老师的指导、同学的帮助和自己的努力完成了此次设计,尽管和实际之间还存在一段距离,但是它在一定程度上锻炼了我的动手能力。八、参考书目1.李春葆,数据结构习题与解析,清华大学出版社,2007 年 1 月第一版 2.胡学钢,数据结构,高等教育出版社,2004 年 1 月第一版九、带注释的源程序# include iostream.h# include string.h# in

17、clude stdio.h9计算机科学与技术系06 级专升本班# include malloc.h# define max 1000 /定义最大的数组下标 # define NULL 0 /定义 NULL为0 typedef struct node /定义员工结构体char num10; /编号char name10; /姓名char sex4; /性别char birthdate20; /出生年月char degree20; /学历char position20; /职务char telnum20; /电话char address100; /住址node *next; /指针域employ;

18、int Length(employ *L) /求单链表的长度int n=0;while(L!=NULL) /当单链表不为空时L=L-next; /指向下一个结点n+; /计算单链表的长度return n; /返回单链表的长度void Create(employ *L,int m) /创建函数char num10,name10,sex4,birthdate20,degree20,position20,telnum20,address100;int i=0,j=0,k=0;employ *M; /新建一个结点while(im) /m为输入员工的个数,当不大于输入的个数时,执行循环cout 请输入第

19、 i+1 名员工的信息 :endl;cout-endl;cout 编号 姓名 性别 出生年月 学历 职务 电话 住址 endl; cout-num; /输入编号cinname; /输入姓名cinsex; /输入性别cinbirthdate; /输入出生年月cindegree; /输入学历cinposition; /输入职务cintelnum; /输入电话cinaddress; /输入住址M=(employ *)malloc(sizeof(employ); /分配内存给该结点strcpy(M-num,num); /将姓名值赋给新结点的姓名strcpy(M-name,name); /将编号值赋给新

20、结点的编号strcpy(M-sex,sex); /将性别值赋给新结点的性别strcpy(M-birthdate,birthdate); /将出生年月值赋给新结点的出生年月10计算机科学与技术系06 级专升本班strcpy(M-degree,degree); /将学历值赋给新结点的学历strcpy(M-position,position); /将职务值赋给新结点的职务strcpy(M-telnum,telnum); /将电话值赋给新结点的电话strcpy(M-address,address); /将住址值赋给新结点的住址M-next=NULL; / 新结点的指针域置为空L-next=M; /将新

21、结点链到单链表上L=M; /i+;指向新结点void Display(employ *L) /显示函数while(L-next!=NULL) /当结点不为空时,执行循环L=L-next; /指向结点coutnum ;coutname ;coutsex ;coutbirthdate ;coutdegree ;coutposition ;couttelnum ;coutaddress next=NULL) /当第一个结点为空时cout 当前没有任何员工的信息!endl;void Show(employ *L) /显示某一个结点函数coutnum ;/输出编号,姓名,性别,出生年月,学历,职务,电话

22、,住址coutname ;coutsex ;coutbirthdate ;coutdegree ;coutposition ;couttelnum ;coutaddress endl;void Search(employ *L) /查询函数employ *p;p=L; /p指向头结点int x;char num10,name10,telnum20,address100;while(1)cout1. 按编号查找 2. 按姓名查找 endl;cout3. 按电话查找 4. 按住址查找 endl;cout5. 退出 endl;cout 请选择 :(1,2,3,4,5)x;11计算机科学与技术系06

23、级专升本班L=L-next; /指向第一个结点if(x=1)cout 请输入要查找员工的编号:num;while(L!=NULL) /当结点不为空时,执行循环if(strcmp(L-num,num)=0) /如果结点中有与输入相符合的信息Show(L); /显示该结点信息break;else L=L-next; /指向下一个结点if(L=NULL)cout 不存在该员工的信息 , 请重新输入: endl;L=p; /指回头结点else if(x=2)cout 请输入要查找员工的姓名:name;while(L!=NULL) /当结点不为空时,执行循环if(strcmp(L-name,name)=

24、0) /如果结点中有与输入相符合的信息Show(L); /显示该结点信息break;else L=L-next; /指向下一个结点if(L=NULL)cout 不存在该员工的信息 , 请重新输入: endl;L=p; /指回头结点else if(x=3)cout 请输入要查找员工的电话号码:telnum;while(L!=NULL) /当结点不为空时,执行循环if(strcmp(L-telnum,telnum)=0)/如果结点中有与输入相符合的信息Show(L); /显示该结点信息break;else L=L-next; /指向下一个结点if(L=NULL)cout 不存在该员工的信息 , 请

25、重新输入: endl;L=p; /指回头结点else if(x=4)cout 请输入要查找员工的住址:address;while(L!=NULL) /当结点不为空时,执行循环if(strcmp(L-address,address)=0)Show(L); /显示该结点信息break;else L=L-next; /指向下一个结点if(L=NULL)cout 不存在该员工的信息 , 请重新输入: endl;12计算机科学与技术系06 级专升本班L=p; /指回头结点else if(x=5)break;elsecout 你输入的为非法字符,请重新输入:endl;void Updata(employ

26、*L) /更新函数char num10;int x;char name10,sex4,birthdate20,degree20,position20, telnum20,address100;cout 请输入要更新员工的编号:num;L=L-next; /指向第一个结点while(L!=NULL) /当结点不为空时,执行循环if(strcmp(L-num,num)=0) /如果结点中有与输入相符合的信息Show(L); /显示该结点信息break;else L=L-next; /指向下一个结点if(L=NULL) /当结点为空时cout 不存在该员工的信息 , 请重新输入: endl;else

27、 /当结点不为空时while(1)cout1. 更新数据 2. 退出 endl;cout 请选择 :(1,2)x;if(x=1)cout 请输入新数据 :num; /输入编号cinname; /输入姓名cinsex; /输入性别cinbirthdate; /输入出生年月cindegree; /输入学历cinposition; /输入职务cintelnum; /输入电话cinaddress; /输入住址strcpy(L-num,num); /将姓名值赋给新结点的姓名strcpy(L-name,name); /将编号值赋给新结点的编号strcpy(L-sex,sex); /将性别值赋给新结点的性别

28、strcpy(L-birthdate,birthdate);/将出生年月值赋给新结点strcpy(L-degree,degree); /将学历值赋给新结点的学历strcpy(L-position,position); /将职务值赋给新结点的职务strcpy(L-telnum,telnum); /将电话值赋给新结点的电话strcpy(L-address,address); / 13将住址值赋给新结点的住址计算机科学与技术系06 级专升本班cout 更新后的数据为: endl;Show(L); /显示该结点的信息else if(x=2) break; /否则跳出循环elsecout 你输入的为非法

29、字符,请重新输入:next; /指向下一个结点while(L!=NULL) /将所有结点放入指针数组stri=L;L=L-next;i+;n+;while(1)cout1.按员工编号排序2.按员工姓名排序 endl;cout3.按员工职务排序4.退出 endl;cout 请选择 :(1,2,3,4)x;if(x=1)for(i=0;in-1;i+) /用冒泡法对数据进行排序for(j=0;jnum,strj+1-num)=1) q=strj;strj=strj+1;strj+1=q;/交换两数组 for(i=0;inext=stri;p=p-next;p-next=NULL; /将最后一个结点

30、的 next 置为空break;else if(x=2)for(i=0;in-1;i+) /用冒泡法对数据进行排序for(j=0;jname,strj+1-name)=1) q=strj;strj=strj+1;strj+1=q;/交换两数组 for(i=0;inext=stri;p=p-next;p-next=NULL; /将最后一个结点的 next 置为空break ;else if(x=3)14计算机科学与技术系 06 级专升本班for(i=0;in-1;i+) /用冒泡法对数据进行排序for(j=0;jposition,strj+1-position)=1) q=strj;strj=s

31、trj+1;strj+1=q;/交换两数组 for(i=0;inext=stri;p=p-next;p-next=NULL;/ 将最后一个结点的next 置为空break;else if(x=4)break;elsecout你输入的为非法字符,请重新输入:endl;void Insert(employ *L,int i) /插入函数char name10,sex4,birthdate20,degree20,position20,telnum20,address100;char num10;int j=0;employ *p;p=(employ *)malloc(sizeof(employ);c

32、out 请输入插入的数据 :num;cinname;cinsex;cinbirthdate;cindegree;cinposition;cintelnum;cinaddress;strcpy(p-num,num);strcpy(p-name,name);strcpy(p-sex,sex);strcpy(p-birthdate,birthdate);strcpy(p-degree,degree);strcpy(p-position,position);strcpy(p-telnum,telnum);strcpy(p-address,address);if(i=0) /当插入的位置为0 时,则将该

33、结点插入到头结点后p-next=L-next;L-next=p; elseif(L-next!=NULL)15计算机科学与技术系06 级专升本班L=L-next;while(L!=NULL&j!=i-1) /寻找插入位置 L=L-next;j+;if(L!=NULL) / 在中间任意位置插入p-next=L-next;L-next=p;if(j=Length(L) /插入到最后一个结点之后L-next=p;p-next=NULL;void Delete(employ *L) /char num10;int x;employ *p,*q,*w;删除函数cout 请输入要删除员工的编号:num;w

34、=L; /定义 w 指向头结点 L=L-next; /指向第一个结点while(L!=NULL) /当结点不为空时,执行循环if(strcmp(L-num,num)=0)/如果结点中有与输入相符合的信息Show(L); /显示该结点信息break;elsew=L; /定义 w 指向该结点L=L-next; /指向下一个结点if(L=NULL) /当结点为空时cout 不存在该员工的信息 , 请重新输入: endl;else /当结点不为空时p=w; /定义 p 指向 wwhile(1)cout1. 删除数据 2. 退出 endl;cout 请选择 :(1,2)x;if(x=1)q=p-next

35、; /q指向 p 的下一个结点p-next=q-next; /p指向 q 的下一个结点free(q); /释放该结点break;else if(x=2)break;elsecout 你输入的为非法字符,请重新输入: next=NULL;printf(tt* * * * * * * * * * * * * * * * * * * * * * * *n);printf(tt* *n);printf(tt* 欢 迎 进 入 员 工 管 理 系 统 *n); printf(tt* *n);printf(tt* * * * * * * * * * * * * * * * * * * * * * * *n

36、);while(1)printf(tt-n);printf(tt n);printf(tt 1.创建2.查 询 n);printf(tt n);printf(tt 3.更新4.排 序 n);printf(tt n);printf(tt 5.插入6.显 示 n);printf(tt n);printf(tt 7.删除8.退 出 n);printf(tt n);printf(tt-n);coutx;if(x=1)cout 请输入员工数目 :m;Create(L,m); /创建函数else if(x=2)if(L-next=NULL) /当只有头结点时cout 当前没有任何员工的信息,不能进行查询!

37、next=NULL) /当只有头结点时cout 当前没有任何员工的信息,不能进行更新!next=NULL) /当只有头结点时cout 当前没有任何员工的信息,不能进行排序!endl;else /否则Order(L); /排序函数17计算机科学与技术系06 级专升本班else if(x=5)n=Length(L); /n为单链表的长度while(1)cout 请输入要插入的位置: i;if(i=n|i0)/当插入位置小于0 或者大于等于单链表的长度n 时cout 你所插入的位置不正确,请重新插入:next=NULL) /当只有头结点时cout 当前没有任何员工的信息!endl;elsecout 该员工管理系统的所有信息:next=NULL) /当只有头结点时cout 当前没有任何员工的信息,不能进行删除!endl;else /否则Delete(L); /删除函数else if(x=8)break;elsecout 您输入的为非法字符,请重新输入:endl; 十、指导老师评语18

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!