建站费用报价单,优化电脑的软件有哪些,德州专业网站开发公司,博客网站怎么搭建项目要求#xff1a; 编写一个程序实现小型公司的人员信息管理系统。该公司雇员#xff08;employee#xff09;包括经理#xff08;manager#xff09;#xff0c;技术人员#xff08;technician#xff09;、销售员#xff08;salesman#xff09;和销售部经理 编写一个程序实现小型公司的人员信息管理系统。该公司雇员employee包括经理manager技术人员technician、销售员salesman和销售部经理salesmanager。要求存储这些人员的姓名、编号、级别、当月薪水计算月薪并显示全部信息。 程序要对所有人员有提升级别的功能。为简单起见所有人员的初始级别均为1然后进行升级经理升为4级技术人员和销售部经理升为3级销售员仍为1级。 月薪计算办法是经理拿固定月薪8000元技术人员按每小时100元领取月薪销售员按该当月销售额4%提成销售经理既拿固定月工资也领取销售提成固定月工资为5000元销售提成为所管辖部门当月销售额的5‰。 写在前面
很清楚自己的这个小小的管理系统还存在很多漏洞功能上还有很多地方没有实现例如销售经理手下的人员变动销售部门和其他部门的人员变动每个月销售员销售额都会不同在设置销售员销售额的过程中需要改变对应的销售经理的薪水等等。但是那些虽然能想到却没有实现主要是我这只是一个简单的C课程实验没有精力做的尽善尽美。但是我觉得我在这个过程中已经体会到了面向对象编程的思想魅力觉得数据开始有灵魂了。
这是我第一次真正接触面向对象编程在没有什么指导没怎么设计的情况下做出的这个肯定显得很稚嫩。但是我相信千里之行始于足下我会一直进步下去。
实现过程
很容易想到雇员作为基类其他成员作为派生类。
关键在于如何让销售经理管理手下的人并且能够方便的对销售员进行升级。
我的想法是创建一个销售部门的类所有关于销售的事务都通过销售部门进行管理。销售部门那里有所有销售经理和销售员的详细信息两个对象数组销售经理也有自己管理的销售员的名单。
为了防止存在多个销售部门我使用了单例模式详见博客单例模式简单实现。
同时我们需要对所有的人员进行管理我又创建了一个公司类所有人员都记录在公司中。
类图如下 因为程序比较小我又懒得写cpp文件所以简单起见我就将所有的实现都放在头文件中。虽然这样做不太合适但是在这种自己写的小程序上问题不大。
代码
首先是雇员
#ifndef _EMPLOYEE_H_
#define _EMPLOYEE_H_#includestring
#includeiostream
#includevector
#includewindows.husing namespace std;class employee
{
protected:string name, id;int grade; double salary;
public:employee(){grade 1; salary 0;}string GetName(){return name;}string GetId(){return id;}double GetSalary(){return salary;}
};#endif经理
#ifndef _MANAGER_H_
#define _MANAGER_H_#includeemployee.hclass manager :public employee
{
public:manager(){cout 请输入经理的姓名; cin name;cout 请输入经理的编号; cin id;grade 4; salary 8000;}manager(string _name, string _id){name _name; id _id; grade 4; salary 8000;}void DisInform(){cout 经理 name endl;cout 编号 id endl;cout 薪水 salary endl;}
};#endif
技术人员
#ifndef _TECHNICIAN_H_
#define _TECHNICiAN_H_#includeemployee.hclass technician :public employee
{double worktime;
public:technician(){cout 请输入技术人员的姓名; cin name;cout 请输入技术人员的编号; cin id;cout 请输入工作人员每月的工作时间; cin worktime;grade 3; salary 100 * worktime;}technician(string _name,string _id,double t0){name _name; id _id; worktime t; salary t * 100; grade 3;}void SetTime(double t) { worktime t; salary 100 * t; }void DisInform(){cout 技术人员 name endl;cout 编号 id endl;cout 薪水 salary endl;}
};#endif
销售经理
#ifndef _SALEMANAGER_H_
#define _SALEMANAGER_H_#includeemployee.hclass salemanager :public employee
{double sale;
public:vectorint MSlist;//销售经理管理销售员的名单int MSNum;salemanager(){cout 请输入销售经理的姓名; cin name;cout 请输入销售经理的编号; cin id;grade 3; salary 5000; sale 0; MSNum 0;}salemanager(string _name, string _id){name _name; id _id;grade 3; salary 5000; sale 0; MSNum 0;}salemanager(const salemanager x){name x.name; grade 3; id x.id; salary x.salary; sale x.sale; MSNum x.MSNum;MSlist.assign(x.MSlist.begin(), x.MSlist.end());}void DisInform(){cout 销售经理 name endl;cout 编号 id endl;cout 薪水 salary endl;}void SetSale(double t){sale t; salary t * 0.005;}void AddSale(double t){sale t; salary 0.005 * t;}
};#endif销售员
#ifndef _SALESMAN_H_
#define _SALESMAN_H_#includeemployee.hclass salesman :public employee
{double sale;
public:int M;//该销售员受管辖的销售经理salesman(){cout 请输入销售员的姓名; cin name;cout 请输入销售员的编号; cin id;cout 请输入销售员的销售额; cin sale;grade 1; salary 0.04 * sale;//cout 薪水 salary endl;M -1;}salesman(string _name,string _id,double _sale0){name _name; id _id; sale _sale; grade 1; salary 0.04 * sale; M -1;}salesman(const salesman x) //拷贝构造函数{name x.name; id x.id; M x.M; salary x.salary; sale x.sale; grade 1; }void DisInform(){cout 销售员 name endl;cout 编号 id endl;cout 薪水 salary endl;}void SetSale(double _sale){sale _sale; salary 0.04 * sale;}double GetSale(){return sale;}};#endif销售部门
#ifndef _SALESDEPARTMENTS_H_
#define _SALESDEPARTMENTS_H_#includesalesman.h
#includesalemanager.hclass depart
{depart(){SNum 0; MNum 0; sale 0;}depart(depart ) delete;depart operator(const depart) delete;static depart* p;
public:vectorsalesman Slist; //销售部门所有销售员的名单 int SNum;vectorsalemanager Mlist; //销售部门所有销售经理的名单int MNum;double sale;//总的销售额static depart* GetDepart(){if (p nullptr) p new depart;return p;}static void DelDepart(){delete p; p nullptr;}void AddSaleForManager(salemanager x){cout 请输入该销售经理管理的销售员ID[ESC退出输入] endl;//cin.clear();string _ID;while (1){cin _ID;if (_ID ESC) break;bool flag false;//标记是否存在该销售员for (int i 0; i SNum; i) //在部门销售员列表中查询{if (p-Slist[i].GetId() _ID)//找到该销售员{p-Mlist[MNum - 1].MSlist.push_back(i);//将该销售员加入到销售经理的名单中 p-Mlist[MNum - 1].MSNum;p-Mlist[MNum - 1].AddSale(p-Slist[i].GetSale());//改变销售经理当月的销售额 p-Slist[i].M MNum - 1;//记录该销售员对应的销售经理flag true; break;//标记找到了并退出查找}}if (!flag)//没有找到{cout 对不起该销售员没有登记请先到管理部门登记 endl;}//cin.clear();}}void CreatNewManager(){p-Mlist.push_back(salemanager()); MNum;AddSaleForManager(p-Mlist[MNum - 1]); //为该销售经理添加销售员}void UpgradeManger(string _name,string _Id){p-Mlist.push_back(salemanager(_name, _Id)); MNum;AddSaleForManager(p-Mlist[MNum - 1]); //为该销售经理添加销售员}void CreatNewManager(int x){while (x--){p-Mlist.push_back(salemanager()); MNum;AddSaleForManager(p-Mlist[MNum - 1]); //为该销售经理添加销售员}}void CreatNewSales(){p-Slist.push_back(salesman()); SNum;}void CreatNewSales(int x){while (x--){p-Slist.push_back(salesman()); SNum;}}};depart* depart::p nullptr;
#endif公司的类
#ifndef _COMPANY_H_
#define _COMPANY_H_#includemanager.h
#includesalemanager.h
#includesalemanager.h
#includesalesdepartment.h
#includesalesman.h
#includetechnician.hclass company
{int num 0;//公司人数
public:vectormanager MMList; int MMNum;vectortechnician TList; int TNum;int t;company(){system(cls);cout 创建公司 endl;cout 请输入经理人数; cin MMNum; num MMNum;for (int i 0; i MMNum; i){MMList.push_back(manager());}system(cls);cout 创建公司 endl;cout 请输入技术人员人数; cin TNum; num TNum;for (int i 0; i TNum; i){TList.push_back(technician());}system(cls);cout 创建公司 endl;depart* Dpdepart::GetDepart(); //创建销售部门cout 请输入销售员人数; cin t; num t; Dp-CreatNewSales(t);system(cls);cout 创建公司 endl;cout 请输入销售经理的人数; cin t; num t; Dp-CreatNewManager(t);}void DisplayManager(){system(cls);cout 公司经理信息endl;for (int i 0; i MMNum; i){MMList[i].DisInform();}system(pause);}void DisplayTechnician(){system(cls);cout 公司技术人员信息 endl;for (int i 0; i TNum; i){TList[i].DisInform();}system(pause);}void DisplaySale(){system(cls);cout 公司销售员信息 endl;depart* Dp depart::GetDepart();for (int i 0; i Dp-SNum; i){Dp-Slist[i].DisInform();cout 上司姓名 ((Dp-Slist[i].M -1) ? 无 : Dp-Mlist[Dp-Slist[i].M].GetName()) endl;cout 上司编号 ((Dp-Slist[i].M -1) ? 无 : Dp-Mlist[Dp-Slist[i].M].GetId()) endl;}system(pause);}void DisplaySaleManager(){system(cls);cout 公司销售经理信息 endl;depart* Dp depart::GetDepart();for (int i 0; i Dp-MNum; i){Dp-Mlist[i].DisInform();cout 管理销售员名单 endl;for (int j 0; j Dp-Mlist[i].MSNum; j){cout 销售员编号 Dp-Slist[Dp-Mlist[i].MSlist[j]].GetId() \t 销售员姓名 Dp-Slist[Dp-Mlist[i].MSlist[j]].GetName() endl;}}system(pause);}void SalesmanUpgrade()//将销售员升级为销售经理{cout 请输入需要升级的销售员ID[ESC退出输入] endl;cin.clear();string _ID; depart* Dp depart::GetDepart();while (1){cin _ID;if (_ID ESC) break;//cout ok!! endl;bool flag false;salesman* tmp nullptr;int index;for (int i 0; i Dp-SNum; i){if (Dp-Slist[i].GetId() _ID){tmp new salesman(Dp-Slist[i]);index i;flag true; break;}}if (!flag){cout 不存在该销售员! endl;continue;}//删除在销售管理部门和销售经理的名单if (tmp-M ! -1){int num Dp-Mlist[tmp-M].MSNum;for (int i 0; i num; i){if (Dp-Slist[Dp-Mlist[tmp-M].MSlist[i]].GetId() tmp-GetId()){Dp-Mlist[tmp-M].MSlist.erase(Dp-Mlist[tmp-M].MSlist.begin() i);Dp-Mlist[tmp-M].MSNum--;break;}}}Dp-Slist.erase(Dp-Slist.begin() index); Dp-SNum--;//printf(test\n);//将销售员升级为销售经理Dp-UpgradeManger(tmp-GetName(), tmp-GetId());delete tmp;}//cin.clear();system(pause);}~company(){depart::DelDepart();}
};#endif
测试程序
#includecompany.hint main()
{company A;A.DisplayManager();A.DisplayTechnician();A.DisplaySaleManager();A.DisplaySale();A.SalesmanUpgrade();A.DisplaySaleManager();A.DisplaySale();}运行结果 总结
在实现过程中遇到了一些问题主要就是我刚开始读入的时候用的是while(cinx)然后发现后面的读入就会发生异常然后调试了一会发现是cin的问题我上网查到这种输入方式当输入CtrlZ以后会使得cin失效需要用cin.clear()我嫌弃太麻烦就换了一种写法。
还有一个就是我在写对销售员升级的时候总会出错观察代码才发现是在写删去销售员所在销售经理那里它的名字的时候没有判断这个销售员是否有销售经理在管他如果没有的话访问销售经理就会出错。