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;}}};