1、数据构造课程设计报告设计题目 职工信息管理系统 专 业 班 级 姓 名 学 号 完毕日期 目 录1. 问题描述(3)2. 系统设计(3)3. 数据构造与算法描述(5)4. 测试成果与分析(15)5. 总 结(20)6. 参照文献(20)附录 程序源代码(20) 职工信息管理系统1. 问题描述试设计一种职工信息管理系统。规定可对职工信息进行插入、删除、查找、排序、输出等功能,职工对象涉及编号、姓名、性别、出生年月、学历、工作年月、基本工资、电话、家庭住址等等。2. 系统设计2.1 设计目的随着计算机产业不断发展和信息时代到来,各个公司和部门对员工信息管理也已经走上了数字化阶段,特别是运用微机对工
2、资管理已经在各个公司单位起着越来越多作用。此前财会人员完全是靠手写来完毕员工各种记录,每天都忙碌于各种繁多票据之间,这种工作繁重复杂,容易出错,不易修改,因此使用一种好管理系统对减轻管理人员工作量是很有协助,也是一种公司发展不可缺少基本,它开发应用简朴而不失普通性,操作以便,功能强大,系统化,规范化,自动化,并且经济使用职工管理系统已经成为了各个公司和部门离不开电脑软件。本系统实现操作和功能如下:1)职工信息表建立:依照职工提供信息,按单链表办法建立职工信息表;2)职工信息添加:依照公司需要,增长新职工,必要把职工基本信息写入职工信息表,以便公司管理;3)职工信息查询:依照公司需要,查找某一种
3、职工信息,可以按姓名或编号查找,将都显示职工所有信息。4)职工信息修改:依照公司或职工需要,如果信息需要修改,可对职工人一种信息进行更改。5)职工信息排序:依照公司需要,可对职工进行排序;6)职工信息删除:依照公司需要,若职工不在公司工作,可对其信息删除,以及时更新职工信息表;7)职工信息输出:依照公司需要,若要浏览职工信息,可对职工所有信息输出,以便观看。2.2 设计思想职工信息表用单链表作为存储构造,且为了查找以便,职工信息应有序。为了查找以便,职工线性表按职工编号有序,并且,为了插入和删除以便,应以链表作为存储构造。通过c+,使系统实现建表、增长信息、删除信息、查找信息、排序、输出等功能
4、,并且提供一种界面来调用各个功能,并使界面尽量清晰美观。2.3 系统模块划分菜单界面建立职工信息表职工信息添加职工信息查询职工信息排序职工信息删除职工信息输出退出职工管理系统职工信息修改插入新结点删除结点无记录按菜单选项结束程序运营输出记录冒泡排序法实现按编号查询按姓名查询尾插法建立职工信息表3. 数据构造与算法描述3.2 职工信息表建立,将一种职工结点按其编号顺序插入有序职工链表相应位置,以保持链表有序性。基本思想是使用尾插法建立新结点。建表算法如下描述:/用尾插法建立职工链表函数void CreateList(NodePtr& head)/尾插法建立带头结点职工链表算法 NodePtr r
5、ear; rear=new ListNode; int flag=0;/结束标志置0 rear=head;/尾指针初始指向头结点 while(flag=0) NodePtr p; p=new ListNode; p-link=NULL; cout请输入:; cout编号 姓名 性别 出生日期 学历 工作年月 职务 基本工资 电话 地址n; coutp-nump-namep-sexp-birthdayp-educationp-working_day; cinp-postp-base_payp-phonep-addr; rear-link=p;/新结点连接到尾结点之后 rear=p;/尾结点指向新
6、结点 coutflag; filesave(head);3.2 职工信息输出void PrintList(NodePtr head) NodePtr p; p=new ListNode; p=head-link;/由于链表带头结点,使p指向链表开始接点 cout编号 姓名 性别 出生年月 学历 工作年月 职务 基本工资 电话 地址n; cout-n; while(p!=NULL) coutnum name sex birthday ; couteducation working_day post ; coutbase_pay phone addrlink;/后移一种结点 3.2 职工信息查询,
7、如果结点为空,输出:没有查到要查询职工;若结点不为空,可按姓名和编号进行查询。void ListFind(NodePtr& head)/有序职工链表上查找 NodePtr p; p=new ListNode; p=head-link;/假定职工表带头结点 char num10,name20; int xz; cout=n; cout 1.按编号查询 n; cout 2.按姓名查询 n; cout=n; coutxz; if(xz=1) coutnum; do if(strcmp(p-num,num)=0) cout编号 姓名 性别 出生年月 学历 工作年月 职务 基本工资 电话 地址n; co
8、ut-n; coutnum name sex birthday ; couteducation working_day post ; coutbase_pay phone addrendl; coutlink; if(p=NULL) cout没有查到要查询职工!n; while(p!=NULL); if(xz=2) coutname; do if(strcmp(p-name,name)=0) cout编号 姓名 性别 出生年月 学历 工作年月 职务 基本工资 电话 地址n; cout-n; coutnum name sex birthday ; couteducation working_da
9、y post ; coutbase_pay phone addrendl; coutlink; if(p=NULL) coutlink=head-link; head-link=p; cinp-nump-namep-sexp-birthdayp-educationp-working_day; cinp-postp-base_payp-phonep-addr;3.2 职工信息修改,先输入职工姓名,若没有该职工,输出:该系统没有该姓名职工信息,无法修改.,若有该职工,则可以修改该职工任何一种信息;详细算法如下:void Modify(NodePtr& head) /修改职工信息 NodePtr p
10、; p=head-link; char name15;/姓名 coutname; while(p) if(strcmp(p-name,name)=0) break; p=p-link; if(p=NULL) cout该系统没有该姓名职工信息,无法修改.endl; cout请按任意键继续.endl; getch(); ListFind(head);elsecout-你当前可以修改此职工信息了-endl;/数据域。 coutp-num;coutendlp-name;coutendlp-sex;coutendlp-birthday;while(cin.fail() cout请输入对的年份格式。p-b
11、irthday; coutendlp-education;coutendlp-working_day;coutendlp-post;coutendlp-base_pay;while(cin.fail() cout请输入对的工资数据。p-base_pay; coutendlp-phone;coutendlp-addr;coutlink; if(p=NULL) cout该系统还没有储存一种职工,没法进行排序.endl; coutlink; while(q!=NULL) if(p-base_paybase_pay) swap(p,q); q=q-link; p=p-link; cout排序成功.nu
12、m);strcpy(p-num,q-num);strcpy(q-num,num); strcpy(name,p-name);strcpy(p-name,q-name);strcpy(q-name,name); strcpy(sex,p-sex);strcpy(p-sex,q-sex);strcpy(q-sex,sex); strcpy(birthday,p-birthday);strcpy(p-birthday,q-birthday);strcpy(q-birthday,birthday); strcpy(education,p-education);strcpy(p-education,q-
13、education);strcpy(q-education,education); strcpy(working_day,p-working_day);strcpy(p-working_day,q-working_day);strcpy(q-working_day,working_day); strcpy(post,p-post);strcpy(p-post,q-post);strcpy(q-post,post); base_pay=p-base_pay;p-base_pay=q-base_pay;q-base_pay=base_pay; strcpy(phone,p-phone);strcp
14、y(p-phone,q-phone);strcpy(q-phone,phone); strcpy(addr,p-addr);strcpy(p-addr,q-addr);strcpy(q-addr,addr);3.2 职工信息删除,先输入职工工号,若结点为空,则输出:没有找到要删除职工,若结点不为空,输出职工信息,提示真要删除该职工吗,选取y或n可进行操作。详细算法如下:void DelNode(NodePtr& head) NodePtr p,q; p=new ListNode;q=new ListNode; p=head-link;/假定职工信息表带头结点 q=head; char num1
15、0; int flag=0; coutnum; do if(strcmp(p-num,num)=0) cout编号 姓名 性别 出生年月 学历 工作年月 职务 基本工资 电话 地址n; cout-n; coutnum name sex birthday ; couteducation working_day post ; coutbase_pay phone addrendl; coutlink; if(p=NULL) coutlink; while(p!=NULL); if(flag=1) coutjx; if(jx=y|jx=Y) q-link=p-link;/删除结点 free(p);/
16、释放被删除结点空间 cout职工已被删除!n; /return 0;通过以上算法实现如下菜单模块:printf( 欢迎进入职工信息管理系统n); printf(=n); printf( 1.职工信息表建立n); printf( 2.职工结点添加n); printf( 3.职工结点查询n); printf( 4.职工信息修改n); printf( 5.职工信息排序n); printf( 6.职工结点删除n); printf( 7.职工链表输出n); printf( 0.退出管理系统n); printf(=n);printf( 请选取0-7:);4.测试成果与分析(将测试成果抓图阐明)5.总结 通
17、过本次课程设计,我学会了如何工程化编写如下系统软件。一方面,要对软件需求有一种比较明确结识,然后系统分析与系统设计,最后是代码设计与调试。软件实现上,设计了清晰界面,并采用功能模块设计思想。 在这个过程中,的确付出了很对努力,流了诸多汗水,例如,要思考整个设计过程,要一点一点改正代码中浮现错误等等,但当前想想,都不值得一提,由于从中收获比什么都重要。同步,我也懂得,我设计还存在局限性之处,我会坚持不懈!继续努力!6.参照文献(涉及书籍、论文、网络资料等)C+buider 实例入门 陈雪飞 中华人民共和国青年出版社C+buider 彻底研究 陈灿煌 中华人民共和国铁路出版社C+面向对象程序设计(
18、第6版) 清华出版社网络上某些代码资料附录 程序源代码/主控菜单解决测试程序 #include#include#include#include#include#includeusing namespace std;struct ListNode/职工结点类型 char num10;/编号 char name15;/姓名 char sex5;/性别 char birthday50;/出生年月 char education50;/学历 char working_day50;/工作年月 char post50;/职务 int base_pay;/基本工资 char phone50;/电话 char
19、addr50;/地址 ListNode *link;/结点指针域;typedef ListNode *NodePtr;NodePtr load();/导入信息到系统void filesave(NodePtr head);/将链表中信息保存到文献里 int menu_select();void CreateList(NodePtr& head);void PrintList(NodePtr head);void ListFind(NodePtr& head);void InsertNode(NodePtr& head);void DelNode(NodePtr& head);/void Domo
20、Dify(NodePtr& head);void Modify(NodePtr &head);void Sort(NodePtr head);void swap(NodePtr &p,NodePtr &q);/互换两个节点里所含信息 /void Disp(NodePtr& base_pay);/主函数int main() NodePtr head,p,ptr; / int base_pay; head=new ListNode;/申请头结点 head=load(); /int n; /char tp100; for(;) switch(menu_select() case 1:cout*n;
21、cout* 职工信息表建立 *n; cout*n; CreateList(head);break; case 2:cout*n; cout* 职工信息添加 *n; cout编号 姓名 性别 出生日期 学历 工作年月 职务 基本工资 电话 地址n; cout*n; InsertNode(head); filesave(head); break; case 3:cout*n; cout* 职工信息查询 *n; cout*n; ListFind(head); break; case 4:cout*n; cout* 职工信息修改 *n; cout*n; / DomoDify(head);/修改结点 M
22、odify(head); break; case 5:cout*n; /cout* 按工资排序 *n; cout*n; Sort(head);/按工资排序 /PrintList(head); /Disp(tp,n); break; case 6:cout*n; cout* 职工信息删除 *n; cout*n; DelNode(head);/删除结点 filesave(head); break; case 7:cout*n; cout* 职工信息表输出 *n; cout*n; PrintList(head); break; case 0:coutlink; FILE *fp; int num=0
23、; if(fp=fopen(file.txt,w)=NULL) cout新建文献失败.endl; cout请按任意键退出系统.link; p=head-link; char c255; sprintf(c,文献中%d个信息如下:n,num); fputs(c,fp); while(p!=NULL) fprintf(fp,%s,p-num);fprintf(fp,t); fprintf(fp,%s,p-name);fprintf(fp,t); fprintf(fp,%s,p-sex);fprintf(fp,t); fprintf(fp,%s,p-birthday);fprintf(fp,t);
24、fprintf(fp,%s,p-education);fprintf(fp,t); fprintf(fp,%s,p-working_day);fprintf(fp,t); fprintf(fp,%s,p-post);fprintf(fp,t); fprintf(fp,%d,p-base_pay);fprintf(fp,t); fprintf(fp,%s,p-phone);fprintf(fp,t); fprintf(fp,%s,p-addr);fprintf(fp,t); fprintf(fp,n); p=p-link; fclose(fp);NodePtr load() NodePtr p,
25、q,head; head=new ListNode; head-link=NULL; q=head; char base_pay10; /p=new ListNode; int num,i=0; FILE *fp; if(fp=fopen(file.txt,r)=NULL) cout文献尚未存储数据.!n;/exit(1);return head; char c255; fgets(c,256,fp); sscanf(c,文献中%d个信息如下:n,&num); while(inum); fscanf(fp,%s,p-name); fscanf(fp,%s,p-sex); fscanf(fp,%
26、s,p-birthday); fscanf(fp,%s,p-education); fscanf(fp,%s,p-working_day); fscanf(fp,%s,p-post); / fscanf(fp,%d,p-base_pay); fscanf(fp,%s,base_pay); p-base_pay=atoi(base_pay); fscanf(fp,%s,p-phone); fscanf(fp,%s,p-addr); p-link=NULL; q-link=p; q=p; i+; fclose(fp); return head; /菜单选取函数程序int menu_select() int sn; printf( 欢迎进入职工信息管理系统n); printf(=