实用文档 数据结构课程设计报告 班级 课题名称 14计科1班 员工管理系统 姓名 陈乾 学号 14551602 2015.12.28 完成日期 一、 目的(本次 课程设计 所涉及并要求掌握的知识点。) 1、 理解线性表的定义、顺序存储结构和链式存储结构。 2、 理解线性表的逻辑结构特征。 3、 掌握线性表的两种存储方法(顺序表和链式表),并体会两者差异。 4、 掌握线性表的表示和实现。 5、 学会使用线性表解决一些相关的实际问题。 6、 二、使用环境 Microsoft Visual C++ 6.0 三、正文 1.需求分析 员工信息管理系统是企业管理中的一个重要内容,随着时代的进步,企业也逐渐变得庞大起来。如何管理好企业内部员工的信息,成为企业管理中的一个大问题。在这种情况下,开发一个人力资源管理系统就显得非常必要。 现在,市场上可以选购的应用开发产品很多,流行的也有数十种。在目前市场上这些众多的程序开发工具中,有些强调程序语言的弹性与执行效率,有些则偏重于可视化程序开发工具所带来的便利性与效率的得高,各有各的优点和特色,也满足了不同用户的需求。然而,语言的弹性和工具的便利性是密不可分的,只强调程序语言的弹性,却没有便利的工具作配合,会使一些即使非常简单的界面处理动作,也会严重地浪费程序设计师的宝贵时间;相反,如果只有便利的工具,却没有弹性的语言作支持,许多特殊化的处理动作必需要耗费数倍的工夫来处理,使得原来所标榜的效率提高的优点失去了作用。 结合现实生活中企业的相关情况,经过实际的需求分析,采用功能强大的Microsoft Visual C++ 6.0作为开发工具而开发出本系统。整个系统具有操作简便、界面友好、灵活、实用、安全等特点,并具有如下功能: 1、问题描述: 对单位的员工进行管理,包括插入、删除、查找、排序等功能。 2、要求: 员工对象包括姓名、性别、年龄、职位、工龄等信息。 (1)新增一名员工:将新增员工对象按姓名以字典方式员工管理文件中,基本信息中的编号是按照添加顺序自动增加的。 (2)删除一名员工:从员工管理文件中删除一名员工对象,分为根据编号删除、根据姓名删除。 (3)查询:从员工管理文件中查询符合某些条件(编号、姓名)的员工。 (4)修改:根据编号检索出对象,既可以对整个对象修改,也可对某个属性修改。 (5)排序:按照年龄、工龄对所有的员工排序(降序),也可以回复排序以前的员工现文案大全 实用文档 实状态。 2.概要设计 (一)数据类型定义: #include
#include #include #include #define ALLMAX 100 //总共统计的职工的人数 typedef struct Node { long int age,work_time,num; char sex,name[ALLMAX],job[ALLMAX]; struct Node *next; }SLNode; typedef struct{ long int age,work_time,num; char name[ALLMAX],sex,job[ALLMAX]; }DataType; (二)主程序流程图 文案大全 实用文档 (三)各程序模块之间的层次(调用)图 3.详细设计 1、主菜单模块:显示员工管理系统的主菜单,供用户选择所需的功能,通过自己定义的void put( )函数来实现。 2、添加员工模块:输入员工的编号、姓名、年龄、职位、工龄以,通过自己定义的void 文案大全 实用文档 addMessage( )函数来实现。 3、查询员工信息模块:浏览所有员工的相关信息,通过自己定义的void Listfind ( )函数来实现。 4、删除员工模块:删除需要删除的员工的所有信息,通过自己定义的void ListDelete ( )函数来实现。 5、修改模块:可以修改需要修改的员工的相关信息,通过自己定义的void ListModify( )函数来实现。 6、员工信息排序模块:可以按照规定要求对员工信息排序,通过自己定义的void sort( )函数来实现。 7、退出系统模块。 四、测试过程 1、进入系统如图所示: 2、根据提示信息输入1、增加员工信息: 文案大全 实用文档 3、根据提示信息输入3查询员工信息,选择第一种对姓名进行查询做演示: 4,根据提示信息修改员工信息: 文案大全 实用文档 5、根据提示信息输入5,选择按编号进行排序: 6、根据提示信息,输入2删除员工信息 文案大全 实用文档 五、用户使用说明 进入员工管理系统,首先看到的就是主菜单界面 选择1:进入添加员工信息模块,按照提示语依次录入员工对象信息。 选择2:进入删除员工信息模块。 选择3:进入员工查询模块,在此模块下,系统提示:按姓名查询、按编号查询,系统根据用户选择进行相应的处理,退出查询模块时,系统进入主菜单模块。 选择4:进入修改员工信息模块,在该模块下,系统提示:修改整条信息,修改部分信息,系统根据用户选择,进行相应的功能处理。当用户选择退出修改模块时,系统进入主菜单模块。 选择5:进入排序模块,在该模块下,系统提示:按年龄排序、按工龄排序、回复原排序,系统根据用户的选择,进行相应的处理。 选择0:退出系统。 六、总结 本次课程设计是围绕数据结构进行。根据问题描述可知,需要解决问题并不复杂,整个问题只需要实现一个员工管理系统功能,那就是在这个系统中实现对员工信息的插入、删除、查询、排序、修改。但是,为了实现该功能,却需要优秀的算法和数据结构以保证实现的时间和空间效率。把员工信息存储在一个单链表中,利用指针实现对员工信息的各项基本操作。 虽然设计的程序完成了题目描述所需要实现的功能,但是仍然存在不如人意的地方,比如可以排序上面多设计几个算法,实现多角度排序等。 经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法、以及软件工程的知识,并明白数据结构和算法对于程序时间和空间性能的影响软件开发流程和工具对于实现特定功能程序的重要意义。 当我们面对一个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法。因此应该综文案大全 实用文档 合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。 七、附录 程序源代码 #include #include #include #include #define ALLMAX 100 //总共统计的职工的人数 typedef struct Node { long int age,work_time,num; char sex,name[ALLMAX],job[ALLMAX]; struct Node *next; }SLNode; typedef struct { long int age,work_time,num; char name[ALLMAX],sex,job[ALLMAX]; }DataType; void ListInitiate(SLNode **head)//链表初始化 { if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1);//动态分配存储空间 (*head)->next=NULL; } SLNode *ListInsert(SLNode *head,DataType x)//职工信息的插入姓名并按照升序排列 { SLNode *p,*q,*s; p=head->next; if((q=(SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1);//动态分配存储空间 q->age=x.age; q->work_time=x.work_time; q->num=x.num; strcpy(q->name,x.name); 文案大全 实用文档 q->sex=x.sex; strcpy(q->job,x.job); if(head->next==NULL) {//如果只有链表的头结点,没有其他的结点,直接插入在头结点后面 head->next=q; head->next->next=NULL; } else{//链表非空 for(;p;p=p->next) { if(p->next!=NULL) { if(strcmp(p->name,x.name)<0&&strcmp(p->next->name,x.name)>0) {//位于两个结点之间 s=p->next; p->next=q; q->next=s; break; } else if(strcmp(p->name,x.name)==0)break; //如果姓名相同则不插入信息 } else if(strcmp(p->name,x.name)<0&&p->next==NULL) {//链表非空,并且在排序中是最后一个 p->next=q; q->next=NULL; break; } if(strcmp(p->name,x.name)>0) {//位于链表头结点之后的位置 s=head->next; head->next=q; q->next=s; break; } } } return head; } void ListDelete(SLNode *head)//职工信息的删除 { 文案大全 实用文档 SLNode *p,*s; char x[20]; s=head; p=head->next; if(head->next==NULL){//链表为空,输出:名单中无职工信息,无须删除! printf(\"无职工信息,无须删除!\\n\"); return; } printf(\"请输入要删除职工的姓名:\\n\"); //输入要删除的人的姓名 scanf(\"%s\ for(p;p;p=p->next){//在链表中从头到尾查找输入的人的姓名 if(strcmp(p->name,x)==0){ //如果存在,则删除,否则输出:名单中无职工信息,无须删除! s->next=p->next; free(p); printf(\"删除成功!请继续操作!\\n\"); break; } s=p; } if(p==NULL) {//链表本身为空 printf(\"无职工信息,无须删除!\\n\"); } } void ListModify(SLNode *head)//职工信息的修改 { DataType x; SLNode *p; p=head->next; if(p==NULL){//链表本身为空 printf(\"无职工信息,无须修改!\\n\"); return; } printf(\"请输入要修改的职工姓名:\\n\"); scanf(\"%s\ printf(\"依次写入该职工的新信息:\\n\"); for(;p;p=p->next) { if(strcmp(x.name,p->name)==0)//查找到了该职工的信息 { 文案大全 实用文档 printf(\"姓名\\n\"); scanf(\"%s\ getchar(); printf(\"性别\\n\"); scanf(\"%c\ printf(\"年龄\\n\"); scanf(\"%d\ printf(\"工龄\\n\"); scanf(\"%d\ printf(\"职务\\n\"); scanf(\"%s\ printf(\"编号\\n\"); scanf(\"%d\ printf(\"%s %c %d %d %s %d\\n\ printf(\"修改成功!请继续操作!\\n\"); break; } } if(p==NULL)//如果链表为空 printf(\"此职工不存在!\\n\"); } void put(SLNode *head,FILE *fp)//职工信息的保存 { SLNode *p; if((fp=fopen(\"职工名单.txt\ printf(\"无法打开'职工名单.txt'!\\n\"); exit(0); } for(p=head->next;p;p=p->next) { fprintf(fp,\"%s %c %d %d %s %d\\n\p->num); } if(fclose(fp)){ printf(\"无法关闭'职工名单.txt'!\\n\"); exit(0); } 文案大全 实用文档 } void Listfind(SLNode head)//职工信息的查找 { int i,j; SLNode *p; DataType x; if(head.next==NULL){//链表为空 printf(\"无职工信息,无法查询!\\n\"); return; } //返回主菜单 printf(\"\\n\"); printf(\"\******************************************************************\\n\"); printf(\"\* 职工信息查询操作 *\\n\"); printf(\"\* *\\n\"); printf(\"\* 0.退出查询系统,回到主菜单 *\\n\"); printf(\"\* 1.对姓名进行查询 *\\n\"); printf(\"\* 2.对编号进行查询 *\\n\"); printf(\"\* 3.对职务进行查询 *\\n\"); printf(\"\******************************************************************\\n\"); while(1) { printf(\"请输入您要选择的操作:\"); scanf(\"%d\ if(i==0)//输入0,退出查询系统,回到主菜单 break; else if(i==1){//输入1,对姓名进行查询 p=head.next; printf(\"请输入姓名:\"); scanf(\"%s\ j=0; for(p;p;p=p->next){ 文案大全 实用文档 if(strcmp(p->name,x.name)==0){//如果存在这个人,那么j自加 ++j; printf(\"%s %c %d %d %s %d\\n\um); } } if(j==0)//表示没有找到输入的信息 printf(\"职工名单中不存在此人!\\n\"); else printf(\"查询成功!请继续操作!\\n\"); } else if(i==2){//输入2,对编号进行查询 p=head.next; printf(\"请输入编号:\"); scanf(\"%d\ j=0; for(p;p;p=p->next){ if(p->num==x.num){//输入的编号在链表中存在 ++j;//如果存在这个人,那么j自加 printf(\"%s %c %d %d %s %d\\n\um); } } if(j==0)//表示没有找到输入的信息 printf(\"职工名单中没有这个编号的!\\n\"); else printf(\"查询成功!请继续操作!\\n\"); } else if(i==3){//输入3,对职务进行查询 p=head.next; printf(\"请输入职务:\"); scanf(\"%s\ j=0; for(p;p;p=p->next){ if(strcmp(p->job,x.job)==0){ ++j;//如果存在这个人,那么j自加 printf(\"%s %c %d %d %s %d\\n\um); } } if(j==0)//表示没有找到输入的信息 文案大全 实用文档 printf(\"职工名单中没有这种职务的!\\n\"); else printf(\"查询成功!请继续操作!\\n\"); } else if(i!=0 && i!=1 && i!=2 && i!=3 && i!=4 && i!=5 && i!=6 && i!=7)//输入任意不是上述数字的,那么久显示输入错误 printf(\"输入出错!请再次输入!\\n\"); printf(\"\\n\"); printf(\"\******************************************************************\\n\"); printf(\"\* 职工信息查询操作 *\\n\"); printf(\"\* *\\n\"); printf(\"\* 0.退出查询系统,回到主菜单 *\\n\"); printf(\"\* 1.对姓名进行查询 *\\n\"); printf(\"\* 2.对编号进行查询 *\\n\"); printf(\"\* 3.对职务进行查询 *\\n\"); printf(\"\******************************************************************\\n\"); //printf(\"0.退出查询系统,回到主菜单\\n1.对姓名进行查询\\n 2.对编号进行查询查询\\n3.对对职务进行查询\\n\"); } } void print(SLNode *head)//职工信息的显示 { for(SLNode *p=head->next;p;p=p->next)//输出所有职工的信息 printf(\"%s %c %d %d %s %d\\n\um); } 文案大全 实用文档 void Listpaixu(SLNode *head)//职工信息的排序 { int i,n=0,m,flag=1; SLNode *p,*q,*s; if(head->next==NULL){//职工链表为空 printf(\"名单中无职工信息,无法排序!\\n\\n\"); return; } printf(\"\\************************************************\\n\"); printf(\"\\* 职工信息排序操作 ***\\n\"); printf(\"\\* ***\\n\"); printf(\"\\* 0.退出排序系统,回到主菜单 ***\\n\"); printf(\"\\* 1.对编号进行排序 ***\\n\"); printf(\"\\* 2.对年龄进行排序 ***\\n\"); printf(\"\\* 3.显示全部职工信息 ***\\n\"); printf(\"\\************************************************\\n\"); while(1) { printf(\"请输入您要选择的操作:\"); scanf(\"%d\ if(i==0)//输入0,退出排序系统,回到主菜单 break; else if(i==1){//输入1,对编号进行排序 n=0,m,flag=1; for(p=head;NULL!=p;p=p->next)//统计职工人数 n++; for(m=1;flag&&m<=n;m++) { flag=0; for(q=head->next,p=head,s=p;q;s=p,p=q,q=q->next) { if(p->num>q->num)//p为当前节点,p的编号>p的后继节点的编号 { if(head==p)//p为头结点 { head->next=q->next; head=q; q->next=p;//交换节点信息 q=head->next; p=head; } else { 文案大全 实用文档 } p->next=q->next; q->next=p; s->next=q; p=q; q=p->next; } flag=1; } } } printf(\"排好序的信息如下:\\n\"); print(head);//输出所有节点的信息 return; else if(i==2){//输入2,对年龄进行排序 n=0,m,flag=1; for(p=head;NULL!=p;p=p->next)//统计职工人数 n++; for(m=1;flag&&m<=n;n++) { flag=0; for(q=head->next,p=head,s=p;q;s=p,p=q,q=q->next) { if(p->age>q->age)//对年龄进行排序 { if(head==p) { head->next=q->next; head=q; q->next=p; q=head->next; p=head; } else { p->next=q->next; q->next=p; s->next=q; p=q; q=p->next; } flag=1; } } 文案大全 实用文档 } printf(\"排好序的信息如下:\\n\"); print(head); return; } else if(i==3) { print(head); } else if(i!=0&&i!=1&&i!=2&&i!=3) printf(\"输入出错!请再次输入!\\n\\n\"); printf(\"\\************************************************\\n\"); printf(\"\\* 职工信息排序操作 ***\\n\"); printf(\"\\* ***\\n\"); printf(\"\\* 0.退出排序系统,回到主菜单 ***\\n\"); printf(\"\\* 1.对编号进行排序 ***\\n\"); printf(\"\\* 2.对年龄进行排序 ***\\n\"); printf(\"\\* 3.显示全部职工信息 ***\\n\"); printf(\"\\************************************************\\n\"); //printf(\"0.退出排序系统,回到主菜单\\n1.对编号进行排序\\n2.对年龄进行排序\\n3.显示\\n\"); } } void main() { DataType x; SLNode *head; int i,n; FILE *fp; ListInitiate(&head);//初始化链表 printf(\"\\n\"); printf(\"*******************************************************************************\\n\"); printf(\" 欢迎进入南京晓庄学院员工管理系统 \\n\"); printf(\"*******************************************************************************\\n\"); 文案大全 实用文档 printf(\"\\n\"); printf(\" ————————————————————— \\n\"); printf(\" * 1、增加员工信息 2、删除员工信息 *\\n\"); printf(\" * 3、查询员工信息 4、修改员工信息 *\\n\"); printf(\" * 5、员工信息排序 0、退出系统 *\\n\"); printf(\" ————————————————————— \\n\"); while(1) { printf(\"请输入您要选择的操作:\"); scanf(\"%d\ if(i==0)//输入0,结束系统 { printf(\"\\您已经选择退出职工管理系统\\n\"); break; } else if(i==1)//输入1,新增一名职工 { printf(\"姓名\\n\"); scanf(\"%s\ getchar(); printf(\"性别\\n\"); scanf(\"%c\ printf(\"年龄\\n\"); scanf(\"%d\ printf(\"工龄\\n\"); scanf(\"%d\ printf(\"职务\\n\"); scanf(\"%s\ printf(\"编号\\n\"); scanf(\"%d\ printf(\"%s %c %d %d %s %d\\n\ head=ListInsert(head,x); printf(\"新增成功!请继续操作!\\n\"); put(head,fp);//保存在文件中 } else if(i==2)//输入2,删除一名职工 { ListDelete(head); if((fp=fopen(\"职工名单.txt\文案大全 实用文档 printf(\"无法打开'职工名单.txt'!\\n\"); exit(0); } put(head,fp);//保存在文件中 if(fclose(fp)){ printf(\"无法关闭'职工名单.txt'!\\n\"); exit(0); } } else if(i==3)//输入3,查找一名职工 Listfind(*head); else if(i==4)//输入4,修改职工信息 { ListModify(head); if((fp=fopen(\"职工名单.txt\ printf(\"无法打开'职工名单.txt'!\\n\"); exit(0); } put(head,fp);//保存在文件中 if(fclose(fp)) { printf(\"无法关闭'职工名单.txt'!\\n\"); exit(0); } } else if(i==5)//输入5,对职工信息进行排序 { SLNode *p=head; Listpaixu(p); } //如果出入的不是上述任何一种情况就输出:输入出错 else printf(\"输入出错!请再次输入!\\n\"); printf(\"\\n\"); printf(\" ————————————————————— \\n\"); printf(\" * (1)增加员工信息 (2)删除员工信息 *\\n\"); printf(\" * (3)查询员工信息 (4)修改员工信息 *\\n\"); printf(\" * (5)员工信息排序 (0)退出 *\\n\"); printf(\" ————————————————————— \\n\"); //printf(\"0.结束系统\\n1.新增一名职工\\n2.删除一名职工\\n3.查询职工信息\\n4.修改职工信息\\n5.对职工信息进行排序\\n\"); } } 文案大全 实用文档 文案大全