职工信息管理系统.docx
《职工信息管理系统.docx》由会员分享,可在线阅读,更多相关《职工信息管理系统.docx(43页珍藏版)》请在冰豆网上搜索。
职工信息管理系统
《程序设计基础》
课程设计报告
设计题目职工信息管理系统
专业计算机科学与技术
班级
姓名
学号
完成日期
(空两行)
1.问题描述………………………………………………页码
2.系统设计………………………………………………页码
3.数据结构与算法描述…………………………………页码
4.测试结果与分析………………………………………页码
5.总结…………………………………………………页码
6.参考文献………………………………………………页码
附录程序源代码…………………………………………页码
(要求:
给出一级目录,宋体加粗,四号字,1.5倍行距。
)
(报告正文部分):
课程设计题目
(要求:
正文部分一律用小四号字,宋体,1.5倍行距。
一级标题靠左,四号加粗。
二级、三级标题靠左,小四加粗。
)
1.问题描述
[问题描述]对单位的职工进行管理,包括插入、删除、查找、排序等功能。
[基本要求]职工对象包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。
1)新增一名职工:
将新增职工对象按姓名以字典方式存到职工管理文件中。
2)删除一名职工:
从职工管理文件中删除一名职工对象。
3)查询:
从职工管理文件中查询符合某些条件的职工。
4)修改:
检索某个职工对象,对其某些属性进行修改。
5)排序:
按某种需要对职工对象文件进行排序。
[实现提示]职工对象数不必很多,便于一次读入内存,所有操作不经过内外存交换。
1)由键盘输入职工对象,以文件方式保存。
程序执行时先将文件读入内存。
2)对职工对象中的"姓名"按字典顺序进行排序。
3)对排序后的职工对象进行增、删、查询、修改、排序等操作。
[选做内容]将职工对象按散列法存储,并设计解决冲突的方法。
在此基础上实现增、删、查询、修改、排序等操作。
2.系统设计
2.1设计目标
设计一个实用的简单职工信息管理系统,用链表来存储职工的基本信息和工资信息,完成对职工信息包括职工编号、职工姓名、出生日期、职工性别、职工职称、职工部门、职工工资等信息的新建、修改、删除、查找、排序、保存、显示等操作。
2.2设计思想
设计一个菜单,通过菜单选择实现相应操作。
对于输入的原始信息,使用链表存储它们。
这样做的好处是,可以随时增加内容,也容易将职工信息从文件中删除。
为职工设计一个类,单独设计完成这个文件读写的成员函数。
使用结构数组作为职工信息的存储器,由它们和文件建立读写关系。
需要显示它们时,先将文件读入内存,然后再显示。
需要显示输出职工信息时,则直接从内存链表中筛选。
当然,需要显示原始信息时,也通过直接显示链表信息的方法实现。
这四种数据的显示问题均通过一个成员函数来完成。
用类的成员函数对链表的数据进行操作
1)新建函数LinkCreate(LinkHead);//创建一个带头节点的空链表
2)修改函数LinkModify(LinkHead);//修改单个节点
3)删除函数LinkDel(Link&Head);//
4)查询函数
boolSearch(LinkHead)//查询同时满足“姓名”和“部门”的职工信息
LinkSearch_Unique_Front(LinkHead)//查询满足“职工代码“的职工信息(职工代码必需唯一)
5)保存函数voidSave_ByFile(LinkHead)//
6)排序函数(包括按工资排序和按姓名进行字典排序)
//LinkSort(LinkHead)
//LinkSort_byname(LinkHead)
7)显示函数voidDisplay_List(LinkHead)
2.3系统模块划分(要给出流程图)
2.4设计职工工资信息的数据结构表。
表2-3职工信息管理
序号
成员数
数据类型
可否为空
1
m_Code
string
职工编号
2
m_Name
string
职工姓名
3
m_Sex
string
职工性别
4
m_Post
string
职工职称
5
m_Year
string
出生年月
6
m_Department
string
职工部门
7
m_Wage
unsignedint
职工工资
3.数据结构与算法描述
图3-1 总体结构设计框图
(图序、图名图3-1×××置于图的下方,宋体小四居中,单倍行距,图序与图名文字之间空一个汉字符宽度)
4.测试结果与分析(可将测试过程抓图说明)
5.1新建函数LinkCreate(LinkHead)的测试。
5.2保存函数voidSave_ByFile(LinkHead)的测试。
5.3显示函数voidDisplay_List(LinkHead)的测试。
5.4查询函数boolSearch(LinkHead)的测试
5.5排序函数的LinkSort(LinkHead)的测试
按姓名字典排序
按工资高低排序
5.6修改函数LinkModify(LinkHead)的测试
5.7删除函数LinkDel(Link&Head)的测试
5.总结
通过一年对程序设计的学习,我已经能够进行简单的程序设计,这次课程设计对自己所学知识起到了检测和提高的作用。
课程设计中用到了类、结构、链表、文件的储存和读取等方式对职工信息进行较为全面的管理,对一年来程序设计的学习有一个综合性的检测和应用。
程序的设计中遇到不少问题,例如如何进行排序算法的边写,文件的读写功能等等,通过和同学的讨论与交流,解决了不少问题。
程序的调试过程中也有不少问题,例如标点、菜单的界面设计等。
课程设计完成后,感觉上最大的收获就是在设计之前要有一个清晰的思路和完整的设计提纲,对各功能函数的作用做详细考虑。
细心在这次课程设计中起到很关键的作用,一个标点、一个字母、一个符号都可能导致程序的不能运行,因此要有耐心认真完成。
当然知识是不可缺少的,只有对这学期所学得知识能够真正掌握并能加以运用,才能顺利完成这次的课程设计。
6.参考文献
附录程序源代码
1、头文件structdef.h
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
structEmployee
{//声明职工的结构作为链表节点。
//-----数据域-----
stringm_Code;//编号
stringm_Name;//姓名
//unsignedshortintm_Year;
stringm_Year;//出生年月
stringm_Sex;//性别
stringm_Post;//
stringm_Department;
unsignedintm_Wage;
//stringm_Wage;
//链表节点的指针域---
structEmployee*Next;
};
/*
structEmployee
{//声明职工的结构作为链表节点。
//-----数据域-----
charm_Code[10];
charm_Name[10];
unsignedshortintm_Year;
charm_Sex[2];
charm_Post[12];
charm_Department[16];
unsignedintm_Wage;
//链表节点的指针域---
structEmployee*Next;
};*/
//-----取别名-------
typedefstructEmployeeNode;
typedefNode*Link;
//-------函数声明-------------
LinkCreate(LinkHead);
voidRelease(LinkHead);
LinkAdd(LinkHead);
boolSearch(LinkHead);
LinkSearch_Unique(LinkHead);
voidDisplay_List(LinkHead);
voidDisplay_Node(LinkpNode);
LinkModify(LinkHead);
//LinkDel(LinkHead);
LinkDel(Link&);
//voidSave_ByFile(LinkHead,fstream&ofile);
voidSave_ByFile(LinkHead);
LinkSort(LinkHead);
//voidLoad_ByFile(Link&pNode,fstream&ifile);
voidLoad_ByFile(Link&pNode);
LinkSort_byname(LinkHead);
2、修改和排序SortModify.cpp
//修改职工信息函数
LinkModify(LinkHead)
{//修改单一个节点。
stringco;
cout<<"输入你要修改的职工编号:
";cin>>co;
Linkptr;
Linkptr_front;
ptr_front=Head;
while(ptr_front){
ptr=ptr_front->Next;
if(ptr==NULL)break;
elseif(ptr->m_Code==co){break;//找到,为ptr
}
ptr_front=ptr_front->Next;
}
//stringcode,name,sex,post,department,year;
//unsignedintwage;
cout<<"找到一条记录如下:
\n";
cout<<"---------------------------------------------------------------\n";
cout<<"职工编号职工姓名出生日期性别\t职称\t部门\t工资\n";
Display_Node(ptr);
cout<<"---------------------------------------------------------------\n";
cout<<"请输入你要修改的内容:
\n";
cout<<"╭------------------------------------╮"<cout<<"∣1.职工编号2.职工姓名∣"<cout<<"∣3.出生日期4.性别∣"<cout<<"∣5.职工职称6.部门∣"<cout<<"∣7.职工工资0.取消修改∣"<cout<<"╰------------------------------------╯"<intchoice;
stringagain;
intflag=0;
do{
cout<";
cin>>choice;
switch(choice){
case1:
cout<<"请输入职工编号:
";
//cin>>code;
cin>>ptr->m_Code;
break;
case2:
cout<";
//cin>>name;
cin>>ptr->m_Name;
break;
case3:
cout<";
//cin>>year;
cin>>ptr->m_Year;
break;
case4:
cout<<"请输入职工性别(1.男/2.女):
";
//cin>>sex;
cin>>ptr->m_Sex;
break;
case5:
cout<<"请输入职工职称:
";
//cin>>post;
cin>>ptr->m_Post;
break;
case6:
cout<<"请输入职工部门:
";
//cin>>department;
cin>>ptr->m_Department;
break;
case7:
cout<<"请输入职工工资:
";
//cin>>wage;
cin>>ptr->m_Wage;
break;
case0:
returnHead;
default:
cout<<"你的输入有误!
请重新输入:
";
}
cout<<"是否继续(y/n)?
";
while
(1){
cin>>again;
if(again=="N"||again=="n"){flag=0;break;}
elseif(again=="Y"||again=="y"){flag=1;break;}
elsecout<<"输入有误!
请重新选择:
";
}
}while(flag);
cout<<"信息已成功修改,请注意保存!
\n\n";
returnHead;
}
//对职工信息进行排序(包括按工资排序和按姓名进行字典排序)
LinkSort(LinkHead)
{//我创建的是带头节点的链表。
用直接插入法。
if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。
{
cout<<"数据节点数少于2个,不用排序!
"<returnHead;
}
//-----------第二步;
Linkptr;
Linkptr_F;
Linkptr_N;
ptr=Head->Next->Next;
ptr_F=Head;
Head->Next->Next=NULL;//到此,分成了两个链表。
//第三步。
while(ptr)
{
ptr_N=ptr->Next;
ptr_F=Head;//ptr_F的归位。
while(ptr_F->Next)
{
if(ptr->m_Wage>ptr_F->Next->m_Wage)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;
break;
}//if
else
{
ptr_F=ptr_F->Next;
}
}//while(ptr_F->Next)
if(ptr_F->Next==NULL)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;//表示插到有序链表的最后面了。
}
ptr=ptr_N;//归位,准备下一次排序。
}//while(ptr)
cout<<"\n从高到低,排序成功!
信息如下:
"<Display_List(Head);
returnHead;
}
//按姓名进行字典排序
LinkSort_byname(LinkHead)
{//我创建的是带头节点的链表。
用直接插入法。
if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。
{
cout<<"数据节点数少于2个,不用排序!
"<returnHead;
}
//-----------第二步;
Linkptr;
Linkptr_F;
Linkptr_N;
ptr=Head->Next->Next;
ptr_F=Head;
Head->Next->Next=NULL;//到此,分成了两个链表。
//第三步。
while(ptr)
{
ptr_N=ptr->Next;
ptr_F=Head;//ptr_F的归位。
while(ptr_F->Next)
{
if(ptr->m_NameNext->m_Name)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;
break;
}//if
else
{
ptr_F=ptr_F->Next;
}
}//while(ptr_F->Next)
if(ptr_F->Next==NULL)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;//表示插到有序链表的最后面了。
}
ptr=ptr_N;//归位,准备下一次排序。
}//while(ptr)
cout<<"\n按字典序排序如下:
"<Display_List(Head);
returnHead;
}
3、新建和删除addelet.cpp
//新建链表存放职工信息
LinkCreate(LinkHead)
{//创建一个带头节点的空链表。
Head=(Link)newNode;
if(!
Head)
{
cout<<"分配内存失败!
"<returnNULL;
}/*
Head->m_Code="";
Head->m_Name="";
Head->m_Year="";
Head->m_Sex="";
Head->m_Post="";
Head->m_Department="";
Head->m_Wage="";*/
Head->Next=NULL;
returnHead;
}
voidRelease(LinkHead)
{//释放链表。
Linkptr;//声明一个操作用的指针。
while(Head!
=NULL)
{
ptr=Head;
Head=Head->Next;
deleteptr;//释放节点资源。
}
}
LinkAdd(LinkHead)
{//前插法添加数据。
LinkpNew;//声明一个新节点。
stringagain;
intflag;
stringcode,name,sex,post,department,year;
//unsignedshortintyear;
unsignedintwage;
//stringwage;
do
{
pNew=(Link)newNode;
//数据
cout<<"请输入职工代码:
";
cin>>code;
cout<";
cin>>name;
cout<";
cin>>year;
while(cin.fail())
{
cout<<"请输入正确的日期格式。
"<cin.clear();
fflush(stdin);
cin>>year;
}
cout<";
while
(1){
cin>>sex;
if(sex=="1"||sex=="2")break;
elsecout<<"输入有误!
请重新输入:
";
}
cout<";
cin>>post;
cout<";
cin>>department;
cout<";
cin>>wage;
while(cin.fail())
{
cout<<"请输入正确的工资数据:
";
cin.clear();
fflush(stdin);
cin>>wage;
}
cout<pNew->m_Code=code;
pNew->m_Name=name;
pNew->m_Year=year;
pNew->m_Sex=sex;
pNew->m_Post=post;
pNew->m_Department=department;
pNew->m_Wage=wage;
//***********************************
/*strcpy(pNew->m_Code,code);//因ptr是前趋节点,所以要用ptr->Next;
strcpy(pNew->m_Name,name);
strcpy(pNew->m_Year,year);
strcpy(pNew->m_Sex,sex);
strcpy(pNew->m_Post,post);
strcpy(pNew->m_Department,department);
strcpy(pNew->m_Wage,wage);*/
//*********************************
//指针域。
pNew->Next=Head->Next;
Head->Next=pNew;
cout<<"数据添加成功!
是否继续添加(Y/N)?
"<while
(1){
cin>>again;
if(again=="N"||again=="n"){flag=0;break;}
elseif(again=="Y"||again=="y"){flag=1;break;}
elsecout<<"