您的位置:首页 > 其它

公司雇员管理系统

2007-01-05 01:19 423 查看
呵呵,今晚是第一次来机房通宵,为了那个所谓的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, 0, sizeof(_name));
memset(_sex, 0, sizeof(_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(0, 4)); // 取年
string month(_birthday.substr(5, 2)); // 取月
string day(_birthday.substr(8, 2)); // 取日
// 处理年份

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, 0, sizeof(name));
memset(sex, 0, sizeof(sex));
memset(number, 0, sizeof(number));
memset(birthday, 0, sizeof(birthday));
memset(salary, 0, sizeof(salary));
memset(wage, 0, sizeof(wage));
memset(hours, 0, sizeof(hours));
memset(comm, 0, sizeof(comm));
memset(sale, 0, sizeof(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 (++i != 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 (++i != 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 (++i != 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 (++i != _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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: