通过本项目练习c++的基础知识
-
- 项目界面
- 头文件
-
- workermanager.h(管理类)
- worker.h(职工抽象类)
- manager.h(经理类)
- employee.h(普通职工类)
- boss.h(老板类)
- 源文件
-
- employee.cpp
- boss.cpp
- manager.cpp
- workermanager.cpp
- main.cpp
项目界面
通过界面能了解本项目的基础功能
头文件
workermanager.h(管理类)
//管理类
#pragma once
#include
#include "worker.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"
#include //文件操作头文件
#define FILENAME "empFile.txt"
class WorkerManager
{
public:
static int MyFlag;
int m_EmpNum; //记录职工人数
Worker ** m_EmpArray;//职工数组指针
bool IsFile_Empty;//判断文件是否为空
WorkerManager();
~WorkerManager();
void ShowMenu();//显示界面
void exitSystem();//退出系统
void Add_Emp();//增加职工
void Save_File();//存储文件
int Get_EmpNum();//统计人数
void Init_Emp(); //初始化员工操作
void Show_Emp(); //显示职工
int IsExist(int id);//想要删除职工得先判断职工是否存在
void Del_Emp(); //删除职工
void Mod_Emp(); //修改职工
void Find_Emp();//查找函数
void Sort_Emp();//排序职工(按照编号)
void Clean_File(); //清空文件
};
worker.h(职工抽象类)
//抽象类
#pragma once
#include
#include
using namespace std;
class Worker
{
public:
int m_id;
string m_name;
int m_deptid;
virtual void showInfo()=0;
virtual string getDeptName()=0;
};
manager.h(经理类)
//经理类
#pragma once
#include "worker.h"
#include
#include
class Manager:public Worker
{
private:
public:
Manager(int id,string name,int tid);
~Manager();
virtual void showInfo();
virtual string getDeptName();
};
employee.h(普通职工类)
//普通职工
#pragma once
#include "worker.h"
#include
#include
using namespace std;
class Employee:public Worker
{
public:
Employee(int id,string name,int did);
virtual void showInfo();//获取个人信息
virtual string getDeptName();//获取岗位名称
};
boss.h(老板类)
//普通职工
#pragma once
#include "worker.h"
#include
#include
using namespace std;
class Boss:public Worker
{
public:
Boss(int id,string name,int tid);
virtual void showInfo();//获取个人信息
virtual string getDeptName();//获取岗位名称
};
源文件
employee.cpp
#include "employee.h"
Employee::Employee(int id,string name,int tid){
this->m_id=id;
this->m_name=name;
this->m_deptid=tid;
}
void Employee::showInfo(){
cout<<"编号"<m_id
<<"\t姓名:"<m_name
<<"\t岗位:"<getDeptName()
<<"\t职责:打工仔"<
boss.cpp
#include "boss.h"
Boss::Boss(int id,string name,int tid){
this->m_id=id;
this->m_name=name;
this->m_deptid=tid;
}
void Boss::showInfo(){
cout<<"编号"<m_id
<<"\t姓名:"<m_name
<<"\t岗位:"<getDeptName()
<<"\t职责:当老板"<
manager.cpp
#include "manager.h"
Manager::Manager(int id,string name,int tid)
{
this->m_id=id;
this->m_name=name;
this->m_deptid=tid;
}
Manager::~Manager()
{
}
void Manager::showInfo()
{
cout<<"编号"<m_id
<<"\t姓名:"<m_name
<<"\t岗位:"<getDeptName()
<<"\t职责:管理普通员工"<
workermanager.cpp
#include "workermanager.h"
#include
using namespace std;
WorkerManager::WorkerManager()
{
//分情况讨论初始化
ifstream ifs;
ifs.open(FILENAME,ios::in);//读文件
//>>1.文件不存在
if(!ifs.is_open())
{
//cout<<"文件不存在"<m_EmpNum=0; //初始化人数为0
this->m_EmpArray=NULL;//数组为空
this->IsFile_Empty= true;
ifs.close();
return;
}
//>>2.文件空
char ch;
ifs>>ch;//读1个字符
if(ifs.eof())
{
//cout<<"文件空"<m_EmpNum=0; //初始化人数为0
this->m_EmpArray=NULL;//数组为空
this->IsFile_Empty= true;
ifs.close();
return;
}
//>>3.文件存在
this->IsFile_Empty=false;
int num=this->Get_EmpNum();
//cout<<"职工人数为"<m_EmpNum=num;
//开辟空间
this->m_EmpArray=new Worker*[this->m_EmpNum];
// 存放到空间
this->Init_Emp();
/******************下面是测试代码****************************/
// for (int var = 0; var < this->m_EmpNum; ++var) {
// cout<m_EmpArray[var]->m_name<m_EmpArray!=NULL)
{
for(int i=0;im_EmpNum;i++)
{
if(this->m_EmpArray[i] != NULL)
{
delete this->m_EmpArray[i];
}
}
delete [] this->m_EmpArray;
this->m_EmpArray=NULL;
}
}
//清空文件
void WorkerManager::Clean_File()
{
cout<<"确定清空?"<>select;
if(select == 1)
{
ofstream ofs(FILENAME,ios::trunc);//删除并重新创建
ofs.close();
if(this->m_EmpArray!=NULL)
{
//删除职工对象
for(int i=0;im_EmpArray[i];
this->m_EmpArray[i]=NULL;
}
delete [] this->m_EmpArray;
this->m_EmpArray=NULL;
this->m_EmpNum=0;
this->IsFile_Empty=true;
}
cout<<"清空成功"<IsFile_Empty)
{
cout<<"文件是不存在的,或者记录为空"<>select;
//开始实现排序功能
for(int i=0;im_EmpNum;j++)
{
if(select == 1)
{
if(this->m_EmpArray[MinOrMax]->m_id > this->m_EmpArray[j]->m_id)
{
MinOrMax=j;
}
}else { //降序
if(this->m_EmpArray[MinOrMax]->m_id < this->m_EmpArray[j]->m_id)
{
MinOrMax=j;
}
}
}
if(i!=MinOrMax)
{
//交换元素值
Worker*temp=this->m_EmpArray[i];
this->m_EmpArray[i]=this->m_EmpArray[MinOrMax];
this->m_EmpArray[MinOrMax]=temp;
}
}
cout<<"排序成功!其结果为:"<Save_File();//存储结果
this->Show_Emp();
}
}
//查找员工函数
void WorkerManager::Find_Emp()
{
int val=0;
if(this->IsFile_Empty)
{
cout<<"文件不存在或记录为空!"<>val;
if(val == 1)
{
int id=0;
cout<<"请输入职工编号"<>id;
int ret=IsExist(id);
if(ret!= -1)
{
cout<<"通过编号查找到了员工"<m_EmpArray[ret]->showInfo();//忘了this,使用多态打印信息
flage =true;
}
}else if(val == 2)
{
//按照姓名查询
string name;
cout<<"请输入要查找的姓名"<>name;
for(int i=0; im_EmpArray[i]->m_name==name)
{
cout<<"通过姓名查找到了员工"<m_EmpArray[i]->showInfo();
flage =true;
}
}
}else
{
cout<<"输入选项有误"<IsFile_Empty)
{
cout<<"文件不存在"<>id;
int ret=this->IsExist(id);
if(ret!=-1)
{
//找到职工
//将职工从数组中删掉
delete this->m_EmpArray[ret];
int newid=0;
string newname="";
int deselect=0;//新部门编号
cout<<"查找到:"<>newid;
if(this->IsExist(newid)!=-1)
{
cout<<"职工编号已存在,请重新输入"<>newname;
cout<<"请输入岗位"<>deselect;//输入岗位
Worker *worker=NULL;
switch (deselect) {
case 1:
worker=new Employee(newid,newname,deselect);
break;
case 2:
worker=new Manager(newid,newname,deselect);
break;
case 3:
worker=new Boss(newid,newname,deselect);
break;
default:
break;
}
//更新数组
this->m_EmpArray[ret]=worker;
cout<<"修改成功"<Save_File();
}else
{
cout<<"修改失败,查无此人"<IsFile_Empty)
{
cout<<"公司还没招聘员工,删除失败"<>id;
int index=this->IsExist(id);
if(index == -1)
{
cout<<"未查询到员工,请确认员工编号"<m_EmpNum-1; ++var) {
this->m_EmpArray[var]=this->m_EmpArray[var+1];
}
this->m_EmpNum--;
//同步到文件中
this->Save_File();
cout<<"删除成功"<m_EmpNum; ++var) {
if(this->m_EmpArray[var]->m_id==id)
{
index = var; //返回其所在数组中位置
break;
}
}
return index;
}
//显示职工
void WorkerManager::Show_Emp()
{
//判断人数
if(this->IsFile_Empty)
{
cout<<"无员工"<m_EmpArray[var]->showInfo();
}
}
//按下任意键清屏
system("pause");
system("cls");
}
//初始化员工
void WorkerManager::Init_Emp()
{
ifstream ifs;
ifs.open(FILENAME,ios::in);
int id; //员工id
string name; //员工姓名
int Did;//部门编号
int index =0; //标号
while(ifs>>id &&ifs>>name&&ifs>>Did)
{
Worker *worker=NULL;
if(Did == 1) //普通员工
{
worker=new Employee(id,name,Did);
}
else if(Did == 2)
{
worker=new Manager(id,name,Did);
}else
{
worker=new Boss(id,name,Did);
}
//维护数组
this->m_EmpArray[index] =worker;
index++;
}
ifs.close(); //关闭文件
}
//获取员工人数
int WorkerManager::Get_EmpNum()
{
int id; //员工id
string name; //员工姓名
int Did;//部门编号
int num=0;
ifstream ifs;
ifs.open(FILENAME,ios::in); //打开文件 读
while(ifs>>id &&ifs>>name&&ifs>>Did) //当三个全部成功后,让num++
{
num++;
}
return num;
}
//写文件函数
void WorkerManager::Save_File()
{
ofstream ofs;//想要使用写文件得使用ofstream对文件进行写操作
ofs.open(FILENAME,ios::out);//ios::下的输出方式打开 -- 写文件
for(int i=0;im_EmpNum;i++) //m_EmpNum职工人数
{
ofs<m_EmpArray[i]->m_id<<" "
<m_EmpArray[i]->m_name<<" "
<m_EmpArray[i]->m_deptid<>addNum;
if (addNum>0)
{
//新空间大小是原本空间大小加上增加空间大小
int newSize=this->m_EmpNum+addNum;
//开辟新空间,存储人数
Worker ** newSpace=new Worker*[newSize];//使用二级指针写
//拷贝原空间到新空间
if(this->m_EmpArray!=NULL)//说明里面有数据
{
for (int i = 0; i < this->m_EmpNum; i++)
{
newSpace[i]=this->m_EmpArray[i];
}
} //这里出现问题
for (int i = 0; i < addNum; i++)
{
int id;// 职工编号
string name;// 职工姓名
int tid;
while (1) {
cout<<"请输入第"<>id;
//有点问题
if( ((id == WorkerManager::MyFlag)||this->IsExist(id)+1 == id))
{
cout<<"员工编号已经存在"<>name;
cout<<"请输入职工岗位:"<>tid;
Worker*temp=NULL;
switch (tid)
{
case 1:
temp=new Employee(id,name,1);
break;
case 2:
temp=new Manager(id,name,2);
break;
case 3:
temp=new Boss(id,name,3);
break;
default:
cout<<"error"<m_EmpNum+i]=temp;
}
//释放原有空间,并更新新空间指向
delete [] this->m_EmpArray;//释放数组加[]
this->m_EmpArray=newSpace;
//更新职工人数
this->m_EmpNum=newSize;
cout<<"添加成功"<IsFile_Empty=false;//修改判空标志位
//保存添加的员工
this->Save_File();
}else
{
cout<<"输入错误"<
main.cpp
#include
#include "workermanager.h"
using namespace std;
#include "worker.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"
int main()
{
// //测试代码
// Worker *test=NULL;
// test=new Employee(1,"张三",1);
// test->showInfo();
// delete test;
// test = new Manager(2,"李四",3);
// test->showInfo();
// delete test;
// test = new Boss(3,"王五",4);
// test->showInfo();
#if 1
WorkerManager wm;
int chose;
while (1)
{
wm.ShowMenu();
cin>>chose;
switch (chose)
{
case 0: //退出
wm.exitSystem();
break;
case 1: //增加职工
wm.Add_Emp();
break;
case 2:
wm.Show_Emp();//显示员工
break;
case 3:
wm.Del_Emp();//删除职工
break;
case 4:
wm.Mod_Emp();//修改职工
break;
case 5:
wm.Find_Emp();//查找职工
break;
case 6:
wm.Sort_Emp();//排序职工
break;
case 7:
wm.Clean_File();//清空文件
break;
default:
system("clr");
break;
}
}
#endif
system("pause");
return 0;
}