【大一程序设计基础作业】P243Ex1

题外话,我发现抄题目是个好习惯,它可以让你仔细地读一遍题;为什么这么说呢,因为苯人第一遍写的时候啥都没看,差点交了一份错误的作业,在发csdn时再抄一遍题才发现……

所以我们先读题:

假设某销售公司有一般员工、销售员工和销售经理。

月工资的计算办法是:

一般员工月薪=基本工资;

销售员工月薪=基本工资+销售额*提成率;

销售经理月薪=基本月薪+职务工资+销售额*提成率。

编写程序,定义一个表示一般员工的基类Employee,它包含三个表示员工基本信息得数据成员:编号number,姓名name和基本工资basicSalary。

由Employee类派生表示销售员工的Salesman类,Salesman类包含两个新数据成员:销售额sales和静态数据成员提成率commrate。

再由Salesman类派生表示销售经理的Salesman类。Salesman类包含新数据成员:职务工资jobSalary。

为这些类定义初始化数据的构造函数,以及输入数据input、计算工资pay和是输出工资条print的成员函数。

设一般员工的基本工资是2000元,销售经理的职务工资是3000元,提成率=5/1000,在main函数中,输入若干个不同类型的员工信息测试你的类结构。

读题我们知道要定义几个类,注意一下它们之间的派生继承关系

class Employee
{/*...*/};
class Salesman :public Employee
{/*...*/};
class Salesmanager :public Salesman 
{/*...*/};

 然后按照题目定义相应的数据成员

class Employee
{
protected:
	int number;
	char name[20];
	double basicSalary;
	double salary;
};
class Salesman :public Employee
{
protected:
	double sales=0;
	static double commrate;
};
double Salesman::commrate = 0.005;
class Salesmanager :public Salesman 
{
protected:double jobSalary;
};

这边要注意一下题目要求:Salesman类中的commrate是静态数据成员。由于我们之后要在派生类中访问它,所以记得在类外对它进行一次额外的初始化。

之后就是老生常谈的成员函数编写。这边我们看到题中对basicSalary和jobSalary都给定了值,所以我们可以把它们直接写在构造函数里。

class Employee
{
public:
	Employee()
	{
		basicSalary=2000;
	}
	void input() {
		cout << "请输入编号\n";
		cin >> number;
		cout << "请输入姓名\n";
		cin >> name;
	}
	void Pay()
	{
		salary = basicSalary;
	}
	void Print() {
		cout << "\nnumber:" << number << "\nname:" << name << "\nsalary:" << salary;
	}

};
class Salesman :public Employee
{
public:
	Salesman()
	{	
		commrate =0.005;
	}
	void input()
	{
		Employee::input();
		cout << "请输入销售额\n";
		cin >> sales;
	}
	void Pay()
	{
		salary = sales*commrate+ basicSalary;
	}
};
double Salesman::commrate = 0.005;
class Salesmanager :public Salesman 
{
public:
	void input(){
		Salesman::input();
	}Salesmanager()
	{
		double js = 3000;
		jobSalary=js;
	}
	void Pay()
	{
		salary = sales * Salesman::commrate + basicSalary + jobSalary;
	}
};

这边的input函数虽然是同名的,但是在继承类中会优先屏蔽;但由于本题中派生的两个类也同样需要输入number、name,所以这边用::来访问基类中的input函数,就可以偷懒节省一段代码啦

其实本题中还有一个小细节,就是对于commrate进行初始化时,应该用小数的形式而非分数的形式,因为在c++中(5/1000)的结果会默认返回整形类的值,也就是小数点前的“0”。这样一来你的提成就被老板偷吃了呜呜呜(以下便是没有注意这一点导致打工人的工资被无情地克扣的错误示范)

 至此,本题的大部分难点就迎刃而解了,下面便是最后的完整代码和输入输出样例

 

#include<iostream>
using namespace std;
class Employee
{
protected:
	int number;
	char name[20];
	double basicSalary;
	double salary;
public:
	Employee()
	{
		basicSalary=2000;
	}
	void input() {
		cout << "请输入编号\n";
		cin >> number;
		cout << "请输入姓名\n";
		cin >> name;
	}
	void Pay()
	{
		salary = basicSalary;
	}
	void Print() {
		cout << "\nnumber:" << number << "\nname:" << name << "\nsalary:" << salary;
	}

};
class Salesman :public Employee
{
protected:
	double sales=0;
	static double commrate;
public:
	Salesman()
	{	
		commrate =0.005;
	}
	void input()
	{
		Employee::input();
		cout << "请输入销售额\n";
		cin >> sales;
	}
	void Pay()
	{
		salary = sales*commrate+ basicSalary;
	}
};
double Salesman::commrate = 0.005;
class Salesmanager :public Salesman 
{
protected:double jobSalary=0;
		
public:
	void input(){
		Salesman::input();
	}Salesmanager()
	{
		double js = 3000;
		jobSalary=js;
	}
	void Pay()
	{
		salary = sales * Salesman::commrate + basicSalary + jobSalary;
	}
};
int main()
{
	Employee a;
	Salesman b;
	Salesmanager c;
	a.input();
	b.input();
	c.input();
	a.Pay();
	b.Pay();
	c.Pay();
	a.Print();
	b.Print();
	c.Print();
}

 

 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
由于代码篇幅较长,无法一次性完整呈现,以下是部分代码实现,完整代码可在编程平台上实现: ```c++ #include <iostream> #include <stack> using namespace std; // 二叉树结点结构体定义 struct Node { char data; // 数据域 Node* lchild; // 左孩子指针 Node* rchild; // 右孩子指针 Node(char ch) : data(ch), lchild(NULL), rchild(NULL) {} }; // 递归创建二叉树 void createBTree(Node*& root, string str, int& index) { if (index >= str.length() || str[index] == ')') { root = NULL; return; } root = new Node(str[index]); ++index; createBTree(root->lchild, str, index); ++index; createBTree(root->rchild, str, index); } // 非递归创建二叉树 void createBTree2(Node*& root, string str) { int index = 0; stack<Node*> s; root = NULL; Node* p = root; char ch = str[index]; while (ch != '\0') { switch (ch) { case '(': { s.push(p); p = NULL; break; } case ')': { if (!s.empty()) { p = s.top(); s.pop(); } break; } case ',': { p = NULL; break; } default: { p = new Node(ch); if (root == NULL) { root = p; } if (!s.empty()) { Node* parent = s.top(); if (parent->lchild == NULL) { parent->lchild = p; } else { parent->rchild = p; } } break; } } ++index; ch = str[index]; } } // 递归中序遍历 void inorder(Node* root) { if (root == NULL) { return; } inorder(root->lchild); cout << root->data << " "; inorder(root->rchild); } // 非递归中序遍历(利用线索化) void inorderThreading(Node* root) { if (root == NULL) { return; } stack<Node*> s; Node* p = root; while (p != NULL) { s.push(p); p = p->lchild; } while (!s.empty()) { p = s.top(); s.pop(); cout << p->data << " "; if (p->rchild != NULL) { p = p->rchild; while (p != NULL) { s.push(p); p = p->lchild; } } } } int main() { // 由括号表示法创建二叉树 string str = "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"; Node* root = NULL; int index = 0; createBTree(root, str, index); // 输出二叉树 cout << "二叉树b采用凹入表示法为:" << endl; // 待实现 // 输出'H'节点的左右孩子结点值 if (root != NULL && root->lchild != NULL && root->lchild->rchild != NULL) { cout << "H节点的左孩子结点值为:" << root->lchild->rchild->data << endl; } if (root != NULL && root->lchild != NULL && root->lchild->lchild != NULL) { cout << "H节点的右孩子结点值为:" << root->lchild->lchild->data << endl; } // 输出二叉树高度 int height = 0; // 待实现 // 释放二叉树 // 待实现 // 先序序列和中序序列重新构造二叉树,并输出括号表示法 // 待实现 // 中序线索化二叉树 // 待实现 // 非递归遍历中序线索化二叉树并输出中序序列 // 待实现 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值