资源描述
职工信息管理系统41747
《数据结构》课程设计报告
设计题目 职工信息管理系统
专 业
班 级
姓 名
学 号
完成日期
目 录
1、 问题描述………………………………………………(3)
2、 系统设计………………………………………………(3)
3、 数据结构与算法描述…………………………………(5)
4、 测试结果与分析………………………………………(15)
5、 总 结…………………………………………………(20)
6、 参考文献………………………………………………(20)
附录 程序源代码…………………………………………(20)
职工信息管理系统
1、 问题描述
试设计一个职工信息管理系统。要求可对职工信息进行插入、删除、查找、排序、输出等功能,职工对象包括编号、姓名、性别、出生年月、学历、工作年月、基本工资、电话、家庭住址等等。
2、 系统设计
2、1 设计目标
随着计算机产业得不断发展和信息时代得到来,各个企业和部门对员工得信息管理也已经走上了数字化得阶段,尤其就就是利用微机对工资得管理已经在各个企业单位起着越来越多得作用。以前得财会人员完全就就是靠手写来完成员工得各种记录,每天都忙碌于各种繁多得票据之间,这种工作繁重复杂,容易出错,不易修改,所以使用一个好得管理系统对减轻管理人员得工作量就就是很有帮助得,也就就是一个企业发展不可缺少得基础,她得开发应用简单而不失一般性,操作方便,功能强大,系统化,规范化,自动化,而且经济使用得职工管理系统已经成为了各个企业和部门离不开得电脑软件。
本系统实现得操作和功能如下:
1)职工信息表得建立:根据职工提供得信息,按单链表得方法建立职工信息表;
2)职工信息得添加:根据公司得需要,增加新得职工,必须把职工得基本信息写入职工信息表,方便公司管理;
3)职工信息得查询:根据公司需要,查找某一个职工得信息,可以按姓名或编号查找,将都显示职工得全部信息。
4)职工信息得修改:根据公司或职工需要,如果信息需要修改,可对职工得人一个信息进行更改。
5)职工信息得排序:根据公司需要,可对职工进行排序;
6)职工信息得删除:根据公司需要,若职工不在公司工作,可对其信息删除,以及时更新职工信息表;
7)职工信息得输出:根据公司需要,若要浏览职工信息,可对职工得全部信息输出,方便观看。
2、2 设计思想
职工信息表用单链表作为存储结构,且为了查找方便,职工信息应有序。为了查找方便,职工得线性表按职工编号有序,并且,为了插入和删除方便,应以链表作为存储结构。通过c++,使系统实现建表、增加信息、删除信息、查找信息、排序、输出等功能,而且提供一个界面来调用各个功能,并使界面尽可能清晰美观。
2、3 系统模块划分
菜单界面
建立职工信息表
职工信息得添加
职工信息得查询
职工信息得排序
职工信息得删除
职工信息得输出
退出职工管理系统
职工信息得修改
插入新得结点
删除结点
无记录
按菜单选项
结束程序运行
输出记录
冒泡排序法实现
按编号查询
按姓名查询
尾插法建立职工信息表
3、 数据结构与算法描述
3、2 职工信息表得建立,将一个职工结点按其编号得次序插入有序职工链表得相应位置,以保持链表得有序性。基本思想就就是使用尾插法建立新得结点。建表算法如下描述:
//用尾插法建立职工链表函数
void CreateList(NodePtr& head)
{//尾插法建立带头结点得职工链表算法
NodePtr rear;
rear=new ListNode;
int flag=0;//结束标志置0
rear=head;//尾指针初始指向头结点
while(flag==0){
NodePtr p;
p=new ListNode;
p->link=NULL;
cout<<"请输入:";
cout<<"编号 姓名 性别 出生日期 学历 工作年月 职务 基本工资 电话 地址\n";
cout<<"--------------------------------------------\n";
cin>>p->num>>p->name>>p->sex>>p->birthday>>p->education>>p->working_day;
cin>>p->post>>p->base_pay>>p->phone>>p->addr;
rear->link=p;//新结点连接到尾结点之后
rear=p;//尾结点指向新结点
cout<<"结束建表吗?(0/1):";
cin>>flag;
}
(head);
}
3、2 职工信息得输出
void PrintList(NodePtr head)
{
NodePtr p;
p=new ListNode;
p=head->link;//因为链表带头结点,使p指向链表开始接点
cout<<"编号 姓名 性别 出生年月 学历 工作年月 职务 基本工资 电话 地址\n";
cout<<"--------------------------------------------\n";
while(p!=NULL)
{
cout<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->birthday<<" ";
cout<<p->education<<" "<<p->working_day<<" "<<p->post<<" ";
cout<<p->base_pay<<" "<<p->phone<<" "<<p->addr<<endl;
p=p->link;//后移一个结点
}
}
3、2 职工信息得查询,如果结点为空,输出:没有查到要查询得职工;若结点不为空,可按姓名和编号进行查询。
void ListFind(NodePtr& head)
{//有序职工链表上得查找
NodePtr p;
p=new ListNode;
p=head->link;//假定职工表带头结点
char num[10],name[20];
int xz;
cout<<"================\n";
cout<<" 1、按编号查询 \n";
cout<<" 2、按姓名查询 \n";
cout<<"================\n";
cout<<"请选择:";cin>>xz;
if(xz==1){
cout<<"请输入要查找者得编号:";
cin>>num;
do{
if(strcmp(p->num,num)==0){
cout<<"编号 姓名 性别 出生年月 学历 工作年月 职务 基本工资 电话 地址\n";
cout<<"------------------------------------\n";
cout<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->birthday<<" ";
cout<<p->education<<" "<<p->working_day<<" "<<p->post<<" ";
cout<<p->base_pay<<" "<<p->phone<<" "<<p->addr<<endl;
cout<<"------------------------------------\n";
break;
}else p=p->link;
if(p==NULL)
cout<<"没有查到要查询得职工!\n";
}while(p!=NULL);
}
if(xz==2){
cout<<"请输入要查找者得姓名:";
cin>>name;
do{
if(strcmp(p->name,name)==0){
cout<<"编号 姓名 性别 出生年月 学历 工作年月 职务 基本工资 电话 地址\n";
cout<<"------------------------------------\n";
cout<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->birthday<<" ";
cout<<p->education<<" "<<p->working_day<<" "<<p->post<<" ";
cout<<p->base_pay<<" "<<p->phone<<" "<<p->addr<<endl;
cout<<"------------------------------------\n";
break;
}else p=p->link;
if(p==NULL)
cout<<"没有查到要查询得职工!\n";
}while(p!=NULL);
}
}
3、2 职工信息插入
void InsertNode(NodePtr& head)
{
NodePtr p;
p=new ListNode;
p->link=head->link;
head->link=p;
cin>>p->num>>p->name>>p->sex>>p->birthday>>p->education>>p->working_day;
cin>>p->post>>p->base_pay>>p->phone>>p->addr;
}
3、2 职工信息得修改,先输入职工得姓名,若没有该职工,输出:该系统没有该姓名得职工信息,无法修改、、,若有该职工,则可以修改该职工得任何一个信息;具体算法如下:
void Modify(NodePtr& head) //修改职工信息
{
NodePtr p;
p=head->link;
char name[15];//姓名
cout<<"请输入您要修改职工信息得姓名:";
cin>>name;
while(p)
{
if(strcmp(p->name,name)==0)
break;
p=p->link;
}
if(p==NULL)
{
cout<<"该系统没有该姓名得职工信息,无法修改、、、"<<endl;
cout<<"请按任意键继续、、、"<<endl;
getch();
ListFind(head);
}
else
{
cout<<"-------您现在可以修改此职工得信息了-------"<<endl;
//数据域。
cout<<"请输入职工新编号:";
cin>>p->num;
cout<<endl<<"请输入职工新姓名:";
cin>>p->name;
cout<<endl<<"请输入职工新性别:";
cin>>p->sex;
cout<<endl<<"请输入职工新出生年月:";
cin>>p->birthday;
while(cin、fail())
{
cout<<"请输入正确得年份格式。"<<endl;
cin、clear();
fflush(stdin);
cin>>p->birthday;
}
cout<<endl<<"请输入职工新学历:";
cin>>p->education;
cout<<endl<<"请输入职工新工作年月:";
cin>>p->working_day;
cout<<endl<<"请输入职工新职称:";
cin>>p->post;
cout<<endl<<"请输入职工基本工资:";
cin>>p->base_pay;
while(cin、fail())
{
cout<<"请输入正确得工资数据。"<<endl;
cin、clear();
fflush(stdin);
cin>>p->base_pay;
}
cout<<endl<<"请输入职工新电话: ";
cin>>p->phone;
cout<<endl<<"请输入职工新地址: ";
cin>>p->addr;
cout<<endl;
}
}
3、2 职工信息得排序,若系统没有职工信息,无法进行排序,若有职工信息,则按冒泡法进行排序。具体算法如下:
void Sort(NodePtr head)
{
NodePtr p,q;
p=head->link;
if(p==NULL)
{
cout<<"该系统还没有储存一个职工,没法进行排序、、、"<<endl;
cout<<"请按任意键继续、、、\n";
getch();
//menu_select();
}
else
{
while(p!=NULL)
{
q=p->link;
while(q!=NULL)
{
if(p->base_pay<q->base_pay)
s);
q=q->link;
}
p=p->link;
}
cout<<"排序成功、、、"<<endl;
}
}
void s &p,NodePtr &q)//交换两个节点里所含得信息
{
char num[10];//编号
char name[15];//姓名
char sex[5];//性别
char birthday[50];//出生年月
char education[50];//学历
char working_day[50];//工作年月
char post[50];//职务
int base_pay;//基本工资
char phone[50];//电话
char addr[50];//地址
strcpy(num,p->num);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->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);strcpy(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 num[10];
int flag=0;
cout<<"请输入要删除者得编号:";
cin>>num;
do{
if(strcmp(p->num,num)==0)
{
cout<<"编号 姓名 性别 出生年月 学历 工作年月 职务 基本工资 电话 地址\n";
cout<<"------------------------------------\n";
cout<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->birthday<<" ";
cout<<p->education<<" "<<p->working_day<<" "<<p->post<<" ";
cout<<p->base_pay<<" "<<p->phone<<" "<<p->addr<<endl;
cout<<"------------------------------------\n";
flag=1;
break;
}
else p=p->link;
if(p==NULL)
cout<<"没有查到要删除得职工!\n";
q=q->link;
}
while(p!=NULL);
if(flag==1)
{
cout<<"真得要删除该结点吗?(y/n): ";
char jx;cin>>jx;
if(jx=='y'||jx=='Y')
{
q->link=p->link;//删除结点
free(p);//释放被删除得结点空间
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、总结
通过本次课程设计,我学会了如何工程化得编写以下系统软件。首先,要对软件得需求有一个比较明确得认识,然后系统分析与系统设计,最后就就是代码设计与调试。软件实现上,设计了清楚得界面,并采用功能模块得设计思想。
在这个过程中,确实付出了很对努力,流了很多汗水,比如,要思考整个设计过程,要一点一点得改正代码中出现得错误等等,但现在想想,都不值得一提,因为从中得收获比什么都重要。同时,我也知道,我得设计还存在不足之处,我会坚持不懈!继续努力!
6、参考文献(包括书籍、论文、网络资料等)
C++buider 实例入门 陈雪飞 中国青年出版社
C++buider 彻底研究 陈灿煌 中国铁路出版社
C++面向对象程序设计(第6版) 清华出版社
网络上一些代码资料
附录 程序源代码
//主控菜单处理测试程序
#include<stdio、h>
#include<string>
#include<stdlib、h>
#include<conio、h>
#include<fstream>
#include<iostream>
using namespace std;
struct ListNode{//职工结点类型
char num[10];//编号
char name[15];//姓名
char sex[5];//性别
char birthday[50];//出生年月
char education[50];//学历
char working_day[50];//工作年月
char post[50];//职务
int base_pay;//基本工资
char phone[50];//电话
char addr[50];//地址
ListNode *link;//结点指针域
};
typedef ListNode *NodePtr;
NodePtr load();//导入信息到系统
void (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 DomoDify(NodePtr& head);
void Modify(NodePtr &head);
void Sort(NodePtr head);
void s &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 tp[100];
for(;;){
switch(menu_select())
{
case 1:cout<<"***********************\n";
cout<<"* 职工信息表得建立 *\n";
cout<<"***********************\n";
CreateList(head);break;
case 2:cout<<"***********************\n";
cout<<"* 职工信息得添加 *\n";
cout<<"编号 姓名 性别 出生日期 学历 工作年月 职务 基本工资 电话 地址\n";
cout<<"**********************************\n";
InsertNode(head);
(head);
break;
case 3:cout<<"**********************************\n";
cout<<"* 职工信息得查询 *\n";
cout<<"**********************************\n";
ListFind(head);
break;
case 4:cout<<"**********************************\n";
cout<<"* 职工信息得修改 *\n";
cout<<"**********************************\n";
// DomoDify(head);//修改结点
Modify(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);//删除结点
(head);
break;
case 7:cout<<"**********************************\n";
cout<<"* 职工信息表得输出 *\n";
cout<<"**********************************\n";
PrintList(head);
break;
case 0:cout<<"再见!\n";
return 0;
}
}
}
void (NodePtr head)//将链表中得信息保存到文件里
{
NodePtr p=head->link;
FILE *fp;
int num=0;
if((fp=fopen("","w"))==NULL)
{
cout<<"新建文件失败、、、"<<endl;
cout<<"请按任意键退出系统、、、"<<endl;
getch();
exit(0);
}
while(p!=NULL)
{
num++;
p=p->link;
}
p=head->link;
char c[255];
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");
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,q,head;
head=new ListNode;
head->link=NULL;
q=head;
char base_pay[10];
//p=new ListNode;
int num,i=0;
FILE *fp;
if((fp=fopen("","r"))==NULL)
{
cout<<"文件尚未存储数据、、、!\n";
//exit(1);
return head;
}
char c[255];
fgets(c,256,fp);
sscanf(c, "文件中%d个信息如下:\n", &num);
while(i<num)
{
p=new ListNode;//这里需要注意,必须放在这个循环得位置里,这就就是每一次都产生一个节点,链接到链表中去
fscanf(fp,"%s",p->num);
fscanf(fp,"%s",p->name);
fscanf(fp,"%s",p->sex);
fscanf(fp,"%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("==============================\n");
printf(" 1、职工信息表得建立\n"
展开阅读全文