小型人员信息管理系统的设计与实现.docx
《小型人员信息管理系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《小型人员信息管理系统的设计与实现.docx(31页珍藏版)》请在冰豆网上搜索。
小型人员信息管理系统的设计与实现
PARTI
PARTII
类设计………………………………………………………………15
详细设计……………………………………………………………15
PARTI
1需求分析
(1)对小型公司做一个小型人员信息管理系统。
该公司主要有四类人员:
经理、兼职技术人员、销售经理和兼职推销员。
(2)该管理系统需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。
(3)该系统具体要求:
人员编号基数为1000,每输入一个人员信息编号顺序加1;对所有人员提升级别,所有人员的初始级别均为1级,然后进行升级,经理升为4级,兼职技术人员和销售经理升为3级,推销员认为1级;经理拿固定月薪8000元;兼职技术人员按每小时100元领取月薪;兼职推销员的月薪按该推销员当月销售额的4%提成;销售经理即拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的千分之五;要求为每一类人员单独建立文件,并在每个文件中手工录入一些人员基本信息,并根据这些基本信息计算职工的月薪,并将计算结果保存入相应的磁盘文件中。
2算法基本原理
1、定义一个员工虚基类Employee()包含姓名、编号、级别、当月薪水四个共有属性的数据成员;并在该虚基类基础上派生出经理Mansger()、兼职技术人员Technology()、销售经理Salemansger()和兼职推销员Salesman()四类派生类。
四种派生类分别实现各自的的员工升级、编号,添加各自特有的数据成员并计算出各自的月薪。
(1)员工等级直接按照要求赋值即可;
(2)在积累中定义静态数据成员staticintcount,并初始化intEmployee:
:
count=1000,
并在基类构造函数中实现编号的赋值++count;num=count;
(3)派生类调用构造函数时对数据成员进行赋值,并对各种派生类输入各自的用于计算月薪的数据成员,并按照要求计算各自的月薪。
2、定义一个结构体链表structLinked,并将该链表头指针封装在友元类Head()中。
3、运行时构造对象指针,并存在链表中,讲链表的头指针封装在一个友元类中。
利用类中的成员函数来实行对链表节点的打印、添加、删除以及查询。
这里所以的操作均为数据结构中对单链表的操作。
3类设计
首先定义一个员工类Employee作为基类,由于要派生多个派生类,所以将其定义成虚基类;然后由基类派生出四种派生类,分别是Mansger,Technology,Salemansger和Salesman。
定义一个结构体链表Linked用来存放生成的对象指针,并将头指针封装存放在友元类Head中。
基类Employee中的数据成员姓名、编号、等级、月薪以及一个静态变量,静态变量用来为员工自动赋值编号,在基类构造函数中输入员工姓名,并将编号和等级自动赋值。
派生类Mansger中无需添加新成员,在派生类Technology中添加工作时间,在Salemansger中添加部门月销售额,在Salesman添加月销售额。
派生类的功能有输出函数print(),储存函数save();
友元类Head中存放的数据成员有Linked*top,功能有构造函数Head(),插入函数Insert(),查询函数Check(),删除函数Delete(),输出函数print()。
基类与各派生类之间的关系如图:
Employee
#name[20]:
char
#num:
int
#rank:
int
#wages:
float
#count:
int=1000
+Employee()
+print():
void
Salesman
#name[20]:
char
#num:
int
#rank:
int
#wages:
float
+Employee()
+print():
void
-sum1:
int
+Salesman()
+print():
void
+save():
void
Salemansger
#name[20]:
char
#num:
int
#rank:
int
#wages:
float
+Employee()
+print():
void
-sum:
int
+Salemansger()
+print():
void
+save():
void
Technology
#name[20]:
char
#num:
int
#rank:
int
#wages:
float
+Employee()
+print():
void
-time:
int
+Technology()
+print():
void
+save():
void
Mansger
#name[20]:
char
#num:
int
#rank:
int
#wages:
float
+Employee()
+print():
void
+Mansger()
+print():
void
+save():
void
Head
-top:
struct*
+Insert(Employee*temp)
+Check():
void
+Delete():
void
+print():
void
4详细设计
整个程序分为三部分,各种职员的类,结构体链表以及封装链表的类。
实现时先生成各职员的对象指针,之后将生成的对象指针插入到链表中,最后通过封装类的成员函数对链表节点进行操作,最后实现对各员工的操作。
4.1类的接口设计
#include
#include
#include
usingnamespacestd;
classEmployee//基类Employee声明
{
protected:
//数据成员
charname[20];//员工姓名
intnum;//员工编号
intrank;//员工登记
floatwages;//员工月薪
staticintcount;//静态变量
public:
//外部接口
Employee();//构造函数
voidprint();//输出函数
friendclassHead;//声明友元类
};
classMansger:
virtualpublicEmployee//派生类Mansger声明
{
public:
Mansger():
Employee();//构造函数
voidprint();//输出函数
voidsave();//储存函数
friendclassHead;
};
classSalemansger:
virtualpublicEmployee//派生类Salemansger声明
{
protected:
intsum;//部门销售额
public:
Salemansger():
Employee();//构造函数
voidprint();//输出函数
voidsave();//储存函数
friendclassHead;
}
classTechnology:
virtualpublicEmployee//派生类Technology声明
{
protected:
inttime;//工作时间
public:
Technology():
Employee();//构造函数
voidprint();//输出函数
voidsave();//储存函数
friendclassHead;
};
classSalesman:
virtualpublicEmployee//派生类Salesman声明
{
protected:
intsum1;//个人销售额
public:
Salesman():
Employee();//构造函数
voidprint();//输出函数
voidsave();//储存函数
friendclassHead;;
};
structLinked//定义单链表
{
Employee*p;
Linked*next;
};
classHead//友元类Head声明
{
public:
Head();//构造函数
voidInsert(Employee*temp);//单链表插入函数
voidCheck();//查找函数
voidDelete();//删除函数
voidprint();//输出函数
~Head();//析构函数
private:
Linked*top;//单链表头指针
};
4.2类的实现
Employee//基类的实现
Employee:
:
Employee()//基类的构造函数
{
cout<<"输入姓名:
";
cin>>name;
++count;
num=count;
rank=1;}//基类成员赋值
voidEmployee:
:
print()//输出类数据成员
{
cout<<"编号"<}
Mansger//派生类的实现
Mansger:
:
Mansger():
Employee()//派生类构造函数
{
rank=4;
wages=8000;
}
voidMansger:
:
print()//输出函数
{
cout<<"编号"<}
voidMansger:
:
save()//储存函数
{
ofstreamfs("d:
\\Mansger.txt");
fs<cout<<"MansgerOK"<}
Salemansger//派生类的实现
Salemansger:
:
Salemansger():
Employee()//派生类构造函数
{
rank=3;
cout<<"输入部门销售总额:
";
cin>>sum;
wages=0.005*sum;
}
voidSalemansger:
:
print()//输出函数
{
cout<<"编号"<}
voidSalemansger:
:
save()//储存函数
{
ofstreamfs("d:
\\Salemansger.txt");
fs<cout<<"SalemansgerOK"<}
Technology//派生类的实现
Technology:
:
Technology():
Employee()//派生类的构造函数
{
rank=3;
cout<<"输入工作时间";
cin>>time;
wages=100*time;
}
voidTechnology:
:
print()//输出函数
{
cout<<"编号"<}
voidTechnology:
:
save()//储存函数
{
ofstreamfs("d:
\\Technology.txt");
fs<cout<<"TechnologyOK"<}
Salesman//派生类的实现
Salesman:
:
Salesman():
Employee()//派生类的构造函数
{
cout<<"输入月销售额:
";
cin>>sum1;
wages=0.04*sum1;
}
voidSalesman:
:
print()//派生类的输出函数
{
cout<<"编号"<}
voidSalesman:
:
save()//储存函数
{
ofstreamfs("d:
\\Salesman.txt");
fs<cout<<"SalesmanOK"<}
Head//友元类得实现
Head:
:
Head()//友元类的构造函数
{
if((top=newLinked)==NULL)
exit(-1);
top->next=NULL;
}
voidHead:
:
Insert(Employee*temp)//链表的插入函数
{
Linked*ttop=top;
while(ttop->next)
ttop=ttop->next;
ttop->next=newLinked;
ttop->next->p=temp;
ttop->next->next=0;
}
voidHead:
:
Check()//链表的查找函数
{
chars[20];
cout<<"输入要查找人的姓名:
";
cin>>s;
Linked*pbuf=top->next;
while(pbuf!
=NULL)
{
if(strcmp(pbuf->p->name,s)!
=0)
pbuf=pbuf->next;
elseif(strcmp(pbuf->p->name,s)==0)
{
cout<<"编号"<p->num<<""<<"姓名"<p->name<<""<<"等级"<p->rank<<""<<"月薪"<p->wages<pbuf=pbuf->next;
continue;
}
else
cout<<"查无此人"<}
}
voidHead:
:
Delete()//链表的删除函数
{
inta;
cout<<"输入要删除人的编号:
";
cin>>a;
Linked*pbuf=top,*q;
while(pbuf->next!
=NULL)
if(a!
=pbuf->next->p->num)
pbuf=pbuf->next;
elseif(a==pbuf->next->p->num)
{
q=pbuf->next;
pbuf->next=pbuf->next->next;
deleteq;
cout<<"删除成功"<}
else
cout<<"查无此人"<}
voidHead:
:
print()//链表的输出
{
Linked*pbuf=top->next;
while(pbuf!
=NULL)
{
pbuf->p->print();
pbuf=pbuf->next;
}
}
Head:
:
~Head()//友元类的析构函数
{
Linked*ttop,*q;
ttop=top->next;
while(ttop!
=NULL)
{
q=ttop;
ttop=ttop->next;
deleteq;
}
}
voidmnue(Head*Data)//菜单函数
{
intn;
cout<<"请输入1、查找2、删除3、打印0、退出:
\n";
cin>>n;
switch(n)
{
case1:
Data->Check();//查找链表节点
break;
case2:
Data->Delete();//删除链表节点
break;
case3:
Data->print();//输出链表节点
break;
case0:
break;
}
cout<<"是否继续(继续请按1/退出请按0)";
cin>>n;
if(n!
=0)mnue(Data);
}
voidmenu(Head*Data)//菜单函数
{
Mansger*M;
Salemansger*S;
Technology*T;
Salesman*SA;//声明类指针
intn;
cout<<"请输入1、经理2、销售经理3、技术员4、销售员0、退出:
\n";
cin>>n;
switch(n)
{
case1:
M=newMansger;//构造对象指针
M->save();//储存对象数据
Data->Insert(M);//将对象指针插入到链表中
break;
case2:
S=newSalemansger;//构造对象指针
S->save();//储存对象数据
Data->Insert(S);//将对象指针插入到链表中
break;
case3:
T=newTechnology;//构造对象指针
T->save();//储存对象数据
Data->Insert(T);//将对象指针插入到链表中
break;
case4:
SA=newSalesman;//构造对象指针
SA->save();//储存对象数据
Data->Insert(SA);//将对象指针插入到链表中
break;
case0:
break;
}
cout<<"是否继续(继续请按1/退出请按0)";
cin>>n;
if(n!
=0)menu(Data);//递归调用
}
在类的成员函数实现过程中,派生类的构造函数使用参数调用了基类的构造函数。
在类外定义成对象指针,并用new生成动态内存空间来储存,并将其插入到链表中并进行封装。
通过封装类对链表的操作从而调用各员工类中的成员函数对各员工类进行题目所需功能的操作。
4.3主函数设计
voidmain()//主函数
{
HeadData;//构造对象
intn;
while
(1)
{
cout<<"请输入(1、输入2、其他操作0、退出):
\n";
cin>>n;
switch(n)
{
case1:
menu(&Data);//菜单函数1
break;
case2:
mnue(&Data);//菜单函数2
break;
case0:
system("pause");
return;
}
}
system("cls");
}
5运行结果与分析
5.1程序运行结果
对员工类进行输入操作
实现查找、删除以及输出功能
储存成功
5.2运行结果分析
整个程序是采用单链表的形式来储存对象指针,合理的利用的内存资源。
为了通过封装链表的类对各员工类里的成员函数进行调用,再次将该类声明成友元类。
类的外部为对象指针申请动态的储存空间,并将其插入到单链表中,通过头结点对各个节点进行访问操作。
最后执行析构函数的时候讲点链表的节点一个一个释放掉。
PARTII
类设计
利用MFCAppWizard创建一个基于对话框的MFC应用程序。
该程序使用链表类,对公司的员工信息进行输入、删除、存盘以及读取的功能
详细设计
本程序链表类对象为一结构体CFund,它记录了姓名,编号,等级,月薪等所有员工的信息。
structCFund
{
CStringm_name;//姓名
CStringm_rank;//等级
floatwages;//月薪
floatincome;//用于计算月薪的变量
};
声明一个CPtrList型的链表类m_fundlist。
public:
Ch8Demo2Dlg(CWnd*pParent=NULL);//standardconstructor
CPtrListm_fundlist;
为对话框类添加一个成员函数Resfiesh,将链表对象中的数据在列表框显示。
voidCh8Demo2Dlg:
:
Reflesh()
{
CStringstr,str1;
m_cTheList.ResetContent();//清空列表框
if(!
m_fundlist.IsEmpty())//链表不为空
{
POSITIONpos=m_fundlist.GetHeadPosition();//获取链表头的位置
for(inti=0;i{
CFund*m_pFund=(CFund*)m_fundlist.GetNext(pos);
str1.Format("%f",m_pFund->income);//格式化月薪
str="姓名:
"+m_pFund->m_name+"等级:
"+m_pFund->m_rank+"薪水:
"+str1;
m_cTheList.AddString(str);//添加列表框数据
}
}
UpdateData(false);//更新总量编辑框
}
对列表框类进行输入,删除的操作代码如下:
voidCh8Demo2Dlg:
:
OnCheck()
{
UpdateData(TRUE);//获得编辑框数据
CFund*m_pFund=newCFund;//创建结构体对象指针
switch(m_radio)
{
case0:
//插入操作
if(m_name.IsEmpty())
{
AfxMessageBox("用户输入不正确");
return;
}
m_pFund->m_name=m_name;
m_pFund->m_rank="4";
//m_pFund->wages=m_wages;
m_pFund->income=8000;
m_fundlist.AddTail(m_pFund);
m_name="";
m_wages=0;
UpdateData(false);
Reflesh();
break;
case1:
//插