公司雇员管理系统

来源:互联网 发布:台湾海军知乎 编辑:程序博客网 时间:2024/04/29 11:14

呵呵,今晚是第一次来机房通宵,为了那个所谓的C++大作业——公司雇员管理系统 。。。。

哎,现在在写实验报告,好无聊。。。。主要时间有点紧,不然就算是一个小实验也应该规范软件开发的过程。就像以前写的那些实验一样,好好写下文档。。。。可是这次时间真的是来不及了,明天就要交了,之前一直在准备其它科目的考试。。。。

算了,不说了,是时间没有分配好。。。。

下面是这个雇员管理系统的源代码:

 

 
/*******************************************************************
 
   文件名: CBDay.h
   摘要: 日期类CBDay的申明文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
<string>
#include 
<iostream>
using namespace std;
 
#ifndef BDAY_H
#define BDAY_H
 
class CBDay
{
    
public:    
       
// 缺省的构造器
       CBDay(void);
       
// 设定雇员的生日      
       void SetBirthday(const string &bday);
       
// 返回雇员的生日
       string& GetStr(void);
 
    
private:
       
string birthday;       // 雇员生日,格式1986-08-25
};
 
#endif
 
/*******************************************************************
 
   文件名: CBDay.cpp
   摘要: 日期类CBDay的实现文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CBDay.h"
 
// 函数名:CBDay
// 功能:缺省的构造器,设置日期为1986-08-25
// 输入参数:void
// 输出参数:无
CBDay::CBDay(void)
{
       birthday 
= "1986-08-25";
 
       
return;
}
 
// 函数名:SetBirthday
// 功能:设定生日
// 输入参数:const std::string &bday:生日字串
// 输出参数:void
void CBDay::SetBirthday(const string &bday)
{
       birthday 
= bday;
 
       
return;
}
 
// 函数名:GetStr
// 功能:返回生日字串
// 输入参数:void
// 输出参数:string&:生日,格式为1986-08-25
string& CBDay::GetStr(void)
{
       
return birthday;
}
/*******************************************************************
 
   文件名: CEMIS.h
   摘要: 雇员信息管理系统类的声明
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-18    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CManager.h"
#include 
"CWage.h"
#include 
"CSales.h"
#include 
"CNameSexBDayException.h"
#include 
"CNumericalException.h"
#include 
<list>
#include 
<fstream>
#include 
<iostream>
 
#ifndef CEIMS_H
#define CEIMS_H
 
class CEIMS
{
       
public:
              
// 缺省的构造器
              CEIMS(void);
              
// 欢迎界面
              void WelcomeSplash(void);
              
// 主菜单
              void MainMenu(void);
              
// 从文件载入雇员信息
              void LoadFile(void);
              
// 从控制台输入雇员信息
              void LoadByConsole(void);
              
// 将雇员信息存入文件
              void SaveFile(void);
              
// 保存薪水报表文件
              void SaveSalaryFile(void);
              
// 显示雇员的概要信息到控制台
              void DisplayBasicInfo(void);
              
// 通过雇员编号或姓名查询雇员详细信息
              void FindByNumberName(void);
              
// 修改查询到雇员的相应信息
              void ModifyInfo(std::list<CEmployee*>::iterator i);
              
// 显示同一类别雇员的详细信息
              void DispalyRankDetails(void);
              
// 退出系统
              void ExitSystem(void);
 
       
private:
              
// 判断在链表里是否有雇员信息
              bool HaveEmp(void);
              
// 显示基本信息表的表头
              void PrintBasicInfoTableHead(void);
              
// 显示基本信息表的表身
              void PrintBasicInfoTableBody(void);
              
// 显示基本信息表的表尾
              void PrintBasicInfoTableTail(void);
              
// 显示Manager类别信息的表头
              void PrintManagerInfoTableHead(void);
              
// 显示Manager类别信息的表身
              void PrintManagerInfoTableBody(void);
              
// 显示Manager类别信息的表尾
              void PrintManagerInfoTableTail(void);
              
// 显示Wage类别信息的表头
              void PrintWageInfoTableHead(void);
              
// 显示Wage类别信息的表身
              void PrintWageInfoTableBody(void);
              
// 显示Wage类别信息的表尾
              void PrintWageInfoTableTail(void);
              
// 显示Sales类别信息的表头
              void PrintSalesInfoTableHead(void);
              
// 显示Sales类别信息的表身
              void PrintSalesInfoTableBody(void);
              
// 显示Sales类别信息的表尾
              void PrintSalesInfoTableTail(void);
             
              CNameSexBDayException nameSexBdayE;     
// 姓名、性别或生日异常对象
              CNumericalException numE;             // 数值型异常对象
              std::list<CEmployee*> _pEmpList;      // 雇员信息list(指针类型)
              unsigned int _unTotalEmp;             // 所有雇员数目
              unsigned int _unManager;              // Manager数目
              unsigned int _unWage;                   // Wage数目
              unsigned int _unSales;                    // Sales数目
              bool _bSaveFlag;                     // 标记是否保存了雇员信息
};
 
#endif
/*******************************************************************
 
   文件名: CEIMS.cpp
   摘要: 雇员信息管理系统类的初始用户界面实现
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-18    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
 
#include 
"CEIMS.h"
#include 
<windows.h>     // for Sleep()
#include <iomanip>
#include 
<iostream>
 
using namespace std;
 
// 函数名: CEIMS
// 功能:缺省的构造器
// 输入参数:void
// 输出参数:无
CEIMS::CEIMS(void)
{
       _unTotalEmp 
= 0;
       _unManager 
= 0;
       _unWage 
= 0;
       _unSales 
= 0;
       _bSaveFlag 
= true;            // 说明没有雇员信息需要保存
 
       
return;
}
 
// 函数名: WelcomeSplash
// 功能:欢迎闪屏
// 输入参数:void
// 输出参数:viod
void CEIMS::WelcomeSplash(void)
{
       cout 
<< "    欢迎使用" << endl;
       cout 
<< "公司雇员管理系统" << endl;
       cout 
<< "       版本 0.01" << endl;
       cout 
<< "所有版权已受保护" << endl;
       
//system("pause");
       cout << "        ";
       
// 表示一下载入状态 :-P
       for (int i = 0; i < 5; i++)
       {
              cout 
<< '.';
              Sleep(
500);
       }
      
       
return;
}
 
// 函数名:HaveEmp
// 功能:判断在链表里是否有雇员信息
// 输入参数:void
// 输出参数:bool:为true说明录入了雇员,否则为false
bool CEIMS::HaveEmp(void)
{
       
if (_pEmpList.empty())
       {
              
return false;
       }
       
else
       {
              
return true;
       }
}
 
// 函数名:MainMenu
// 功能:显示主菜单
// 输入参数:void
// 输出参数:void
void CEIMS::MainMenu(void)
{
       
int choose = 1;
 
       
do
       {
              system(
"cls");      // 清屏
 
              cout 
<< PromptInfo[inputInfoFromConsole] << endl
                   
<< PromptInfo[displayEmpBasicInfo] << endl
                   
<< PromptInfo[queryEmpInfoByNameOrNum] << endl
                   
<< PromptInfo[displayTheSameRankEmpInfo] << endl
                   
<< PromptInfo[saveEmpInfoInFile] << endl
                   
<< PromptInfo[loadEmpInfoFromFile] << endl
                   
<< PromptInfo[saveSalaryInFile] << endl
                   
<< PromptInfo[exitSys] << endl
                   
<< PromptInfo[pressChoose];
              cin 
>> choose;
 
              
switch (choose)
              {
                     
case 1:// 从控制台录入雇员信息
                     {
                            LoadByConsole();
                            
break;
                     }
                     
case 2:// 显示所有雇员的基本信息
                     {    
                            DisplayBasicInfo();
                            
break;
                     }
                     
case 3:// 通过姓名或编号查找雇员信息
                     {
                            FindByNumberName();
                            
break;
                     }
                     
case 4:// 显示同一类雇员的详细信息
                     {
                            DispalyRankDetails();
                            
break;
                     }
                     
case 5:// 保存雇员信息到文件
                     {
                            SaveFile();
                            
break;
                     }
                     
case 6:// 从文件载入雇员信息
                     {
                            LoadFile();
                            
break;
                     }
                     
case 7:// 保存雇员的薪水到文件
                     {
                            SaveSalaryFile();
                            
break;
                     }
                     
case 8:// 退出系统
                     {    
                            ExitSystem();
                            
break;
                     }
                     
default:
                     {
                            cout 
<< ExceptionInfo[SelectError];
                            
break;
                     }
              }
              fflush(stdin);       
// 清空输入缓冲
              cout << PromptInfo[pressEnterContinue];
              getchar();
       }
       
while (true);
      
       
return;
}
 
// 函数名:ExitSystem
// 功能:退出系统,如果有未保存的信息提示用户保存
// 输入参数:void
// 输出参数:void
void CEIMS::ExitSystem(void)
{
       
if (!_bSaveFlag && HaveEmp())
       {
// 没有保存雇员信息的话
              cout << "有雇员信息,要保存吗?(Y/n)";
              
char choose = 'n';
              cin 
>> choose;
              
if ('y' == choose)
              {
// 调用保存信息模块
                     SaveFile();
              }
       }
       cout 
<< "谢谢使用!";
       exit(
0);          // 结束程序运行
 
       
return;
}
/*******************************************************************
 
   文件名: CEmployee.cpp
   摘要: 类CEmployee的实现文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CEmployee.h"
#include 
<cstdlib>
 
// 函数名:CEmployee
// 功能:缺省构造器
// 输入参数:void
// 输出参数:无
CEmployee::CEmployee(void)      
{
       memset(_name, 
0sizeof(_name));
       memset(_sex, 
0sizeof(_sex));
       _rank 
= 0;
             
       
return;
}
 
// 函数名:CEmployee
// 功能:带参数的构造器
// 输入参数:const char *name:姓名
//          const std::strig &number:编号
//          const char *sex:性别
//          const std::string &bd:生日
// 输出参数:string:姓名
CEmployee::CEmployee(const char *name, const std::string &number, const char
*sex, const std::string &bd)
{
       strcpy_s(GetNamePointer(), MAX_NAME_LENG, name);
       GetNumber() 
= number;
       strcpy_s(GetSexPointer(), MAX_SEX_LENG, sex);
       GetBirthday().SetBirthday(bd);
      
       
return;
}
 
// 函数名:GetName
// 功能:返回雇员姓名
// 输入参数:void
// 输出参数:string:姓名
std::string CEmployee::GetName(void)
{
       
return std::string(_name); // 转换C风格的字符串到string类型
}
 
// 函数名:GetNamePointer
// 功能:返回雇员姓名地址
// 输入参数:void
// 输出参数:char*:姓名地址
char* CEmployee::GetNamePointer(void)
{
       
return _name;
}
 
// 函数名:GetNumber
// 功能:返回雇员编号
// 输入参数:void
// 输出参数:string&:编号
std::string& CEmployee::GetNumber(void)
{
       
return _number;
}
 
// 函数名:GetSex
// 功能:返回雇员性别
// 输入参数:void
// 输出参数:string:性别
std::string CEmployee::GetSex(void)
{
       
return std::string(_sex);     // 转换C风格的字符串到string类型     
}
 
// 函数名:GetSexPointer
// 功能:返回雇员性别地址
// 输入参数:void
// 输出参数:char*:性别地址
char *CEmployee::GetSexPointer(void)
{
       
return _sex;
}
 
// 函数名:GetRank
// 功能:返回雇员类别
// 输入参数:void
// 输出参数:int:类别
int CEmployee::GetRank(void)
{
       
return _rank;
}
 
// 函数名:GetBirthday
// 功能:返回雇员生日
// 输入参数:void
// 输出参数:CBDay&:生日对象
CBDay& CEmployee::GetBirthday(void)
{
       
return _birthday;
}
 
// 函数名:SetName
// 功能:根据参数设定雇员姓名
// 输入参数:const char *name:姓名
// 输出参数:void
void CEmployee::SetName(const char *name)
{
       strcpy_s(_name, name);
 
       
return;
}
 
// 函数名:SetNumber
// 功能:根据参数设定雇员编号
// 输入参数:const std::string &number:编号
// 输出参数:void
void CEmployee::SetNumber(const std::string &number)
{
       _number 
= number;
 
       
return;
}
 
// 函数名:SetSex
// 功能:根据参数设定雇员性别
// 输入参数:const char *sex:性别
// 输出参数:void
void CEmployee::SetSex(const char *sex)
{
       strcpy_s(_sex, sex);
 
       
return;
}
 
// 函数名:SetRank
// 功能:设定雇员类别
// 输入参数:int rank:类别
// 输出参数:void
void CEmployee::SetRank(int rank)
{
       _rank 
= rank;
 
       
return;
}
/*******************************************************************
 
   文件名: CEmployee.h
   摘要: 雇员类CEmployee的声明文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"ConstDef.h"
#include 
"CBDay.h"
#ifndef CEMPLOYEE_H
#define CEMPLOYEE_H
 
class CEmployee
{
       
public:
              
// 缺省的构造器
              CEmployee(void);
              
// 带参数的构造器
              CEmployee(const char *name,              // 姓名
                     const std::string &number,   // 编号
                      const char *sex,             // 性别
                      const std::string &bd); // 生日
              
// 返回姓名字串
              std::string GetName(void);
              
// 返回姓名存储地址
              char *GetNamePointer(void);
              
// 返回编号
              std::string& GetNumber(void);
              
// 返回性别字串
              std::string GetSex(void);
              
// 返回性别存储地址
              char *GetSexPointer(void);
              
// 返回生日对象
              CBDay& GetBirthday(void);
              
// 返回类别
              int GetRank(void);
              
// 设定姓名
              void SetName(const char *name);
              
// 设定编号
              void SetNumber(const std::string &number);
              
// 设定性别
              void SetSex(const char *sex);
              
// 设定类别
              void SetRank(int rank);
              
// 计算雇员薪水
              virtual float ComputePay(void= 0;
       
private:
              
char _name[MAX_NAME_LENG];            // 姓名
              std::string _number;                 // 编号
              char _sex[MAX_SEX_LENG];            // 性别:男或女
              CBDay _birthday;                   // 显示格式:1900-1-1
              int _rank;                           // 雇员类别
};
 
#endif
/*******************************************************************
 
   文件名: CException.cpp
   摘要: 异常类CException的实现文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-20    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CException.h"
 
// 函数名:PrintDbgInfo
// 功能:显示输入数据的错误信息
// 输入参数:enum Exceptioncode eCode:异常号
// 输出参数:void
void CException::PrintDbgInfo(const ExceptionCode &eCode)   const
{
       
for (int i = 0; i < MAX_NUMBER_EXCEPTION; i++)
       {
              
if (eCode == i)
              {
                     cerr 
<< ExceptionInfo[i] << endl;
                     
break;
              }
       }
 
       
return;
}
/*******************************************************************
 
   文件名: CException.h
   摘要: 异常类CException的声明文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-20    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"ConstDef.h"
#include 
<cstdlib>
#include 
<string>
#include 
<iostream>
using namespace std;
 
#ifndef CEXCEPTION_H
#define CEXCEPTION_H
 
class CException
{
       
public:
              
// 设置待检测的字串数据
              virtual void SetValidateStr(const enum ValidateType &valiType, const string &data) = 0;
              
// 根据待测数据返回异常信息
              virtual enum ExceptionCode RetExceptionInfo(const enum ValidateType &valiType)   const = 0;
              
// 根据异常号显示异常信息
              virtual void PrintDbgInfo(const enum ExceptionCode &eCode)   const;
};
 
#endif
/*******************************************************************
 
   文件名: CManager.h
   摘要: 类CEmployee的实现文件,该类型是CEmployee的子类
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CManager.h"
 
// 函数名:CManager
// 功能:缺省构造器
// 输入参数:void
// 输出参数:无
CManager::CManager(void)
{    
       SetRank(Manager);
       _salary 
= 0.0;
      
       
return;
}
 
// 函数名:CManager
// 功能:带参数的构造器
// 输入参数:const char *name: 姓名
//           const string &number:编号
//          const char *sex:性别
//          const string &bd:符合ISO日期格式的生日
//          const float &salary:月薪
// 输出参数:无
CManager::CManager(const char *name, const std::string &number,
                 
const char *sex, const std::string &bd, const float &salary)
        :CEmployee(name, number, sex, bd)
{
       SetSalary(salary);
       SetRank(Manager);
 
       
return;
}
 
// 函数名:SetSalary
// 功能:设定或修改月薪
// 输入参数:const float &salary:月薪
// 输出参数:void
void CManager::SetSalary(const float &salary)
{
       _salary 
= salary;
 
       
return;
}
 
// 函数名:SetSalary
// 功能:返回月薪
// 输入参数:void
// 输出参数:float:月薪值
float CManager::GetSalary(void)
{
       
return _salary;
}
 
// 函数名:ComputePay
// 功能:计算并返回雇员薪水
// 输入参数:void
// 输出参数:float:薪水值
float CManager::ComputePay(void)
{
       
return GetSalary();
}
/*******************************************************************
 
   文件名: CManager.h
   摘要: 雇员类CManager的声明文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CEmployee.h"
 
#ifndef CMANAGER_H
#define CMANAGER_H
 
class CManager : public CEmployee
{
       
public:
              
// 缺省的构造器
              CManager(void);
              
// 带参数的构造器
              CManager(const char *name,         // 姓名
                      const std::string &number,     // 编号
                      const char *sex,        // 性别
                      const std::string &bd,            // 生日
                      const float &salary);        // 月薪
              
// 设定月薪
              void SetSalary(const float &salary);
              
// 返回月薪
              float GetSalary(void);
              
// 计算薪水,CManager的薪水=月薪
              virtual float ComputePay(void);
       
private:
              
float _salary;       // 月薪
};
 
#endif
/*******************************************************************
 
   文件名: CNameSexBDayException.cpp
   摘要: 异常类CNameSexBDayException的实现文件
  开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-20    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CNameSexBDayException.h"
 
// 函数名:SetValidateStr
// 功能:设置待检测的字串数据
// 输入参数:const enum ValidateType &valiType:待检测的类型
//          const string &name:检测姓名或性别字串数据
// 输出参数:void
void CNameSexBDayException::SetValidateStr(const enum ValidateType &valiType, const string &nameSexBday)
{
       
switch (valiType)
       {
              
case Name:// 对姓名的处理
              {
                     _name 
= nameSexBday;
                     _nameLeng 
= nameSexBday.length();
                     
break;
              }
              
case Sex:// 对性别的处理
              {
                     _sex 
= nameSexBday;
                     _sexLeng 
= nameSexBday.length();     
                     
break;
              }
              
case Birthday:// 对生日的处理
              {
                     _birthday 
= nameSexBday;
                     _bdayLeng 
= nameSexBday.length();
                     
break;
              }
              
default:
              {
                     cerr 
<< "无此异常编号,请检查!" << endl;
                     
break;
              }
       }
      
       
return;
}
 
// 函数名:RetExceptionInfo
// 功能:返回异常号,显示异信息到控制台
// 输入参数:const enum ValidateType &valiType:待检测的类型
// 输出参数:enum ExceptionCode:异常号
enum ExceptionCode CNameSexBDayException::RetExceptionInfo(const enum ValidateType &valiType)const
{
       
switch (valiType)
       {
              
case Name:// 对姓名的处理
              {
                     
if (_nameLeng < MIN_NAME_LENG)
                     {
                            PrintDbgInfo(NameLengthTooShort);
                            
return NameLengthTooShort;
                     }
                     
else if (_nameLeng > MAX_NAME_LENG)
                     {
                            PrintDbgInfo(NameLengthTooLong); 
                            
return NameLengthTooLong;
                     }
                     
break;
              }
              
case Sex:// 对性别的处理
              {
                     
if ((_sexLeng != MIN_SEX_LENG)
                          
|| (("1" != _sex) && ("2" != _sex)))
                     {
                            PrintDbgInfo(SexException);
                            
return SexException;
                     }
                     
break;
              }
              
case Birthday:// 对生日的处理
              {
                     
if (_bdayLeng != MAX_BDAY_LENG - 1)
                     {
                            PrintDbgInfo(BirthdayException);
                            
return BirthdayException;
                     }
                     
string year(_birthday.substr(04)); // 取年
                     string month(_birthday.substr(52));     // 取月
                     string day(_birthday.substr(82)); // 取日
                     
// 处理年份
                    
                     
if (atoi(year.c_str()) > BDAY_YEAR_MAX)
                     {
                            PrintDbgInfo(BirthdayTooLarge);
                            
return BirthdayTooLarge;
                     }
                     
else if (atoi(year.c_str()) < BDAY_YEAR_MIN)
                     {
                            PrintDbgInfo(BirthdayTooSmall);
                            
return BirthdayTooSmall;
                     }
                     
// 处理月份
                     if (atoi(month.c_str()) < 1)
                     {
                            PrintDbgInfo(MonthTooSmall);
                            
return MonthTooSmall;
                     }
                     
else if (atoi(month.c_str()) > 12)
                     {
                            PrintDbgInfo(MonthTooLarge);
                            
return MonthTooLarge;
                     }
                     
// 处理日
                     if (atoi(day.c_str()) < 1)
                     {
                            PrintDbgInfo(DayTooSmall);
                            
return DayTooSmall;
                     }
                     
else if (atoi(day.c_str()) > 31)
                     {
                            PrintDbgInfo(DayTooLarge);
                            
return DayTooLarge;
                     }
                     
// 对年、月、日总体的匹配处理
                    
                     
if ((atoi(year.c_str()) % 100 != 0)
                         
&& (atoi(year.c_str()) % 4 == 0)
                         
|| (atoi(year.c_str()) % 100 == 0)
                         
&& (atoi(year.c_str()) % 400 == 0))
                     {
// 是闰年
                            if ((atoi(month.c_str()) == 2)
                               
&& (atoi(day.c_str()) > 29))
                            {
// 2月大于29天
                                   PrintDbgInfo(FebMoreThan28);
                                   
return FebMoreThan28;
                            }
                     }
                     
else
                     {
// 不是闰年
                            if ((atoi(month.c_str()) == 2)
                                    
&& (atoi(day.c_str()) > 28))
                            {
// 2月大于28天
                                   PrintDbgInfo(FebMoreThan29);
                                   
return FebMoreThan29;
                            }
                     }     
                     
if ((atoi(month.c_str()) == 4)
                        
|| (atoi(month.c_str()) == 6)
                         
|| (atoi(month.c_str()) == 9)
                         
|| (atoi(month.c_str()) == 11))
                     {
                            
if (atoi(day.c_str()) >= 31)
                            {
// 这个月份不可能大于31天
                                   PrintDbgInfo(DayTooLarge);
                                   
return DayTooLarge;
                            }  
                     }    
                  
break;
              }
       }
       
return NoException;
}
/*******************************************************************
 
   文件名: CNameSexBDayException.h
   摘要: 异常类CNameSexBDayException的声明文件,该类用于检测输入姓名、
         性别和生日数据
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-20    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CException.h"
 
#ifndef CNAMESEXBD_EXCEPTION_H
#define CNAMESEXBD_EXCEPTION_H
 
class CNameSexBDayException : public CException
{
       
public:
              
// 设置待检测的字串数据
              virtual void SetValidateStr(const enum ValidateType &valiType, const string &nameSexBday);
              
// 返回异常信息
              virtual enum ExceptionCode RetExceptionInfo(const enum ValidateType &valiType)   const;
 
       
private:
              std::
string _name;       // 姓名
              std::string _sex;   // 性别
              std::string _birthday; // 生日
              size_t _sexLeng; // 性别字串长度
              size_t _nameLeng;     // 姓名字串长度
              size_t _bdayLeng;      // 生日字串长度
};
 
#endif
/*******************************************************************
 
   文件名: CNumericalException.cpp
   摘要: 异常类CNumericalException的实现文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-20    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CNumericalException.h"
 
// 函数名:SetValidateStr
// 功能:设置待检测的字串数据
// 输入参数:const enum ValidateType &valiType:待检测的类型
//          const string &number:检测数值字串
// 输出参数:void
void CNumericalException::SetValidateStr(const enum ValidateType &valiType, const string &number)
{
       
// 转换数值,从非数字字符开始自动截断
       _numericalVal = (float)atof(number.c_str());     
 
       
return;
}
 
// 函数名:RetExceptionInfo
// 功能:返回异常号,显示异信息到控制台
// 输入参数:const enum ValidateType &valiType:待检测的类型
// 输出参数:enum ExceptionCode:异常号
enum ExceptionCode CNumericalException::RetExceptionInfo(const enum ValidateType &valiType)const
{
       
switch (valiType)
       {
              
case Number:// 对编号的处理
              {
                     
if (_numericalVal < NUMBER_MIN)
                     {
                            PrintDbgInfo(NumberTooSmall);
                            
return NumberTooSmall;
                     }
                     
else if (_numericalVal > NUMBER_MAX)
                     {
                            PrintDbgInfo(NumberTooLarge);
                            
return NumberTooLarge;
                     }    
                     
break;
              }
              
case Salary:// 对月薪的处理
              {
                     
if (_numericalVal < SALARY_MIN)
                     {
                            PrintDbgInfo(SalaryTooSmall);
                            
return SalaryTooSmall;
                     }
                     
else if (_numericalVal > SALARY_MAX)
                     {
                            PrintDbgInfo(SalaryTooLarge);
                            
return SalaryTooLarge;
                     }
                     
break;
              }
              
case WagE:// 对时薪的处理
              {
                     
if (_numericalVal < WAGE_MIN)
                     {
                            PrintDbgInfo(WageTooSmall);
                            
return WageTooSmall;
                     }
                     
else if (_numericalVal > WAGE_MAX)
                     {
                            PrintDbgInfo(WageTooLarge);
                            
return WageTooLarge;
                     }
                     
break;
              }
              
case Hours:// 对工作时间的处理
              {
                     
if (_numericalVal < HOURS_MIN)
                     {
                            PrintDbgInfo(HoursTooSmall);
                            
return HoursTooSmall;
                     }
                     
else if (_numericalVal > HOURS_MAX)
                     {
                            PrintDbgInfo(HoursTooLarge);
                            
return HoursTooLarge;
                     }
                     
break;
              }
              
case Comm:// 对提成的处理
              {
                     
if (_numericalVal < COMM_MIN)
                     {
                            PrintDbgInfo(CommTooSmall);
                            
return CommTooSmall;
                     }
                     
else if (_numericalVal > COMM_MAX)
                     {
                            PrintDbgInfo(CommTooLarge);
                            
return CommTooLarge;
                     }
                     
break;
              }
              
case Sale:// 对销售量的处理
              {
                     
if (_numericalVal < SALE_MIN)
                     {
                            PrintDbgInfo(SaleTooSmall);
                            
return SaleTooSmall;
                     }
                     
else if (_numericalVal > SALE_MAX)
                     {
                            PrintDbgInfo(SaleTooLarge);
                            
return SaleTooLarge;
                     }
                     
break;
              }
       }
       
return NoException;
}
/*******************************************************************
 
   文件名: CNumericalException.h
   摘要: 异常类CNumericalExeption的声明文件,该类用于检测输入数值数据
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-20    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CException.h"
#ifndef CNUM_EXCEPTION_H
#define CNUM_EXCEPTION_H
 
class CNumericalException : public CException
{
       
public:
              
// 设置待检测的字串数据
              virtual void SetValidateStr(const enum ValidateType &valiType, const string &numericalVal);
              
// 返回异常信息
              virtual enum ExceptionCode RetExceptionInfo(const enum ValidateType &valiType)   const;
 
       
private:
              
float _numericalVal;         // 数值
};
 
#endif
/*******************************************************************
 
   文件名: ConstDef.h
   摘要: 在本系统中使用的常量定义文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
<string>
 
#ifndef CONST_DEF_H
#define CONST_DEF_H
 
// 下面的常量是字串长度的限制
const size_t MAX_NAME_LENG              = 9// 姓名的最大长度
const size_t MIN_NAME_LENG        = 5// 姓名的最小长度
const size_t MAX_SEX_LENG           = 2// 性别的最大长度
const size_t MIN_SEX_LENG             = 1// 性别的最小长度
const size_t MAX_BDAY_LENG              = 11;      // 生日的最大长度
const size_t MAX_SALARY_LENG         = 8// 月薪的最大长度
const size_t MIN_SALARY_LENG           = 6// 月薪的最小长度
const size_t MAX_WAGE_LENG              = 6// 时薪的最大长度
const size_t MIN_WAGE_LENG        = 4// 时薪的最小长度
const size_t MAX_HOURS_LENG            = 3// 工作时间的最大长度
const size_t MIN_HOURS_LENG             = 3// 工作时间的最小长度
const size_t MAX_COMM_LENG             = 5// 提成的最大长度
const size_t MIN_COMM_LENG        = 4// 提成的最小长度
const size_t MAX_SALE_LENG         = 8// 销售量的最大长度
const size_t MIN_SALE_LENG          = 7// 销售量的最小长度
 
// 下面的常量是对其值的限制
const int NUMBER_MAX            = 50000;       // 编号的最大值
const int NUMBER_MIN              = 10000;       // 编号的最小值
const int BDAY_YEAR_MAX            = 1987;         // 生日最大年
const int BDAY_YEAR_MIN             = 1970;         // 生日最小年
const double SALARY_MAX              = 50000.0;    // 月薪的最大值
const double SALARY_MIN        = 1000.0;      // 月薪的最小值
const double WAGE_MAX           = 1000.0;      // 时薪的最大值
const double WAGE_MIN            = 50.0;          // 时薪的最小值
const double HOURS_MAX         = 8.0;            // 工作时间的最大值
const double HOURS_MIN           = 1.0;            // 工作时间的最小值
const double COMM_MAX          = 0.5;            // 提成的最大值
const double COMM_MIN            = 0.1;            // 提成的最小值
const double SALE_MAX             = 1000;         // 销售量的最大值
const double SALE_MIN              = 50;             // 销售量的最小值
 
// 输入缓冲定义
const int A_LINE_INFO_BUF     = 1024;         // 从文件里读一行的信息字节数
const int MAX_NUMBER_IN_PROMPT = 255;           // 最多可以显示的提示信息
const int MAX_NUMBER_EXCEPTION = 255;           // 可以处理的最多异常数
 
// 对系统里用到的提示信息进行编号
const enum PromptInfoCode
{
       inputNamePrompt, inputNumberPrompt, inputSexPrompt,
       inputSalaryPrompt, inputBdayPrompt, inputWagePrompt,
       inputHoursPrompt, inputCommPrompt, inputSalePrompt,
       selectEmpKind, employeeKindsList,
       inputFilePath, inputInfoFromConsole, displayEmpBasicInfo,
       queryEmpInfoByNameOrNum, displayTheSameRankEmpInfo,
       saveEmpInfoInFile, loadEmpInfoFromFile, saveSalaryInFile,
       askQueryMethod, selectQueryMethod, pressEnterContinue, pressChoose,
       ManagerRank, WageRank, SalesRank, totalManager, totalWage, totalSales, count,
       totalEmp, selectEmpDispalyKind, jobRank, empSalary, empName,
       selectSortMethod, whetherModifyRank,
       selectModifyAttribute, empName1, empNum2, empBd3, empGender4, noModifyPressOther,
       selectModifyManager, empSal, selectModifyWage, empWage1,
       empHours1, empComm3, empSale4, selectModefySales, exitSys,
       queryEmpName, queryEmpNum, wetherUpdateEmoInfo,
};
 
// 提示信息
const std::string PromptInfo[MAX_NUMBER_IN_PROMPT] =
{
       
"请输入雇员姓名:""请输入雇员编号:""请输入雇员性别(1.男 2.女):",
       
"请输入月薪:""请输入雇员生日(e.g. 1986-08-25):""请输入时薪:",
       
"请输入工作时间:""请输入提成:""请输入销售量",
       
"请选择要输入的雇员种类:""1. Manager 2.Wager 3.Saler 4.退出",
       
"请输入文件路径及文件名:""1. 从控制台输入雇员信息""2. 显示所有雇员都具有的信息",
       
"3. 按编号或姓名查询雇员""4. 显示同一类别雇员的详细信息",
       
"5. 保存雇员信息至文件""6. 从文件载入雇员信息""7. 保存薪水报表至文件",
       
"以什么方式查询?""1. 编号   2. 姓名 3. 退出   请选择:""按回车键继续....""请选择:",
       
"Manager""Wage""Sales""共有Manager ""共有Wage ""共有Saler "" 名",
       
"共有雇员""请选择需要显示的雇员类别:""类别:""薪水:""姓名:",
       
"请选择排序方式: 1. 薪水降序     2. 姓名排序    3. 类别排序""要修改这个雇员的类别吗?(Y/n)",
       
"请选择要修改的属性:""1. 姓名""2. 编号""3. 生日""4. 性别""其它键入不修改",
       
"请选择Manager要修改的属性:""1. 月薪""请选择Wage要修改的属性:""1. 时薪",
       
"2. 工作时间""3. 提成""4. 销售量""请选择Saler要修改的属性:""8. 退出本系统",
       
"请输入需要查询雇员的名字:""请输入需要查询雇员的编号:""是否需要重新设定该雇员的信息?(Y/n)",
 
};
 
// 职位,即雇员类别
const enum JobRank
{
       Manager 
= 1, Wage, Sales
};
 
 
// 职位字串
const std::string Rank[3=
{
       
"Manager""Wage""Saler"
};
 
// 性别
const std::string Gender[2=
{
       
""""
};
 
 
// 下面是对异常处理时使用的常量数据进行定义
// 需要检测异常的类型
const enum ValidateType
{
       Name, Number, Sex, Salary, Birthday, WagE, Hours,
       Comm, Sale
};
 
// 异常号
const enum ExceptionCode
{
       NoException, NameLengthTooShort, NameLengthTooLong,
       NumberTooSmall, NumberTooLarge, SalaryTooSmall,   
       SalaryTooLarge, SexException, BirthdayException,
       BirthdayTooLarge, BirthdayTooSmall, FebMoreThan28,
       FebMoreThan29, MonthTooSmall, MonthTooLarge,
       DayTooSmall, DayTooLarge, WageTooSmall, WageTooLarge,
       HoursTooSmall, HoursTooLarge, CommTooSmall,
       CommTooLarge, SaleTooSmall, SaleTooLarge,
       OpenFileFailure, LoadFileDataErr, SelectError, NoEmpInfo,
       NoThisRank, SaveFileFailure, UndefSortMethod
};
 
// 异常提示语句
const std::string ExceptionInfo[MAX_NUMBER_EXCEPTION] =
{
       
"无异常发生。。。。""输入的姓名长度过小!""输入的姓名长度过大!",
       
"输入的编号过小!""输入的编号过大!""输入的月薪过小!",
       
"输入的月薪过大!""输入性别有误!""输入生日输入有误!",
       
"输入生日日期过大!""输入生日日期过小!""二月份大于28天!",
       
"二月份大于29天!""输入月份小于1!""输入月份大于12!",
       
"输入天数小于1!""输入天数大于31!""输入的时薪过小!""输入的时薪过大!",
       
"输入的工作时间过小!""输入的工作时间过大!""输入的提成值过小!",
       
"输入的提成值过大!""输入的销售量过小!""输入的销售量过大!",
       
"打开文件失败!""读入数据有误!""选择错误!""没有雇员信息,请录入!"
       
"不存在该类别的雇员!""保存文件失败!""排序标准未定义!"
};
 
#endif
/*******************************************************************
 
   文件名: CSales.h
   摘要: 类CSales实现文件,该类型是CSales的子类
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CSales.h"
#include 
<iostream>
 
using namespace std;
 
// 函数名:CSales
// 功能:缺省的构造器
// 输入参数:void
// 输出参数:无
CSales::CSales(void)
{
       SetRank(Sales);
       _comm 
= 0.0;
       _sale 
= 0.0;
      
       
return;
}
 
// 函数名:CSales
// 功能:带参数的构造器
// 输入参数:const char *name: 姓名
//           const string &number:编号
//          const char *sex:性别
//          const string &bd:符合ISO日期格式的生日
//          const float &wage:时薪
//          const float &hours:工作时间
//          const float &comm:提成
//          const float &sale:销售量
// 输出参数:无
CSales::CSales(const char *name, const std::string &number,
              
const char *sex, const std::string &bd,
              
const float &wage, const float &hours,
              
const float &comm, const float &sale)
       :CWage(name, number, sex, bd, wage, hours)
{
       SetCommission(comm);
       SetSales(sale);
       SetRank(Sales);
 
       
return;
}
 
// 函数名:SetCommission
// 功能:设定提成
// 输入参数:const float &comm:提成
// 输出参数:void
void CSales::SetCommission(const float &comm)
{
       _comm 
= comm;
      
       
return;
}
 
// 函数名:SetSales
// 功能:设定销售量
// 输入参数:const float &sale:销售量
// 输出参数:void
void CSales::SetSales(const float &sale)
{
       _sale 
= sale;
      
       
return;
}
 
// 函数名:GetCommission
// 功能:返回提成
// 输入参数:void
// 输出参数:float:提成值
float CSales::GetCommission(void)
{
       
return _comm;
}
 
// 函数名:GetSales
// 功能:返回销售数量
// 输入参数:void
// 输出参数:float:销售量值
float CSales::GetSales(void)
{
       
return _sale;
}
 
// 函数名:ComputePay
// 功能:计算薪水,薪水=工作时间×时薪+每件提成×销售数量
// 输入参数:void
// 输出参数:float:销售量值
float CSales::ComputePay(void)
{
       
return GetHours() * GetWage() + _comm * _sale;
}
/*******************************************************************
 
   文件名: CSales.h
   摘要: 类CSales声明文件,该类型是CWage的子类
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CWage.h"
 
#ifndef CSALES_H
#define CSALES_H
 
class CSales : public CWage
{
       
public:
              
// 缺省的构造器
              CSales(void);
              
// 带参数的构造器
              CSales(const char *name,        // 姓名
                     const std::string &number,       // 编号
                     const char *sex,                 // 性别
                     const std::string &bd,              // 生日
                     const float &wage,            // 时薪
                     const float &hours,           // 工作时间
                     const float &comm,          // 提成
                     const float &sale);             // 销售量
              
// 设定提成
              void SetCommission(const float &comm);
              
// 设定销售数量
              void SetSales(const float &sale);
              
// 返回提成
              float GetCommission(void);
              
// 返回销售数量
              float GetSales(void);
              
// 计算薪水,薪水=工作时间×时薪+每件提成×销售数量
              virtual float ComputePay(void);
       
private:
              
float _comm;              // 每件提成
              float _sale;           // 销售数量
};
 
#endif
/*******************************************************************
 
   文件名: CWage.cpp
   摘要: 类CWage的实现文件
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CWage.h"
#include 
<iostream>
 
using namespace std;
 
// 函数名:CWage
// 功能:缺省的构造器
// 输入参数:void
// 输出参数:无
CWage::CWage(void)
{
       SetRank(Wage);
       _wage 
= 0.0;
       _hours 
= 0.0;
      
       
return;
}
 
 
// 函数名:CWage
// 功能:带参数的构造器
// 输入参数:const char *name: 姓名
//           const string &number:编号
//          const char *sex:性别
//          const CBDay &bd:符合ISO日期格式的生日
//          const float &wage:时薪
//          const float &hours:工作时间
// 输出参数:无
CWage::CWage(const char *name, const std::string &number,
            
const char *sex, const std::string &bd,
            
const float &wage, const float &hours)
       :CEmployee(name, number, sex, bd)
{
       _wage 
= wage;
       _hours 
= hours;
       SetRank(Wage);
 
       
return;
}
 
// 函数名:SetWage
// 功能:设定时薪值
// 输入参数:const float &wage:时薪
// 输出参数:void
void CWage::SetWage(const float &wage)
{
       _wage 
= wage;
 
       
return;
}
 
// 函数名:SetHours
// 功能:设定工作时间
// 输入参数:cosnt float &hours:工作时间
// 输出参数:void
void CWage::SetHours(const float &hours)
{
       _hours 
= hours;
      
       
return;
}
 
// 函数名:GetWage
// 功能:返回时薪值
// 输入参数:void
// 输出参数:float:时薪值
float CWage::GetWage(void)
{
       
return _wage;
}
 
// 函数名:GetHours
// 功能:返回工作时间
// 输入参数:void
// 输出参数:float:工作时间值
float CWage::GetHours(void)
{
       
return _hours;
}
 
// 函数名:ComputePay
// 功能:计算薪水,Cwage的薪水=工作时间×时薪
// 输入参数:void
// 输出参数:float:薪水
float CWage::ComputePay(void)
{
       
return _hours * _wage;
}
 
/*******************************************************************
 
   文件名: CSales.h
   摘要: 类CSales声明文件,该类型是CEmployee的子类
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
  E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CEmployee.h"
 
#ifndef CWAGE_H
#define CWAGE_H
 
class CWage : public CEmployee
{
       
public:
              
// 缺省的构造器
              CWage(void);
              
// 带参数的构造器
              CWage(const char *name,                     // 姓名
                    const std::string &number, // 编号
                    const char *sex,                   // 性别
                    const std::string &bd,         // 生日
                    const float &wage,              // 时薪
                    const float &hours);            // 工作时间
              
// 设定时薪值
              void SetWage(const float &wage);
              
// 设定工作时间
              void SetHours(const float &hours);
              
// 返回时薪值
              float GetWage(void);
              
// 返回工作时间
              float GetHours(void);
              
// 计算薪水,Cwage的薪水=工作时间×时薪
              virtual float ComputePay(void);
       
private:
              
float _wage;        // 时薪
              float _hours;        // 工作时间
};
 
#endif
/*******************************************************************
 
   文件名: EIMSInput.cpp
   摘要: 雇员信息管理系统数据录入模块的实现
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-18    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CEIMS.h"
 
using namespace std;
 
// 函数名:LoadFile
// 功能:从文件载入雇员信息并存入list
// 输入参数:void
// 输出参数:viod
void CEIMS::LoadFile(void)
{
       
string filePath;
       cout 
<< PromptInfo[inputFilePath];
       cin 
>> filePath;
 
       ifstream inputFile(
"employee.data");
 
        
if (!inputFile)
        {
                cerr 
<< ExceptionInfo[OpenFileFailure] << endl;
 
                
return;
        }
 
       
char aLineInfo[A_LINE_INFO_BUF];       // 从文件里读取一行的信息
       string rank;
       
char name[MAX_NAME_LENG];
       
char number[NUMBER_MAX];
       
char sex[MAX_SEX_LENG];
       
char birthday[MAX_BDAY_LENG];
       
char salary[MAX_SALARY_LENG];
       
char wage[MAX_WAGE_LENG];
       
char hours[MAX_HOURS_LENG];
       
char comm[MAX_COMM_LENG];
       
char sale[MAX_SALE_LENG];
       
// 开始读取信息
        while (inputFile.getline(aLineInfo, ' '))
       {
              
// 初始化内存片
              memset(name, 0sizeof(name));
              memset(sex, 
0sizeof(sex));
              memset(number, 
0sizeof(number));
              memset(birthday, 
0sizeof(birthday));
              memset(salary, 
0sizeof(salary));
              memset(wage, 
0sizeof(wage));
              memset(hours, 
0sizeof(hours));
              memset(comm, 
0sizeof(comm));
              memset(sale, 
0sizeof(sale));
              CEmployee 
*pe = NULL;
              rank 
= aLineInfo;
      
              
if (rank.substr(0, PromptInfo[jobRank].length())
                  
== PromptInfo[jobRank])
              {
// 找到了以“类别”开关的行 
                     inputFile.getline(name, ' ');
                     inputFile.getline(number, 
' ');
                     inputFile.getline(sex, 
' ');
                     inputFile.getline(birthday, 
' ');
                     rank 
= rank.substr(PromptInfo[jobRank].length());
 
                     
switch (atoi(rank.c_str()))
                     {
                            
case Manager:
                            {
                                   inputFile.getline(salary, 
' ');
                                   pe 
= new CManager(name, string(number),
                                                  sex,
                                                    
string(birthday),
                                                  (
float)atof(salary));
                                   _pEmpList.push_back(pe);
                                   _unManager
++;
                                   
break;
                            }
                            
case Wage:
                            {
                                   inputFile.getline(wage, 
' ');
                                   inputFile.getline(hours, 
' ');
                                   pe 
= new CWage(name, string(number),
                                                 sex,
                                                 
string(birthday),
                                                 (
float)atof(wage),
                                                 (
float)atof(hours));
                                   _pEmpList.push_back(pe);
                                   _unWage
++;
                                   
break;
                            }
                            
case Sales:
                            {
                                   inputFile.getline(wage, 
' ');
                                   inputFile.getline(hours, 
' ');
                                   inputFile.getline(comm, 
' ');
                                   inputFile.getline(sale, 
' ');
                                   pe 
= new CSales(name, string(number),
                                                 sex,
                                                  
string(birthday),
                                                 (
float)atof(wage),
                                                 (
float)atof(hours),
                                                 (
float)atof(comm),
                                                 (
float)atof(sale));
                                   _pEmpList.push_back(pe);
                                   _unSales
++;
                                   
break;
                            }
                            
default:
                            {
                                   cout 
<< ExceptionInfo[LoadFileDataErr];  
                                   
break;
                            }
                     } 
              }
       }
       
// 计算雇员总数
       _unTotalEmp = _unSales + _unWage + _unManager;
       
// 设置保存标记
       _bSaveFlag = false;           // 说明有未保存的雇员信息
 
       
return;
}
 
// 函数名:LoadByConsole
// 功能:从控制台输入雇员信息并存入list
// 输入参数:void
// 输出参数:viod
void CEIMS::LoadByConsole(void)
{
       
// 保存输入的临时信息
       string name;         // 姓名
       string number;            // 编号
       string sex;            // 性别
       string bday;         // 生日
       string salary;        // 薪水
       string wage;         // 时薪
       string hours;        // 工作时间
       string comm;              // 提成
       string sale;           // 销售量
       do
       {    
              system(
"cls");      // 清屏
              name.clear();
              number.clear();
              sex.clear();
              bday.clear();
              salary.clear();
              hours.clear();
              comm.clear();
              sale.clear();
              CEmployee 
*pe = NULL;              // 雇员类型的最高层指针
              int choose = 1;
 
              cout 
<< PromptInfo[selectEmpKind] << endl;
              cout 
<< PromptInfo[employeeKindsList] << endl;  
              cin 
>> choose;
              
if (4 == choose)
              {
                     
// 退出的时候计算总的雇员数
                     _unTotalEmp = _unManager + _unWage + _unSales;
                     
// 设置保存标记
                     _bSaveFlag = false;           // 说明有未保存的雇员信息
 
                     
return;
              }
              fflush(stdin);
              
// 姓名录入
              do
              {
                     cout 
<< PromptInfo[inputNamePrompt];
                     cin 
>> name;
                     nameSexBdayE.SetValidateStr(Name, name);
              }
              
while (nameSexBdayE.RetExceptionInfo(Name));
              fflush(stdin);
              
// 编号录入
              do
              {
                     cout 
<< PromptInfo[inputNumberPrompt];
                     cin 
>> number;
                     numE.SetValidateStr(Number, number);
              }
              
while (numE.RetExceptionInfo(Number));
              fflush(stdin);
              
// 性别录入
              do
              {
                     cout 
<< PromptInfo[inputSexPrompt];
                     cin 
>> sex;
                     nameSexBdayE.SetValidateStr(Sex, sex);
              }
              
while (nameSexBdayE.RetExceptionInfo(Sex));
              fflush(stdin);
              
// 生日录入
              do
              {
                     cout 
<< PromptInfo[inputBdayPrompt];
                     cin 
>> bday;
                     nameSexBdayE.SetValidateStr(Birthday, bday);
              }
              
while (nameSexBdayE.RetExceptionInfo(Birthday));
             
              
switch (choose)
              {
                     
case Manager:
                     {
                            
// 月薪录入
                            do
                            {
                                   cout 
<< PromptInfo[inputSalaryPrompt];
                                   cin 
>> salary;
                                   numE.SetValidateStr(Salary, salary);
                            }
                            
while (numE.RetExceptionInfo(Salary));
                            pe 
= new CManager(name.c_str(), number.c_str(),
                                             sex.c_str(), bday,
                                           (
float)atof(salary.c_str()));
                            _pEmpList.push_back(pe);
                                _unManager
++;
                            
break;
                     }
                     
case Wage:
                     {
                            
// 时薪录入
                            do
                            {
                                   cout 
<< PromptInfo[inputWagePrompt];    
      
                                   cin 
>> wage;
                                   numE.SetValidateStr(WagE, wage);
                            }
                            
while (numE.RetExceptionInfo(WagE));
                            
// 工作时间录入
                            do
                            {
                                   cout 
<< PromptInfo[inputHoursPrompt];    
                                   cin 
>> hours;
                                   numE.SetValidateStr(Hours, hours);
                            }
                            
while (numE.RetExceptionInfo(Hours));
                           
                            pe 
= new CWage(name.c_str(), number.c_str(),
                                           sex.c_str(), bday,
                                          (
float)atof(wage.c_str()),
                                          (
float)atof(hours.c_str()));
                            _pEmpList.push_back(pe);
                            _unWage
++;      
                            
break;
                     }
                     
case Sales:
                     {
                            
// 时薪录入
                            do
                            {
                                   cout 
<< PromptInfo[inputWagePrompt];    
      
                                   cin 
>> wage;
                                   numE.SetValidateStr(WagE, wage);
                            }
                            
while (numE.RetExceptionInfo(WagE));
                            
// 工作时间录入
                            do
                            {
                                   cout 
<< PromptInfo[inputHoursPrompt];    
                                   cin 
>> hours;
                                   numE.SetValidateStr(Hours, hours);
                            }
                            
while (numE.RetExceptionInfo(Hours));
                            
// 提成录入
                            do
                            {
                                   cout 
<< PromptInfo[inputCommPrompt];   
      
                                   cin 
>> comm;
                                   numE.SetValidateStr(Comm, comm);
                            }
                            
while (numE.RetExceptionInfo(Comm));
                            
// 销售量录入
                            do
                            {
                                   cout 
<< PromptInfo[inputSalePrompt];
      
                                   cin 
>> sale;
                                   numE.SetValidateStr(Sale, sale);
                            }
                            
while (numE.RetExceptionInfo(Sale));
                           
                            pe 
= new CSales(name.c_str(), number.c_str(),
                                           sex.c_str(), bday,
(
float)atof(wage.c_str()),
                                           (
float)atof(hours.c_str()),
(
float)atof(comm.c_str()),
                                          (
float)atof(sale.c_str()));
                               _pEmpList.push_back(pe);
                                _unSales
++;
                            
break;
                     }
                     
default:
                     {
                            cerr 
<< ExceptionInfo[SelectError];     
                            
break;
                     }
 
              } 
       }
       
while (true);
      
       
return;
}
/*******************************************************************
 
   文件名: EIMSModify.cpp
   摘要: 雇员信息管理系统数据修改模块的实现
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-20    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CEIMS.h"
#include 
<iostream>
 
using namespace std;
 
// 函数名:ModifyInfo
// 功能:修改查询到雇员的相应信息
// 输入参数:std::list<CEmployee*>::iterator i:指向查询到的雇员
// 输出参数:viod
void CEIMS::ModifyInfo(std::list<CEmployee*>::iterator i)
{
       cout 
<< PromptInfo[whetherModifyRank];
       
char modifyRank = 'n';
       cin 
>> modifyRank;
       
if ('y' == tolower(modifyRank))
       {
              _pEmpList.erase(i);    
// 先删除雇员的信息
              LoadByConsole();     // 重新录入信息
       }
       
else// 不修改类别
       {
              cout 
<< PromptInfo[selectModifyAttribute] << endl
                   
<< PromptInfo[empName1] << endl
                   
<< PromptInfo[empNum2] << endl
                   
<< PromptInfo[empBd3] << endl
                   
<< PromptInfo[empGender4] << endl
                   
<< PromptInfo[noModifyPressOther] << endl;
              
int choose;
              cin 
>> choose;
              
// 修改基本信息
              switch (choose)
              {
                     
case 1:// 修改姓名
                     {
                            
char name[30];
                            fflush(stdin);
                            
do
                            {
                                   cout 
<< PromptInfo[inputNamePrompt];
                                   cin 
>> name;
                                   nameSexBdayE.SetValidateStr(Name, name);
                            }
                            
while (nameSexBdayE.RetExceptionInfo(Name));
                            (
*i)->SetName(name);
                            
break;
                     }
                     
case 2:// 修改编号
                     {
                            
string number;
                            fflush(stdin);
                            
do
                            {
                                   cout 
<< PromptInfo[inputNumberPrompt];
                                   cin 
>> number;
                                   numE.SetValidateStr(Number, number);
                            }
                            
while (numE.RetExceptionInfo(Number));
                            (
*i)->SetNumber(number);
                            
break;
                     }
                     
case 3:// 修改生日
                     {
                            
string bday;
                            fflush(stdin);
                            
do
                            {
                                   cout 
<< PromptInfo[inputBdayPrompt];
                                   cin 
>> bday;
                                   nameSexBdayE.SetValidateStr(Birthday, bday);
                            }
                            
while (nameSexBdayE.RetExceptionInfo(Birthday));
                            (
*i)->GetBirthday().SetBirthday(bday);
                            
break;
                     }
                     
case 4:// 修改性别
                     {
                            
string sex;
                            fflush(stdin);
                            
do
                            {
                                   cout 
<< PromptInfo[inputSexPrompt];
                                   cin 
>> sex;
                                   nameSexBdayE.SetValidateStr(Sex, sex);
                            }
                            
while (nameSexBdayE.RetExceptionInfo(Sex));
                            (
*i)->SetSex(sex.c_str());
                            
break;
                     }
                     
default:// 不修改,跳出
                     {
                            
break;
                     }
              }
              choose 
= 0;
              
string salary;        // 薪水
              string wage;         // 时薪
              string hours;        // 工作时间
              string comm;              // 提成
              string sale;           // 销售量
              
// 修改雇员特征信息
              switch ((*i)->GetRank())
              {
                     
case Manager:
                     {
 
                            cout 
<< PromptInfo[selectModifyManager] << endl
                                 
<< PromptInfo[empSalary] << endl
                                 
<< PromptInfo[noModifyPressOther] << endl;
                            cin 
>> choose;
                            
switch (choose)
                            {
                                   
case 1:// 修改月薪
                                   {
                                          
do
                                          {
                                                 cout 
<< PromptInfo[inputSalaryPrompt];
                                                 cin 
>> salary;
                                                 numE.SetValidateStr(Salary, salary);
                                          }
                                          
while (numE.RetExceptionInfo(Salary));
                                          ((CManager
*)(*i))->SetSalary((float)atof(salary.c_str()));
                                          
break;
                                   }    
                                   
default:// 不修改,直接跳出
                                   {
                                          
break;
                                   }
                            }
                            
break;
                     }
                     
case Wage:
                     {
                            cout 
<< PromptInfo[selectModifyWage] << endl
                                 
<< PromptInfo[empWage1] << endl
                                 
<< PromptInfo[empHours1] << endl
                                 
<< PromptInfo[noModifyPressOther] << endl;
                            cin 
>> choose;
                            
switch (choose)
                            {
                                   
case 1:// 修改时薪
                                   {
                                          
do
                                          {
                                                 cout 
<< PromptInfo[inputWagePrompt];           
                                                 cin 
>> wage;
                                                 numE.SetValidateStr(WagE, wage);
                                          }
                                          
while (numE.RetExceptionInfo(WagE));
                                          ((CWage
*)(*i))->SetWage((float)atof(wage.c_str()));
                                          
break;
                                   }
                                   
case 2:// 修改工作时间
                                   {
                                          
do
                                          {
                                                 cout 
<< PromptInfo[inputHoursPrompt];    
                                                 cin 
>> hours;
                                                 numE.SetValidateStr(Hours, hours);
                                          }
                                          
while (numE.RetExceptionInfo(Hours));
                                          ((CWage
*)(*i))->SetHours((float)atof(hours.c_str()));
                                          
break;
                                   }
                                   
default:// 不修改,直接跳出
                                   {
                                          
break;
                                   }
                            }
                            
break;
                     }
                     
case 3:// Sales
                     {
                            cout 
<< PromptInfo[selectModefySales] << endl
                                 
<< PromptInfo[empWage1] << endl
                                 
<< PromptInfo[empHours1] << endl
                                 
<< PromptInfo[empComm3] << endl
                                 
<< PromptInfo[empSale4] << endl
                                 
<< PromptInfo[noModifyPressOther] << endl;
                            cin 
>> choose;
                            
switch (choose)
                            {
                                   
case 1:// 修改时薪
                                   {
                                          
do
                                          {
                                                 cout 
<< PromptInfo[inputWagePrompt];           
                                                 cin 
>> wage;
                                                 numE.SetValidateStr(WagE, wage);
                                          }
                                          
while (numE.RetExceptionInfo(WagE));
                                          ((CSales
*)(*i))->SetWage((float)atof(wage.c_str()));
                                          
break;
                                   }    
                                   
case 2:// 修改工作时间
                                   {
                                          
do
                                          {
                                                 cout 
<< PromptInfo[inputHoursPrompt];    
                                                 cin 
>> hours;
                                                 numE.SetValidateStr(Hours, hours);
                                          }
                                          
while (numE.RetExceptionInfo(Hours));
                                          ((CSales
*)(*i))->SetHours((float)atof(hours.c_str()));
                                          
break;
                                   }
                                   
case 3:// 修改提成
                                   {
                                          
do
                                          {
                                                 cout 
<< PromptInfo[inputCommPrompt];          
                                                 cin 
>> comm;
                                                 numE.SetValidateStr(Comm, comm);
                                          }
                                          
while (numE.RetExceptionInfo(Comm));
                                          ((CSales
*)(*i))->SetCommission((float)atof(comm.c_str()));
                                          
break;
                                   }
                                   
case 4:// 修改销售量
                                   {
                                          
do
                                          {
                                                 cout 
<< PromptInfo[inputSalePrompt];       
                                                 cin 
>> sale;
                                                 numE.SetValidateStr(Sale, sale);
                                          }
                                          
while (numE.RetExceptionInfo(Sale));
                                          ((CSales
*)(*i))->SetSales((float)atof(sale.c_str()));
                                          
break;
                                   }
                                   
default:// 不修改,直接跳出
                                   {
                                          
break;   
                                   }
                            }
                            
break;
                     }
              }
       }
      
       
return;
}
/*******************************************************************
 
   文件名: EISMOutput.cpp
   摘要: 雇员信息管理系统数据输出模块的实现
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-19    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CEIMS.h"
#include 
<fstream>
#include 
<iostream>
#include 
<iomanip>
using namespace std;
 
// 函数名:GreaterName
// 功能:姓名排序标准
// 输入参数:CEmployee* c1, c2:分别指向两个雇员
// 输出参数:bool:c1的姓名比c2大(ASCII)返回true,否则返回false
bool GreaterName(CEmployee* c1, CEmployee* c2)
{
       
return strcmp(c1->GetNamePointer(), c2->GetNamePointer()) < 0;
}
 
// 函数名:GreaterSalary
// 功能:薪水排序标准
// 输入参数:CEmployee* c1, c2:分别指向两个雇员
// 输出参数:bool:c1的薪水比c2多返回true,否则返回false
bool GreaterSalary(CEmployee* c1, CEmployee* c2)
{
       
return c1->ComputePay() > c2->ComputePay();
}
 
// 函数名:GreaterRank
// 功能:类别排序标准
// 输入参数:CEmployee* c1, c2:分别指向两个雇员
// 输出参数:bool:c1的类别等级比c2高返回true,否则返回false
bool GreaterRank(CEmployee* c1, CEmployee* c2)
{
       
return c1->GetRank() > c2->GetRank();
}
 
// 函数名:SaveSalaryFile
// 功能:保存所有雇员的薪水报表到磁盘文件
// 输入参数:void
// 输出参数:void
void CEIMS::SaveSalaryFile(void)
{
       
if (!HaveEmp())
       {
// 雇员信息为空
              cout << ExceptionInfo[NoEmpInfo];
              
return;
       }
       
int sortMethod = 1;
       cout 
<< PromptInfo[selectSortMethod] << endl;
       cin 
>> sortMethod;
 
       
// 进行排序
       switch (sortMethod)
       {
              
case 1:// 按薪水升序
              {
                     _pEmpList.sort(GreaterSalary);
                     
break;
              }
              
case 2:// 按姓名排序(ASCII)
              {
                     _pEmpList.sort(GreaterName);
                     
break;
              }
              
case 3:// 按职位升序
              {
                     _pEmpList.sort(GreaterRank);
                     
break;
              }
              
default:
              {
                     cerr 
<< ExceptionInfo[UndefSortMethod];
                     
break;
              }
      
       }
      
       
string filePath;
       cout 
<< PromptInfo[inputFilePath];
       cin 
>> filePath;
 
       ofstream outFile(
"salary.data");
 
       
if (!outFile)
       {
              cerr 
<< ExceptionInfo[SaveFileFailure] << endl;
              
return;
       }
       
// 开始存文件
       for (list<CEmployee*>::iterator
            i 
= _pEmpList.begin();
             i 
!= _pEmpList.end();
             i
++)
        {
              outFile 
<< PromptInfo[empName] << (*i)->GetName()
                     
<< ' ' << PromptInfo[empSalary] << (*i)->ComputePay() <<
endl;     
        }
        outFile.close();
 
       
return;
}
 
// 函数名:SaveFile
// 功能:保存所有雇员的信息到磁盘文件
// 输入参数:void
// 输出参数:void
void CEIMS::SaveFile(void)
{
       
if (!HaveEmp())
       {
// 雇员信息为空
              cout << ExceptionInfo[NoEmpInfo];
              
return;
       }
       
string filePath;
       cout 
<< PromptInfo[inputFilePath];
       cin 
>> filePath;
 
       ofstream outFile(
"employee.data");
      
       
if (!outFile)
        {
// 文件打开失败的话退出当前过程
                cerr << ExceptionInfo[SaveFileFailure] << endl;
                
return;
        }
 
       
// 开始存储
        for (list<CEmployee*>::iterator
            i 
= _pEmpList.begin();
             i 
!= _pEmpList.end();
             i
++)
        {
              outFile 
<< PromptInfo[jobRank] << (*i)->GetRank() << endl      
       
// 类别
                     << (*i)->GetName() << endl                       
       
// 姓名
                         << (*i)->GetNumber() << endl                         
       
// 编号
                      << (*i)->GetSex() << endl                         
       
// 性别
                     << (*i)->GetBirthday().GetStr() << endl;          
       
// 生日
              switch ((*i)->GetRank())
              {
                     
case Manager:
                     {
                            outFile 
<< ((CManager*)(*i))->GetSalary() <<
endl;      
// 月薪
                            break;
                     }
                     
case Wage:
                     {
                            outFile 
<< ((CWage*)(*i))->GetWage() << endl      
       
// 时薪
                                    << ((CWage*)(*i))->GetHours() << endl; 
       
// 工时
                            break;
                     }
                     
case Sales:
                     {
                            outFile 
<< ((CSales*)(*i))->GetCommission() <<
endl       
// 提成
                                   << ((CSales*)(*i))->GetSales() << endl      
       
// 销售量
                                    << ((CSales*)(*i))->GetWage() << endl   
       
// 时薪
                                    << ((CSales*)(*i))->GetHours() << endl;  
       
// 工时
                            break;
                     }
              }
        }
        outFile.close();
 
       
return;
}
 
// 函数名:DisplayRankDetails
// 功能:显示同一类别雇员的详细信息
// 输入参数:void
// 输出参数:void
void CEIMS::DispalyRankDetails(void)
{
       
if (!HaveEmp())
       {
// 雇员信息为空
              cout << ExceptionInfo[NoEmpInfo];
              
return;
       }
 
       
int choose = 1;
       cout 
<< PromptInfo[selectEmpDispalyKind];
       cout 
<< PromptInfo[employeeKindsList] << endl;
       cin 
>> choose;
 
       
// 根据选择的类别打印表头与开始时的表身
       switch (choose)
       {
              
case Manager:
              {
                     PrintManagerInfoTableHead();
                     PrintManagerInfoTableBody();
                     
break;
              }
              
case Wage:
              {
                     PrintWageInfoTableHead();
                     PrintWageInfoTableBody();
                     
break;
              }
              
case Sales:
              {
                     PrintSalesInfoTableHead();
                     PrintSalesInfoTableBody();
                     
break;
              }
       }
 
       
// 把同一类雇员的指针集中到一个临时链表里
       list<CEmployee *> sameRankEmp;
       
for (list<CEmployee*>::iterator
            i 
= _pEmpList.begin();
            i 
!= _pEmpList.end();
            i
++)
       {
              
if ((*i)->GetRank() == choose)
              {
                     sameRankEmp.push_back(
*i);
              }
       }
 
       
// 打印数据与表身
       for (list<CEmployee*>::iterator
            i 
= sameRankEmp.begin();
            i 
!= sameRankEmp.end();)
       {
              
switch (choose)
              {
                     
case Manager:
                     {
                            cout 
<< setfill(' ')
                                 
<< "" << setw(8<< (*i)->GetName()
                                 
<< "" << setw(8<< (*i)->GetNumber()
                                 
<< "" << setw(8<<
((CManager
*)(*i))->GetSalary()
                                   
<< "" << setw(8<< (*i)->ComputePay()
                                 
<< "" << setw(8<<
Rank[(
*i)->GetRank()-1<< "" << endl;
                            
if (++!= sameRankEmp.end())
                            {
                                   PrintManagerInfoTableBody();
                            }
                               
break;
                     }
                     
case Wage:
                     {
                            cout 
<< setfill(' ')
                                 
<< "" << setw(8<< (*i)->GetName()
                                 
<< "" << setw(8<< (*i)->GetNumber()
                                 
<< "" << setw(8<<
((CWage
*)(*i))->GetWage()
                                 
<< "" << setw(4<<
((CWage
*)(*i))->GetHours()
                                 
<< "" <<setw(6<< (*i)->ComputePay()
                                 
<< "" << setw(8<<
Rank[(
*i)->GetRank()-1<< "" << endl;
                            
if (++!= sameRankEmp.end())
                            {
                                   PrintWageInfoTableBody();
                            }
                            
break;
                     }
                     
case Sales:
                     {
                            cout 
<< setfill(' ')
                                 
<< "" << setw(8<< (*i)->GetName()
                                 
<< "" << setw(8<< (*i)->GetNumber()
                                 
<< "" << setw(8<<
((CWage
*)(*i))->GetWage()
                                 
<< "" << setw(4<<
((CWage
*)(*i))->GetHours()
                                 
<< "" << setw(8<<
((CSales
*)(*i))->GetCommission()
                                 
<< "" << setw(8<<
((CSales
*)(*i))->GetSales()
                                 
<< "" <<setw(6<< (*i)->ComputePay()
                                 
<< "" << setw(8<<
Rank[(
*i)->GetRank()-1<< "" << endl;
                            
if (++!= sameRankEmp.end())
                            {
                                   PrintSalesInfoTableBody();
                            }
                            
break;
                     }
              }
       }
 
       
// 根据选择的类别打印表尾
       switch (choose)
       {
              
case Manager:
              {
                     PrintManagerInfoTableTail();
                     
break;
              }
              
case Wage:
              {
                     PrintWageInfoTableTail();
                     
break;
              }
              
case Sales:
              {
                     PrintSalesInfoTableTail();
                     
break;
              }
       }
 
       
// 显示人员统计
       cout << setfill(' ');
       
switch (choose)
       {
              
case Manager:
              {
                     cout 
<< setw(53<< PromptInfo[totalManager] <<
_unManager 
<< PromptInfo[count] << endl;            
                     
break;
              }
              
case Wage:
              {
                     cout 
<< setw(56<< PromptInfo[totalWage] << _unWage <<
PromptInfo[count] 
<< endl;          
                     
break;
              }
              
case Sales:
              {
                     cout 
<< setw(76<< PromptInfo[totalSales] << _unSales
<< PromptInfo[count] << endl;            
                     
break;
              }
       }
 
       
return;
}
 
// 函数名:DisplayBasicInfo
// 功能:显示姓名、编号、类别、生日等所有雇员都具有的信息
// 输入参数:void
// 输出参数:void
void CEIMS::DisplayBasicInfo(void)
{
       
if (!HaveEmp())
       {
// 雇员信息为空
              cout << ExceptionInfo[NoEmpInfo];
              
return;
       }
       
else
       {
              PrintBasicInfoTableHead();
              PrintBasicInfoTableBody();
              
for (list<CEmployee*>::iterator
                   i 
= _pEmpList.begin();
                    i 
!= _pEmpList.end();
                   )
              {
                     cout 
<< setfill(' ')
                          
<< "" << setw(8<< (*i)->GetName()
                             
<< "" << setw(8<< (*i)->GetNumber()
                          
<< "" << " " <<
Gender[atoi((
*i)->GetSex().c_str())-1<< " "
                           
<< "" << (*i)->GetBirthday().GetStr()
                          
<< "" << setw(6<< (*i)->ComputePay()
                          
<< "" << setw(8<< Rank[(*i)->GetRank()-1<< ""
<< endl;
                     
if (++!= _pEmpList.end())
                     {
                            PrintBasicInfoTableBody();
                     }
              }
              PrintBasicInfoTableTail();
       }
       
// 显示人员统计
       cout << setfill(' ');
       cout 
<< setw(63<< PromptInfo[totalManager] << _unManager <<
PromptInfo[count] 
<< endl
            
<< setw(63<< PromptInfo[totalWage] << _unWage <<
PromptInfo[count] 
<< endl
            
<< setw(63<< PromptInfo[totalSales] << _unSales <<
PromptInfo[count] 
<< endl
            
<< setw(63<< PromptInfo[totalEmp] << _unTotalEmp <<
PromptInfo[count] 
<< endl;
 
       
return;
}
/*******************************************************************
 
   文件名: EIMSQuery.cpp
   摘要: 雇员信息管理系统数据录入模块的实现
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-20    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CEIMS.h"
#include 
<iostream>
#include 
<string>
#include 
<iomanip>
 
using namespace std;
 
// 函数名: FindByNumberName
// 功能:通过雇员编号或姓名查询雇员详细信息
// 输入参数:void
// 输出参数:viod
void CEIMS::FindByNumberName(void)
{
       
if (!HaveEmp())
       {
// 雇员信息为空
              cout << ExceptionInfo[NoEmpInfo];
              
return;
       }
 
       
int searchMethod = 1;
       cout 
<< PromptInfo[askQueryMethod]
            
<< PromptInfo[selectQueryMethod];
       cin 
>> searchMethod;
       
string name;
       
string num;
       
bool findFlag = false;        // 判断是否找到待查雇员
 
       
if (1 == searchMethod)
       {
// 通过姓名查询
              cout << PromptInfo[queryEmpName];
              cin 
>> name;
       }
       
else if (2 == searchMethod)
       {
// 通过编号查询
              cout << PromptInfo[queryEmpNum];
              cin 
>> num;
       }
       
else
       {
// 退出查询模块
              return;
       }
 
       
for (list<CEmployee*>::iterator
            i 
= _pEmpList.begin();
            i 
!= _pEmpList.end();
            i
++)
       {
              
if (((*i)->GetName() == name) || ((*i)->GetNumber() == num))
              {
// 找到了给定雇员
                     findFlag = true;
                     
switch ((*i)->GetRank())
                     {
                            
case Manager:
                            {
                                   PrintManagerInfoTableHead();
                                   PrintManagerInfoTableBody();
                                   cout 
<< setfill(' ')
                                           
<< "" << setw(8<< (*i)->GetName()
                                        
<< "" << setw(8<< (*i)->GetNumber()
                                        
<< "" << setw(8<< ((CManager*)(*i))->GetSalary()
                                          
<< "" << setw(8<< (*i)->ComputePay() << ""
                                        
<< "" << setw(8<< Rank[(*i)->GetRank()-1<< "" << endl;
                                   PrintManagerInfoTableTail();
                                   
break;
                            }
                            
case Wage:
                            {
                                   PrintWageInfoTableHead();
                                   PrintWageInfoTableBody();
                                   cout 
<< setfill(' ')
                                           
<< "" << setw(8<< (*i)->GetName()
                                        
<< "" << setw(8<< (*i)->GetNumber()
                                        
<< "" << setw(8<< ((CWage*)(*i))->GetWage()
                                        
<< "" << setw(4<< ((CWage*)(*i))->GetHours()
                                        
<< "" <<setw(6<< (*i)->ComputePay()
                                        
<< "" << setw(8<< Rank[(*i)->GetRank()-1<< "" << endl;
                                   PrintWageInfoTableTail();
                                   
break;
                            }
                            
case Sales:
                            {
                                   PrintSalesInfoTableHead();
                                   PrintSalesInfoTableBody();
                                   cout 
<< setfill(' ')
                                        
<< "" << setw(8<< (*i)->GetName()
                                        
<< "" << setw(8<< (*i)->GetNumber()
                                        
<< "" << setw(8<< ((CWage*)(*i))->GetWage()
                                        
<< "" << setw(4<< ((CWage*)(*i))->GetHours()
                                        
<< "" << setw(8<< ((CSales*)(*i))->GetCommission()
                                        
<< "" << setw(8<< ((CSales*)(*i))->GetSales()
                                        
<< "" <<setw(6<< (*i)->ComputePay()
                                        
<< "" << setw(8<< Rank[(*i)->GetRank()-1<< "" << endl;
                                   PrintSalesInfoTableTail();
                                   
break;
                            }
                     }
                     
char modify = 'n';
                     cout 
<< PromptInfo[wetherUpdateEmoInfo];
                     cin 
>> modify;
                     
if ('y' == tolower(modify))
                     {
                            ModifyInfo(i);
                     }
              }    
       }
      
       
if (!findFlag)
       {
// 说明没有找到要找的雇员
              cout << ExceptionInfo[NoThisRank];
       }    
 
       
return;
}
/*******************************************************************
 
   文件名: EmployeeIMS.cpp
   摘要: 一个简单的雇员信息管理系统
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-17    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CEIMS.h"
#include 
<iostream>
 
using namespace std;
 
int main(void)
{
       CEIMS employeeIMS;
      
       employeeIMS.WelcomeSplash();
       employeeIMS.MainMenu();
      
 
      
       
return 0;
}
 
/*******************************************************************
 
   文件名: PrintTable.cpp
   摘要: 打印表头、表身和表尾。这里的表包括了雇员基本信息表,
         同一类别雇员信息表,薪水表
   开发平台: Win Xp SP2
   编译环境: CL.exe 8.0 (in Visual Studio 2005 SDK)
   作者: 88250
   完成日期: 2006-12-18    版本: 1.0
   Blog: 
http://DL88250.ynutx.net
   E-mail: DL88250@gmail.com
   QQ: 845765 or 316281008
 
 ******************************************************************
*/
 
#include 
"CEIMS.h"
 
// 打印基本信息表的表头
void CEIMS::PrintBasicInfoTableHead(void)
{
        cout 
<< "┏━━━━┳━━━━┳━━━┳━━━━━┳━━━┳━━━━┓" << endl;
        cout 
<< "┃ 姓名 ┃ 编号 ┃ 性别 ┃ 出生日期 ┃ 薪水 ┃ 职位 ┃" << endl;
       
return;
}
 
// 打印基本信息表的表身
void CEIMS::PrintBasicInfoTableBody(void)
{
       cout 
<< "┣━━━━╋━━━━╋━━━╋━━━━━╋━━━╋━━━━┫" << endl;
       
return;
}
 
// 打印基本信息表的表尾
void CEIMS::PrintBasicInfoTableTail(void)
{
       cout 
<< "┗━━━━┻━━━━┻━━━┻━━━━━┻━━━┻━━━━┛" << endl;
       
return;
}
 
// 打印Manager类别信息的表头
void CEIMS::PrintManagerInfoTableHead(void)
{
        cout 
<< "┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┓" << endl;
        cout 
<< "┃ 姓名 ┃ 编号 ┃ 月薪 ┃ 薪水 ┃ 职位 ┃" << endl;
       
return;
}
 
// 打印Manager类别信息的表身
void CEIMS::PrintManagerInfoTableBody(void)
{
       cout 
<< "┣━━━━╋━━━━╋━━━━╋━━━━╋━━━━┫" << endl;
       
return;
}
 
// 打印Manager类别信息的表尾
void CEIMS::PrintManagerInfoTableTail(void)
{
       cout 
<< "┗━━━━┻━━━━┻━━━━┻━━━━┻━━━━┛" << endl;
       
return;
}
 
// 打印Wage类别信息的表头
void CEIMS::PrintWageInfoTableHead(void)  
{
        cout 
<< "┏━━━━┳━━━━┳━━━━┳━━┳━━━┳━━━━┓" << endl;
        cout 
<< "┃ 姓名 ┃ 编号 ┃ 时薪 ┃工时┃ 薪水 ┃ 职位 ┃" << endl;
       
return;
}
 
// 打印Wage类别信息的表身
void CEIMS::PrintWageInfoTableBody(void)  
{
       cout 
<< "┣━━━━╋━━━━╋━━━━╋━━╋━━━╋━━━━┫" << endl;
       
return;
}
 
// 打印Wage类别信息的表尾
void CEIMS::PrintWageInfoTableTail(void)     
{
       cout 
<< "┗━━━━┻━━━━┻━━━━┻━━┻━━━┻━━━━┛" << endl;
       
return;
}
 
// 打印Sales类别信息的表头
void CEIMS::PrintSalesInfoTableHead(void)
{
        cout 
<< "┏━━━━┳━━━━┳━━━━┳━━┳━━━━┳━━━━┳━━━┳━━━━┓" << endl;
        cout 
<< "┃ 姓名 ┃ 编号 ┃ 时薪 ┃工时┃ 提成 ┃ 销售量 ┃ 薪水 ┃ 职位 ┃" << endl;
       
return;
}
 
// 打印Sales类别信息的表身
void CEIMS::PrintSalesInfoTableBody(void)   
{
       cout 
<< "┣━━━━╋━━━━╋━━━━╋━━╋━━━━╋━━━━╋━━━╋━━━━┫" << endl;
       
return;
}
 
// 打印Sales类别信息的表尾
void CEIMS::PrintSalesInfoTableTail(void)
{
       cout 
<< "┗━━━━┻━━━━┻━━━━┻━━┻━━━━┻━━━━┻━━━┻━━━━┛" << endl;
       
return;
}
哎。。。。好无聊。。。。
好期望放假啊,回去好好学点东西,包括文本自动分类技术、操作系统、网络原理,还要准备下系统分析师认证。。。。

对了,下面是完整的实验报告文档:
http://download1.csdn.net/down3/20070621/21204901614.doc
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝吐奶从鼻子喷出来怎么办 六个多月宝宝吐奶一股酸味怎么办 50天的宝宝吃了就吐怎么办 微信语音群聊超过9人怎么办 四个月宝宝母乳不够不喝奶粉怎么办 四个月的宝宝母乳不够吃怎么办 火山直播十多天了还都是假人怎么办 吉利汽车锁了后屁股灯还亮怎么办 六个月凶了他突然不说话了怎么办 微信聊天聊的时间长了没话题怎么办 群聊同学加我微信不想加怎么办? 翡翠销售遇到不说话的客人怎么办 4个月宝宝吃手上瘾怎么办 宝宝吃手上瘾拒绝吃奶粉吃奶怎么办 2岁宝宝特别粘人爱哭怎么办 3岁半宝宝突然说话口吃怎么办 2岁3个月宝宝突然说话结巴怎么办 一位特爱说话爱玩的高中生怎么办 猫5天不吃不喝躲起来该怎么办 两个月的小家猫睡觉要黏人睡怎么办 成年的儿子不听话做父母要怎么办 听到孩子上课又不听话想揍他怎么办 18个月小孩脾气很犟怎么办 烦自己的孩子想弄死他怎么办 楼道经常有小孩在门口恶作剧怎么办 2岁宝宝咳嗽咳吐了怎么办 不小心把鱼刺吃下去该怎么办 儿子在学校被老师甩耳光我该怎么办 家长诬陷老师打她家孩子耳光怎么办 一岁宝宝总觉得有痰怎么办 一岁宝宝感冒咳嗽有痰怎么办 哭的时候踹不过气来应该怎么办 孩子在幼儿园被老师罚站怎么办 孩子屁股打肿了又红又紫怎么办 生完孩子两个月一直浑身疼怎么办 宝宝被蚊子叮咬后红肿硬怎么办 小孩屁股青一块紫一块打的怎么办 小孩的手被鞭子抽红了怎么办 孩子每次写作业都要挨打挨骂怎么办 儿子四岁脾气特别大怎么办呢 月子里屁股被开水烫了怎么办