2021/6/8
青岛理工大学(陈阳)
本次代码我写的十分繁琐,在这里说声抱歉。后期继续努力学习!
- 实验目的
1. 综合利用面向对象的封装、继承、多态和文件流对象解决较为复杂的实际应用问题;
2. 体验多继承、动态多态等较为复杂的面向对象机制,提高学生学习的高阶性、挑战性和复杂度。
二、实验内容
基于文件的小型公司人员信息管理系统的设计与实现
某小型公司主要有3类人员:经理、兼职技术人员、兼职销售员。这些人员分别具有以下属性。
经理:姓名、编号、固定工资、当月薪水、计算月薪、显示信息;
兼职技术人员:姓名、编号、工作小时、每小时工资额、当月薪水、计算月薪、显示信息;
兼职销售员:姓名、编号、销售额、销售额提成、当月薪水、计算月薪、显示信息。
销售经理:姓名、编号、固定工资、销售额、销售额提成、当月薪水、计算月薪、显示信息。
要求:
(1)人员编号基数为1000,每输入一个人员信息编号顺序加1;
(2)月薪计算办法是经理固定月薪8000元;兼职技术人员按100元/小时领取月薪;兼职销售员按当月销售额的4%提成;销售经理固定月薪5000元,销售提成为所管辖部门当月销售总额的0.5%。
(3)将成员函数displayStatus(显示信息)设置成虚函数。
(4)将void pay()(计算月薪)设置成纯虚函数。
(5)根据以上要求,设计一个基类Employee,然后派生出Technician(兼职技术人员)类、Manager(经理)类、Salesman(兼职销售员)类和Salesmanager(销售经理)类。
(6)每类人员的信息记录在“类名_info.txt”文件中,例如兼职技术人员的信息记录在
Technician_info.txt文件中。能够根据编号对每类人员的信息进行增加、查找、删除和修改。
编程提示:
由于销售经理既是经理又是销售人员,拥有两类人员的属性,因此同时继承Manager类和Salesman类。
由于Salesmanager类的两个基类又有公共基类Employee,为了避免二义性,将Employee类设计为虚基类。
代码如下:
#include<iostream>
#include<fstream> //文件流头文件
#include<string>
using namespace std;
int CountLines(char *filename);
void search(int num);
void look_name(int num);
void txt_delate();
void modify_name();
class Employee //人员基类
{
public:
Employee();
virtual void pay()=0; //纯虚函数,计算月薪
virtual void displayStatus(); //虚函数,展示信息
protected:
string Name;
int No;
static int Next_No;
int number;
};
int Employee::Next_No = 1000; //静态序号
Employee::Employee()
{
cout<<"请输入姓名:";
cin>>Name;
Next_No = Next_No + 1;
No = Next_No;
}
void Employee::displayStatus()
{
cout<<"姓名:"<<Name<<endl;
cout<<"号:"<<No<<endl;
}
class Manager:virtual public Employee //经理
{
public:
Manager();
virtual void pay();
virtual void displayStatus();
protected:
double Fixed_wage;
double Monthly_salary;
};
Manager::Manager()
{
int times;
int num = 0; //缓存数字
string No_after; //string缓存
ifstream in; //创建输入
in.open("info.txt",ios::in); //打开输入口
for(int i = 0;i < CountLines("info.txt");i ++) //每行每行查询
{
int product = 1000; //乘积,每次进入置位
getline(in,No_after); //将一行的数据存入No_after
times = No_after.length(); //获取string长度
for(int u = 0;u < times;u ++)
{
if(((int(No_after[u])) >= 48)&&((int(No_after[u])) <= 57))
{
num = num + ((int(No_after[u])-48)*product);
product = product / 10; //每次减少10倍
}
else if(No_after[u] == '/')
{
break; //退出循环
}
}
// num = ((int(No_after[5])-48)*1000)+((int(No_after[6])-48)*100)+((int(No_after[7])-48)*10)+((int(No_after[8])-48)*1); //类型转换,提取序号
No = num + 1; //赋值序号
num = 0; //执行一个循环后置一
}
in.close();
Fixed_