1.问题描述
一个小公司包含四类人员:经理,技术人员,销售人员和销售经理,各类人员的工资计算方法如下:经理:固定月薪(8000);技术人员:月薪按技术等级(1~8)(1600+等级*300); 销售人员:按提成(4%*销售额);销售经理:底薪+提成(1500+0.2%*总销售额);设计一个管理程序,实现对各类人员的信息输入,修改和显示。
2.需求分析
共有6个类,SalesManager,Manager,Technician,Sales这四个类继承于Person类PersonManager类调用这些类内函数。
在菜单界面可以输入1,2,3,4,0来控制该程序,如果输入其他数字会显示输入错误请重新输入。
输入1:打开员工信息添加功能,此时需要输入员工姓名,员工身份证号码(便于查找员工),用数字1,2,3,4分别表示员工等级经理,技术人员,销售经理和销售人员,如果输入其他数字会显示输入错误请重新输入。最后如果是经理输入任意值;如果是技术人员输入技术等级(1~8);如果是销售经理输入销售额;如果是销售人员输入总销售额。功能完成。
输入2:打开人员修改功能,输入需要修改的员工身份证号方便查找,如果找到则重复1的功能对员工进行修改。如果未找到则显示未能找到该员工。
输入3:打开显示员工功能。
输入4:打开保存信息功能。
输入0:退出程序。
输入其他值:显示输入错误请重新输入。
3.详细设计
主函数:
#include"PersonManager.h"
int main() {
PersonManager manager;
manager.run();
return 0;
}
员工类:
在员工类中,有员工的姓名,身份证号,职位属性,可以计算工资。
父类:
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
// 构造函数
Person(string n, int a, string i,int y) {
name = n;
num = a;
id = i;
nu = y;
getsalary(y);
}
// 打印人员信息
virtual void print() {
cout << "姓名:" << name << endl;
cout << "身份证号码:" << id << endl;
cout << "工资:" << salary << endl;
}
// 获取人员类型
virtual string getType() {
return "";
}
// 获取人员信息字符串
virtual string getInfoString() {
return "";
}
void getsalary(int ch)
{
switch (ch)
{
case 1:
salary = 8000;
break;
case 2:
salary = 1600 + this->num * 300;
break;
case 3:
salary = this->num * 0.04;
break;
case 4:
salary = 2000 + 1500 + 0.002 * this->num;
break;
default:
cout << "无效选项" << endl;
}
}
string name; // 姓名
int num;
string id;
double salary = 0; // 工资
int nu;
};
销售经理类:
#pragma once
#include"Person.h"
#include <iostream>
using namespace std;
class SalesManager : public Person {
public:
// 构造函数
SalesManager(string n, int a, string i,int y) : Person(n, a, i,y) {}
// 打印人员信息
void print() {
cout << "职位:销售经理" << endl;
Person::print();
}
// 获取人员类型
string getType() {
return "SalesManager";
}
// 获取人员信息字符串
string getInfoString() {
return getType() + "," + name + "," + id + "," + to_string(salary);
}
private:
string name; // 姓名
int num;
string id;
double salary = 0; // 工资
int nu;
};
经理类:
#pragma once
#include"Person.h"
#include <iostream>
using namespace std;
class Manager : public Person {
public:
// 构造函数
Manager(string n, int a, string i,int y) : Person(n, a, i,y) {}
// 打印人员信息
void print() {
cout << "职位:经理" << endl;
Person::print();
}
// 获取人员类型
string getType() {
return "Manager";
}
// 获取人员信息字符串
string getInfoString() {
return getType() + "," + name + "," + id + "," + to_string(salary);
}
private:
string name; // 姓名
int num;
string id;
double salary = 0; // 工资
int nu;
};
技术人员类:
#pragma once
#include"Person.h"
#include <iostream>
using namespace std;
// 定义技术人员类
class Technician : public Person {
public:
// 构造函数
Technician(string n, int a, string i,int y) : Person(n, a, i,y) {}
// 打印人员信息
void print() {
cout << "职位:技术人员" << endl;
Person::print();
}
// 获取人员类型
string getType() {
return "Technician";
}
// 获取人员信息字符串
string getInfoString() {
return getType() + "," + name + "," + id + "," + to_string(salary);
}
private:
string name; // 姓名
int num;
string id;
double salary = 0; // 工资
int nu;
};
销售人员类:
#pragma once
#include"Person.h"
#include <iostream>
using namespace std;
class Sales : public Person {
public:
// 构造函数
Sales(string n, int a, string i,int y) : Person(n, a, i ,y) { }
// 打印人员信息
void print() {
cout << "职位:销售人员" << endl;
Person::print();
}
// 获取人员类型
string getType() {
return "Sales";
}
// 获取人员信息字符串
string getInfoString() {
return getType() + "," + name +"," + id + "," + to_string(salary);
}
private:
string name; // 姓名
int num;
string id;
double salary = 0; // 工资
int nu;
};
员工管理类:
在员工管理类中,可以添加、删除、修改员工信息,查询特定员工的信息。
#pragma once
#include <string>
#include <vector>
#include"Person.h"
using namespace std;
class PersonManager {
private:
vector<Person*> persons; // 人员数组
public:
// 析构函数
~PersonManager();
// 添加人员信息
void addPerson();
// 修改人员信息
void modifyPerson();
// 显示所有人员信息
void showAllPersons();
// 保存人员信息到文件
void saveToFile(string filename);
// 从文件中加载人员信息
void loadFromFile(string filename);
// 显示菜单
void showMenu();
// 运行人员管理系统
void run();
};
具体实现:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include"Person.h"
#include"Manager.h"
#include"Technician.h"
#include"SalesManager.h"
#include "PersonManager.h"
#include"Sales.h"
using namespace std;
PersonManager::~PersonManager() {
for (int i = 0; i < persons.size(); i++) {
delete persons[i];
}
}
// 添加人员信息
void PersonManager::addPerson() {
string name, id;
int age, choice;
//double salary;
cout << "请输入姓名:";
cin >> name;
cout << "请输入身份证号码:";
cin >> id;
cout << "请选择职位(1. 经理 2. 技术人员 3. 销售经理 4.销售人员):";
cin >> choice;
cout << "如果是经理 请输入:任意值 "<<endl<< "如果是技术人员 请输入技术等级" << endl << "如果是销售经理 请输入销售额" << endl << "如果是销售人员请输入总销售额"<<endl;
cin >> age;
switch (choice) {
case 1:
persons.push_back(new Manager(name, age,id, choice));
break;
case 2:
persons.push_back(new Technician(name, age, id, choice));
break;
case 3:
persons.push_back(new SalesManager(name, age, id, choice));
break;
case 4:
persons.push_back(new SalesManager(name, age, id, choice));
break;
default:
cout << "无效选项,请重新输入!" << endl;
}
cout << "添加成功!" << endl;
system("pause");
system("cls");
}
// 修改人员信息
void PersonManager::modifyPerson() {
string id;
cout << "请输入要修改的身份证号码:";
cin >> id;
for (int i = 0; i < persons.size(); i++) {
if (persons[i]->id == id) {
string name;
int num, choice;
//double salary;
cout << "请输入新的姓名:";
cin >> name;
cout << "请选择新的职位(1. 经理 2. 技术人员 3. 销售经理 4.销售人员):";
cin >> choice;
cout << "如果是经理 请输入:任意值 "<<endl<< "如果是技术人员 请输入技术等级 "<<endl << "如果是销售经理 请输入销售额" << endl<<"如果是销售人员请输入总销售额";
cin >> num;
switch (choice) {
case 1:
delete persons[i];
persons[i] = new Manager(name, num, id, choice);
break;
case 2:
delete persons[i];
persons[i] = new Technician(name, num, id, choice);
break;
case 3:
delete persons[i];
persons[i] = new SalesManager(name, num, id, choice);
break;
case 4:
delete persons[i];
persons[i] = new Sales(name, num, id, choice);
break;
default:
cout << "无效选项,请重新输入!" << endl;
}
cout << "修改成功!" << endl;
return;
system("pause");
system("cls");
}
}
cout << "未找到该人员信息!" << endl;
system("pause");
system("cls");
}
// 显示所有人员信息
void PersonManager::showAllPersons() {
for (int i = 0; i < persons.size(); i++) {
persons[i]->print();
cout << endl;
}
system("pause");
system("cls");
}
// 保存人员信息到文件
void PersonManager::saveToFile(string filename) {
ofstream ofs(filename);
if (!ofs) {
cout << "打开文件失败!" << endl;
return;
}
for (int i = 0; i < persons.size(); i++) {
ofs << persons[i]->getInfoString() << endl;
}
ofs.close();
cout << "保存成功!" << endl;
system("pause");
system("cls");
}
// 从文件中加载人员信息
void PersonManager::loadFromFile(string filename) {
ifstream ifs(filename);
if (!ifs) {
cout << "打开文件失败!" << endl;
return;
system("pause");
system("cls");
}
string line;
while (getline(ifs, line)) {
int pos1 = line.find(",");
string type = line.substr(0, pos1);
int pos2 = line.find(",", pos1 + 1);
string name = line.substr(pos1 + 1, pos2 - pos1 - 1);
int pos3 = line.find(",", pos2 + 1);
int age = stoi(line.substr(pos2 + 1, pos3 - pos2 - 1));
int pos4 = line.find(",", pos3 + 1);
string id = line.substr(pos3 + 1, pos4 - pos3 - 1);
int nu = stod(line.substr(pos4 + 1));
if (type == "Manager") {
persons.push_back(new Manager(name, age, id,nu));
}
else if (type == "Technician") {
persons.push_back(new Technician(name, age, id,nu));
}
else if (type == "SalesManager") {
persons.push_back(new SalesManager(name, age, id,nu));
}
}
ifs.close();
cout << "加载成功!" << endl;
system("pause");
system("cls");
}
// 显示菜单
void PersonManager::showMenu() {
cout << "1. 添加人员信息" << endl;
cout << "2. 修改人员信息" << endl;
cout << "3. 显示所有人员信息" << endl;
cout << "4. 保存人员信息到文件" << endl;
cout << "0. 退出" << endl;
}
// 运行人员管理系统
void PersonManager::run() {
int choice;
while (true) {
showMenu();
cout << "请输入选项:";
cin >> choice;
switch (choice) {
case 1:
addPerson();
break;
case 2:
modifyPerson();
break;
case 3:
showAllPersons();
break;
case 4:
saveToFile("persons.txt");
break;
case 0:
cout << "谢谢使用!" << endl;
return;
default:
cout << "无效选项,请重新输入!" << endl;
}
}
};