通过本项目练习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 <iostream>
#include "worker.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"
#include <fstream> //文件操作头文件
#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 <iostream>
#include <string>
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 <iostream>
#include <string>
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 <iostream>
#include <string>
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 <iostream>
#include <string>
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<<"编号"<<this->m_id
<<"\t姓名:"<<this->m_name
<<"\t岗位:"<<this->getDeptName()
<<"\t职责:打工仔"<<endl;
}
string Employee::getDeptName(){
string temp="普通员工";
return temp;
}
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<<"编号"<<this->m_id
<<"\t姓名:"<<this->m_name
<<"\t岗位:"<<this->getDeptName()
<<"\t职责:当老板"<<endl;
}
string Boss::getDeptName(){
string temp="老板";
return temp;
}
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<<"编号"<<this->m_id
<<"\t姓名:"<<this->m_name
<<"\t岗位:"<<this->getDeptName()
<<"\t职责:管理普通员工"<<endl;
}
string Manager::getDeptName()
{
string temp="经理";
return temp;
}
workermanager.cpp
#include "workermanager.h"
#include <iostream>
using namespace std;
WorkerManager::WorkerManager()
{
//分情况讨论初始化
ifstream ifs;
ifs.open(FILENAME,ios::in);//读文件
//>>1.文件不存在
if(!ifs.is_open())
{
//cout<<"文件不存在"<<endl;
this->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<<"文件空"<<endl;
this->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<<"职工人数为"<<num<<"人"<<endl;
this->m_EmpNum=num;
//开辟空间
this->m_EmpArray=new Worker*[this->m_EmpNum];
// 存放到空间
this->Init_Emp();
/******************下面是测试代码****************************/
// for (int var = 0; var < this->m_EmpNum; ++var) {
// cout<<this->m_EmpArray[var]->m_name<<endl;
// }
}
WorkerManager::~WorkerManager()
{
if(this->m_EmpArray!=NULL)
{
for(int i=0;i<this->m_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<<"确定清空?"<<endl;
cout<<"1.确定"<<endl;
cout<<"2.不确定"<<endl;
int select =0;
cin>>select;
if(select == 1)
{
ofstream ofs(FILENAME,ios::trunc);//删除并重新创建
ofs.close();
if(this->m_EmpArray!=NULL)
{
//删除职工对象
for(int i=0;i<m_EmpNum;i++)
{
delete this->m_EmpArray[i];
this->m_EmpArray[i]=NULL;
}
delete [] this->m_EmpArray;
this->m_EmpArray=NULL;
this->m_EmpNum=0;
this->IsFile_Empty=true;
}
cout<<"清空成功"<<endl;
}
system("pause");
system("cls");
}
//排序职工,选用的方法是选择排序
void WorkerManager::Sort_Emp()
{
if(this->IsFile_Empty)
{
cout<<"文件是不存在的,或者记录为空"<<endl;
system("pause");
system("cls");
}else
{
cout<<"请选择排序的方式:"<<endl;
cout<<"1:职工号升序"<<endl;
cout<<"2:职工号降序"<<endl;
int select =0;
cin>>select;
//开始实现排序功能
for(int i=0;i<m_EmpNum;i++)
{
int MinOrMax=i;//声明最小值或者最大值
for(int j=i+1;j<this->m_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<<"排序成功!其结果为:"<<endl;
this->Save_File();//存储结果
this->Show_Emp();
}
}
//查找员工函数
void WorkerManager::Find_Emp()
{
int val=0;
if(this->IsFile_Empty)
{
cout<<"文件不存在或记录为空!"<<endl;
}else
{
bool flage = false;//通过姓名查找的标志位
//用来判断员工是否存在
cout<<"请输入查找方式:"<<endl;
//提供两种查找方式
cout<<"1.按照职工编号查找"<<endl;
cout<<"2.按照职工姓名查找"<<endl;
cin>>val;
if(val == 1)
{
int id=0;
cout<<"请输入职工编号"<<endl;
cin>>id;
int ret=IsExist(id);
if(ret!= -1)
{
cout<<"通过编号查找到了员工"<<endl;
this->m_EmpArray[ret]->showInfo();//忘了this,使用多态打印信息
flage =true;
}
}else if(val == 2)
{
//按照姓名查询
string name;
cout<<"请输入要查找的姓名"<<endl;
cin>>name;
for(int i=0; i<m_EmpNum;i++ )//遍历查找员工是否存在
{
if(this->m_EmpArray[i]->m_name==name)
{
cout<<"通过姓名查找到了员工"<<endl;
this->m_EmpArray[i]->showInfo();
flage =true;
}
}
}else
{
cout<<"输入选项有误"<<endl;
}
if(flage == false)
{
cout<<"未查找到对应的员工"<<endl;
}
}
system("pause");
system("cls");
}
//修改职工
void WorkerManager::Mod_Emp()
{
if(this->IsFile_Empty)
{
cout<<"文件不存在"<<endl;
}else {
cout<<"请输入修改职工编号"<<endl;
int id;
cin >>id;
int ret=this->IsExist(id);
if(ret!=-1)
{
//找到职工
//将职工从数组中删掉
delete this->m_EmpArray[ret];
int newid=0;
string newname="";
int deselect=0;//新部门编号
cout<<"查找到:"<<id<<"号职工"<<endl;
while (1) {
cout<<"请输入新职工号:"<<endl;
cin>>newid;
if(this->IsExist(newid)!=-1)
{
cout<<"职工编号已存在,请重新输入"<<endl;
}else{
break;
}
}
cout<<"请输入新姓名"<<endl;
cin>>newname;
cout<<"请输入岗位"<<endl;
cout<<"1.普通职工"<<endl;
cout<<"2.经理"<<endl;
cout<<"3.老板"<<endl;
cin>>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<<"修改成功"<<endl;
//保存到文件中
this->Save_File();
}else
{
cout<<"修改失败,查无此人"<<endl;
}
}
//按任意键清屏
system("pause");
system("cls");
}
//删除员工
void WorkerManager::Del_Emp()
{
if(this->IsFile_Empty)
{
cout<<"公司还没招聘员工,删除失败"<<endl;
}else {
cout<<"输入要删除的职工编号"<<endl;
int id=0;
cin>>id;
int index=this->IsExist(id);
if(index == -1)
{
cout<<"未查询到员工,请确认员工编号"<<endl;
}else {
for (int var = index; var < this->m_EmpNum-1; ++var) {
this->m_EmpArray[var]=this->m_EmpArray[var+1];
}
this->m_EmpNum--;
//同步到文件中
this->Save_File();
cout<<"删除成功"<<endl;
}
}
system("pause");
system("cls");
}
//判断职工是否存在
int WorkerManager::IsExist(int id)
{
int index =-1;
for (int var = 0; var < this->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<<"无员工"<<endl;
}else
{ //使用多态完成显示职工功能
for (int var = 0; var < m_EmpNum; ++var) {
this->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;i<this->m_EmpNum;i++) //m_EmpNum职工人数
{
ofs<<this->m_EmpArray[i]->m_id<<" "
<<this->m_EmpArray[i]->m_name<<" "
<<this->m_EmpArray[i]->m_deptid<<endl;//部门编号写入
}
ofs.close();
}
int WorkerManager::MyFlag=0;
//添加职工
void WorkerManager::Add_Emp()
{
int addNum=0;
cout<<"输入添加职工数:"<<endl;
cin>>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<<"请输入第"<<i+1<<"位员工编号"<<endl;
cin>>id;
//有点问题
if( ((id == WorkerManager::MyFlag)||this->IsExist(id)+1 == id))
{
cout<<"员工编号已经存在"<<endl;
}else{
WorkerManager::MyFlag=id;
break;
}
}
cout<<"请输入第"<<i+1<<"位员工姓名"<<endl;
cin>>name;
cout<<"请输入职工岗位:"<<endl;
cout<<"1.普通员工"<<endl;
cout<<"2.经理"<<endl;
cout<<"3.老板"<<endl;
cin>>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"<<endl;
}
//将员工保存到数组中
newSpace[this->m_EmpNum+i]=temp;
}
//释放原有空间,并更新新空间指向
delete [] this->m_EmpArray;//释放数组加[]
this->m_EmpArray=newSpace;
//更新职工人数
this->m_EmpNum=newSize;
cout<<"添加成功"<<addNum<<"名员工"<<endl;
this->IsFile_Empty=false;//修改判空标志位
//保存添加的员工
this->Save_File();
}else
{
cout<<"输入错误"<<endl;
}
system("pause");
system("cls");
}
//退出系统
void WorkerManager::exitSystem()
{
cout<<"已退出系统"<<endl;
system("pause");
exit(0);
}
//显示菜单
void WorkerManager::ShowMenu()
{
cout<<"*************************************"<<endl;
cout<<"******* 职工管理系统 ***************"<<endl;
cout<<"******** 0.退出系统 *****************"<<endl;
cout<<"******** 1.增加职工信息 **************"<<endl;
cout<<"******** 2.显示职工信息 **************"<<endl;
cout<<"******** 3.删除职工信息 **************"<<endl;
cout<<"******** 4.修改职工信息 **************"<<endl;
cout<<"******** 5.查找职工信息 **************"<<endl;
cout<<"******** 6.按照编号排序 **************"<<endl;
cout<<"******** 7.清空所有文档 **************"<<endl;
cout<<"*************************************"<<endl;
cout<<"请输入功能"<<endl;
}
main.cpp
#include <iostream>
#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;
}