课程设计实验报告职工管理系统.doc
课程设计实验报告-职工管理系统 课 程 设 计 报 课程名称: 院 (系): 专业班级:学 号: 姓 名:指导老师:1 告 承诺书 郑重声明:本人所呈交的课程设计是本人在导师指导下独立撰写并完成的,课程设计没有剽窃、抄袭、造假等违反学术道德、学术规范和侵权行为。本课程设计不包含任何其他个人或集体已经发表或撰写过的研究成果,如果引用则标识出了出处。对本课程设计的研究做出贡献的个人和集体,均已在文中以明确方式标明。课程设计与资料若有不实之处,本人承担一切相关责任。特此声明。 签名: 年 月 日 2 目 录1 课程设计任务与要求················································································· 41.1 课程设计目的. 41.1.1 问题描述 . 41.1.2 详细要求 . 41.2 问题分析. 5 2 概要设计 ··································································································· 52.1 总体设计思想. 52.2 系统功能设计. 62.3 模块函数构造. 6 3 详细设计 ··································································································· 73.1 抽象数据类型定义. 73.2 主函数设计. 83.3 查找算法设计. 93.4 排序算法设计. 9 4 课程设计总结 ·························································································· 115.1 该课程设计的特点. 115.2 存在的不足. 115.3 心得体会. 11 参考文献 ····································································································· 12 3 简单的职工管理系统1 课程设计任务与要求1.1 课程设计目的数据结构是计算机专业一门重要的专业技术基础课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术。本课程将为整个专业的学习以及软件设计水平的提高打下良好的基础。为了学好数据结构,必须掌握编写一些在特定数据结构上的算法,并通过上机调试,更好地掌握各种数据结构及其特点,此次数据结构课程设计目的正在于此。经过本次课程设计,我们对于数据结构基本理论和存储结构及算法设计将有更加深入的理解,并提高我们在实际设计操作中系统分析、结构确定、算法选择、数学建模和信息加工的能力,提高我们的C/C+语言程序设计能力,以及培养学我们编写程序设计文档的能力。1.1.1 问题描述根据题目要求,由于职工信息是存放在文件中,所以应提供文件的输入、输出等操作;在程序中需要浏览职工的信息,应提供显示、查找、排序等操作;另外还应提供键盘式选择菜单实现功能选择。1.1.2 详细要求(1)问题说明设计一个简单的职工管理系统,按照课程设计的要求,实现对职工信息的新增、修改、插入、删除、以及排序操作。(2)输入要求由系统管理员依次输入现有职工和新增职工的以下信息:姓名(可以重复)、性别、出生年月、工作年月、学历、职务、地址、电话等信息,并且注意输入时姓名、学历、职务、地址为字符串形式,性别为字符,其余的为长整型数字。(3)输出要求系统管理员根据公司的人员流动情况,选择系统提供的各项功能进行操作,并输出 4 相应的结果。1.2 问题分析(1)具体要求简单的职工管理系统主要实现以下功能: 新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中。 删除一名职工:从职工管理文件中删除一名职工对象。 查询:从职工管理文件中查询符合某些条件的职工。 修改:检索某个职工对象,对其某些属性进行修改。 排序:按某种需要对职工对象文件进行排序。要求:职工信息包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。(2)实现提示: 由键盘输入职工对象,以文件方式保存。程序执行时先将文件读入总体设计思想根据职工管理系统问题的描述和详细需求分析,要达到上述功能,链表的数据结构来存储职工信息,并对其进行相应的插入、删除、修改、查询、排序、保存等操作。(1)输入功能的实现:要想实现职工管理系统的输入,必须要建立一个职工信息系统的抽象数据类型,其中职工信息以链表的存储方式实现。(2)系统处理功能的实现:系统管理员根据公司的人员流动情况,在提示信息的提示下,选择相应的服务进行操作。(3)输出的实现:根据选择的操作,输出与之对应的信息。综上可以绘制出职工管理问题的系统流程图,如图所示5 2.2 系统功能设计根据职工管理系统问题的分析和设计要求,可以得到该职工管理系统可以分为五个模块:职工信息添加模块、职工信息修改模块、职工信息删除模块、职工信息查询模块、职工信息排序模块。其系统功能结构如图所示。 2.3 模块函数构造根据系统功能结构图的描述,可以构造出该系统的抽象数据类型和相对应的函数,其方法名和功能如表1所示。表1 函数功能表 6 3 详细设计3.1 抽象数据类型定义(1)定义表结点(typedef struct Node)(2)定义职工信息(typedef struct Datatype) (3)初始化链表(ListInitiate(SLNode *head)) 7 3.2 主函数设计根据详细设计要求,可以得到主函数代码及其对应的程序流程图:在主函数中,实现了友好的界面设计。系统需要输入职工的基本信息:姓名、性别、出生年月、工作年月、学历、职务、住址、电话等。这个系统还利用键盘输入提供的主菜单服务,在主菜单中,有七种操作的调用:新增职工信息:SLNode *ListInsert(SLNode *head,DataType x)查询职工信息:Listfind(SLNode head)删除职工信息:ListDelete(SLNode *head)修改职工信息:ListModify(SLNode *head)职工信息排序:Listpaixu(SLNode *head)保存职工信息:bc(SLNode *head,FILE *fp)显示职工信息:print(SLNode *head)主函数代码见附录1主函数程序流程图如图所示: 8 3.3 查找算法设计在查询算法中,职工管理系统提供了七种查询操作,实现了系统的人性化查询操作。这些查询操作分别为:对姓名进行查询,对性别进行查询,对出生年月进行查询,对工作年月进行查询,对学历进行查询,对职位进行查询,对住址进行查询,对电话进行查询等一些列操作。查找算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。查询算法程序流程图如图所示: 3.4 排序算法设计在排序算法中,职工管理系统提供了四种查询操作,实现了系统的基本排序操作。 9 这些排序操作分别为:对姓名进行排序,对性别进行排序,对出生年月进行排序,对工作年月进行排序,等一些列操作。排序算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。排序的核心代码:排序算法流程图如图所示:10 4 课程设计总结5.1 该课程设计的特点本次课程设计是围绕数据结构进行。根据问题描述可知,需要解决问题并不复杂,整个问题只需要实现一个职工管理系统功能,那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改以及保存。但是,为了实现该功能,却需要优秀的算法和数据结构以保证实现的时间和空间效率。把职工信息存储在一个单链表中,利用指针实现对职工信息的各项基本操作。5.2 存在的不足虽然设计的程序完成了题目描述所需要实现的功能,但是仍然存在不尽人意的地方。那就是可以再排序上面多设计几个算法。实现多角度排序。在这个系统中没有职工序号的信息,所以允许职工姓名相同,在很大程度上面,可能是的职工信息重复。5.3 心得体会经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法、以及软件工程的知识,并对数据结构和算法的配合对于程序时间和空间性能的影响以及软件工程提 11 供的开发流程和工具对于实现特定功能程序的重要意义。当我们面对一个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法,例如,马踏棋盘问题就可以采用广度优先搜索或深度优先搜索来解决。因此此时就应该综合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。此外,对程序的测试应该要仔细,根据模块的特点和测试阶段,采用各种软件测试方法对程序进行测试,确保各个模块的正确性和完整性,最后集成起来测试其是否正确和完整地实现了问题描述中要求的功能。参考文献1 严蔚敏,吴伟民.数据结构(C语言版)M.清华大学出版社,2002.9附源代码#include <stdio.h>#include <string.h>#include <malloc.h>#include <stdlib.h>#define MAX 100typedef struct Node long int born_time,work_time,tele_num; char sexMAX,nameMAX,degreeMAX,jobMAX,addressMAX; struct Node *next;SLNode;typedef struct long int born_time,work_time,tele_num; 12 char nameMAX,sexMAX,degreeMAX,jobMAX,addressMAX;DataType;void ListInitiate(SLNode *head) void bc(SLNode *head,FILE *fp) fprintf(fp,"%s %s %d %d %s %s %s %dn",p->name,p->sex,p->born_time,p->work_time,p->degree,p->job,p->address,p->tele_num); 13 if(*head=(SLNode *)malloc(sizeof(SLNode)=NULL) exit(1); (*head)->next=NULL; SLNode *p; if(fp=fopen("职工名单.txt","w")=NULL)/ for(p=head->next;p;p=p->next) printf("无法打开职工名单.txt!n"); exit(0); if(fclose(fp) printf("无法关闭职工名单.txt!n"); exit(0); SLNode *ListInsert(SLNode *head,DataType x) SLNode *p,*q,*s; p=head->next; if(q=(SLNode *)malloc(sizeof(SLNode)=NULL) exit(1); q->born_time=x.born_time; q->work_time=x.work_time; q->tele_num=x.tele_num; strcpy(q->name,x.name); strcpy(q->sex,x.sex); strcpy(q->degree,x.degree); strcpy(q->job,x.job); strcpy(q->address,x.address); if(head->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) else if(strcmp(p->name,x.name)=0)break; 14 head->next=q; head->next->next=NULL; s=p->next; p->next=q; q->next=s; break; else if(strcmp(p->name,x.name)<0&&p->next=NULL) if(strcmp(p->name,x.name)>0) s=head->next; head->next=q; q->next=s; break; p->next=q; q->next=NULL; break; return head;void ListDelete(SLNode *head) SLNode *p,*s; char x20; s=head; p=head->next; if(head->next=NULL) printf("名单中无职工信息,无须删除!n"); 15 return; printf("请输入要删除职工的姓名:n"); scanf("%s",x); for(p;p;p=p->next) if(p=NULL) printf("名单中无职工信息,无须删除!n"); if(strcmp(p->name,x)=0) s=p; s->next=p->next; free(p); printf("删除成功!请继续操作!n"); break;void ListModify(SLNode *head) DataType x; SLNode *p; p=head->next; if(p=NULL) printf("职工名单无职工信息,无须修改!n"); 16 return; printf("请输入要修改的职工姓名:n"); scanf("%s",x.name); printf("依次写入该职工的新信息:n"); for(;p;p=p->next) scanf("%s %s %d %d %s %s %s %d",p->name,p->sex,&p->born_time,&p->work_time,p->degree,pif(strcmp(x.name,p->name)=0) ->job,p->address,&p->tele_num); void Listfind(SLNode head) printf("修改成功!请继续操作!n"); break; if(p=NULL) printf("此职工不存在,无法修改其信息!n"); int i,j; SLNode *p; DataType x; if(head.next=NULL) 17 printf("名单中无职工信息,无法查询!n"); return; printf("n"); printf("tn"); printf("t 职工信息查询操作 n"); printf("t n"); printf("t 0.退出查询系统,回到主菜单tt 1.对姓名进行查询tnt 2.对出生年月进行查询 tt 3.对学历进行查询tnt 4.对工作年月进行查询 tt5.对职务进行查询tnt 6.对住址进行查询 tt 7.对电话进行查询tn"); printf("tn"); printf("请输入您要选择的操作:"); scanf("%d",&i); switch(i) case 0:break; case 1: p=head.next; printf("请输入姓名:"); scanf("%s",x.name); j=0; for(p;p;p=p->next) if(strcmp(p->name,x.name)=0) +j;18 printf("%s %s %d %d %s %s %s %dn",p->name,p->sex,p->born_time,p->work_time,p->degree,p->job,p->address,p->tele_num); if(j=0) printf("职工名单中不存在此人!n"); else printf("查询成功!请继续操作!n"); break; case 2: p=head.next; printf("请输入出生年月:"); scanf("%d",&x.born_time); j=0; for(p;p;p=p->next) if(p->born_time=x.born_time) +j; printf("%s %s %d %d %s %s %s %dn",p->name,p->sex,p->born_time,p->work_time,p->degree,p->job,p->address,p->tele_num); if(j=0) printf("职工名单中没有这个时间出生的!n"); else printf("查询成功!请继续操作!n"); break; 19 case 3: p=head.next; printf("请输入学历:"); scanf("%s",x.degree); j=0; for(p;p;p=p->next) if(strcmp(p->degree,x.degree)=0) +j; printf("%s %s %d %d %s %s %s %dn",p->name,p->sex,p->born_time,p->work_time,p->degree,p->job,p->address,p->tele_num); if(j=0) printf("职工名单中没有这种学历的!n"); else printf("查询成功!请继续操作!n"); break; case 4: p=head.next; printf("请输入工作年月:"); scanf("%d",&x.work_time); j=0; for(p;p;p=p->next) if(p->work_time=x.work_time) +j; 20 printf("%s %s %d %d %s %s %s %dn",p->name,p->sex,p->born_time,p->work_time,p->degree,p->job,p->address,p->tele_num); if(j=0) printf("职工名单中没有这个时间工作的!n"); else printf("查询成功!请继续操作!n"); break; case 5: p=head.next; printf("请输入职务:"); scanf("%s",x.job); j=0; for(p;p;p=p->next) if(strcmp(p->job,x.job)=0) +j; printf("%s %s %d %d %s %s %s %dn",p->name,p->sex,p->born_time,p->work_time,p->degree,p->job,p->address,p->tele_num); if(j=0) printf("职工名单中没有这种职务的!n"); else printf("查询成功!请继续操作!n"); break; 21 case 6: p=head.next; printf("请输入住址:"); scanf("%s",x.address); j=0; for(p;p;p=p->next) if(strcmp(p->address,x.address)=0) +j; printf("%s %s %d %d %s %s %s %dn",p->name,p->sex,p->born_time,p->work_time,p->degree,p->job,p->address,p->tele_num); if(j=0) printf("职工名单中没有住这的!n"); else printf("查询成功!请继续操作!n"); break; case 7: p=head.next; printf("请输入电话:"); scanf("%d",&x.tele_num); j=0; for(p;p;p=p->next) if(p->tele_num=x.tele_num) 22 +j; printf("%s %s %d %d %s %s %s %dn",p->name,p->sex,p->born_time,p->work_time,p->degree,p->job,p->address,p->tele_num); if(j=0) printf("职工名单中没人用这个号码!n"); else printf("查询成功!请继续操作!n"); break; default: printf("输入出错!请再次输入!n"); void print(SLNode *head) printf("%s %s %d %d %s %s %s %dn",p->name,p->sex,p->born_time,p->work_time,p->degree,p->job,p->address,p->tele_num);void Listpaixu(SLNode *head) for(SLNode *p=head->next;p;p=p->next) int i,n=0,m,flag=1; SLNode *p,*q,*s; 23 if(head->next=NULL) printf("tt.n"); printf("名单中无职工信息,无法排序!nn"); return; printf("tt. 职工信息排序操作 .n"); printf("tt. .n"); printf("tt.t0.退出排序系统,回到主菜单 .ntt.t1.对性别进行排序 .ntt.t4.对姓名进行排序 .n"); .ntt.t2.对出生年月进行排序 .ntt.t3.对工作年月进行排序 printf("tt.n"); while(1) printf("请输入您要选择的操作:"); scanf("%d",&i); if(i=0) break; else if(i=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) 24 if(p->sex>q->sex) if(head=p) else flag=1; p->next=q->next; q->next=p; s->next=q; p=q; q=p->next; head->next=q->next; head=q; q->next=p; q=head->next; p=head; printf("排好序的信息如下:n姓名 t性别 t出生年月 t工作年月 t学历 t职25 位 t住址 t电话n"); print(head); return; else if(i=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->born_time>q->born_time) if(head=p) else 26 head->next=q->next; head=q; q->next=p; q=head->next; p=head; p->next=q->next; q->next=p; s->next=q; p=q; q=p->next; flag=1; printf("排好序的信息如下:n姓名 t性别 t出生年月 t工作年月 t学历 t职位 t住址 t电话n"); print(head); return; else if(i=3) 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->work_time>q->w