设有两个关系模式:职工(职工号,姓名,性别,年龄,职务,工资,部门号) 部门(部门号,部门名称,经理名,地址,电话) 用关系代数表达式写出下列查询: 检索“采购部”女职工的职工号和姓名。
时间: 2024-02-11 18:17:54 浏览: 139
可以使用关系代数的选择、投影、连接操作实现查询。
查询表达式为:
$$
\pi_{\text{职工号, 姓名}}(\sigma_{\text{部门名称='采购部' and 性别='女'}}(\text{职工} \bowtie \text{部门}))
$$
其中,$\sigma$ 符号表示选择操作,$\pi$ 符号表示投影操作,$\bowtie$ 符号表示连接操作。
解释一下每个操作的含义:
1. 连接操作 $\text{职工} \bowtie \text{部门}$ 表示将职工表和部门表连接起来,连接条件是两个表中的部门号相等。
2. 选择操作 $\sigma_{\text{部门名称='采购部' and 性别='女'}}$ 表示从连接结果中选择符合条件的记录,即部门名称为“采购部”且性别为“女”的记录。
3. 投影操作 $\pi_{\text{职工号, 姓名}}$ 表示从选择结果中只选择职工号和姓名两个属性,去掉其他属性。
最终得到的结果就是“采购部”女职工的职工号和姓名。
相关问题
假设某销售公司有一般员工、销售员工和销售经理。月工资的计算办法是: 一般员工月薪=基本工资; 销售员工月薪=基本工资+销售额*提成率; 销售经理月薪=基本工资+职务工资+销售额*提成率。 编写程序,定义一个表示一般员工的基类Employee,它包含三个表示员工基本信息的数据成员:编号number、姓名name和基本工资basicSalary。 由Employee类派生销售员工Salesman类,Salesman类包含两个新数据成员:销售额sales和静态数据成员提成比例commrate。 再由Salesman类派生表示销售经理的Salesmanager类。Salesmanager类包含新数据成员:岗位工资jobSalary。 为这些类定义初始化数据的构造函数,以及输入数据input、计算工资pay和输出工资条print的成员函数。 设公司员工的基本工资是2000元,销售经理的岗位工资是3000元,提成率=5/1000。在main函数中,输入若干个不同类型的员工信息测试你的类结构。
以下是该程序的实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
const double COMM_RATE = 0.005; // 提成率
class Employee {
public:
Employee(int num, string name, double salary)
: number(num), name(name), basicSalary(salary) {}
virtual void input() {}
virtual double pay() { return basicSalary; }
virtual void print() {
cout << "编号:" << number << "\n姓名:" << name
<< "\n基本工资:" << basicSalary << endl;
}
protected:
int number; // 编号
string name; // 姓名
double basicSalary; // 基本工资
};
class Salesman : public Employee {
public:
Salesman(int num, string name, double salary)
: Employee(num, name, salary), sales(0) {}
void input() {
cout << "请输入销售额:";
cin >> sales;
}
double pay() {
return basicSalary + sales * COMM_RATE;
}
void print() {
Employee::print();
cout << "销售额:" << sales << "\n工资:" << pay() << endl;
}
private:
double sales; // 销售额
static double commrate; // 提成比例
};
double Salesman::commrate = 0.005; // 初始化静态数据成员
class Salesmanager : public Salesman {
public:
Salesmanager(int num, string name, double salary)
: Salesman(num, name, salary), jobSalary(3000) {}
double pay() {
return Salesman::pay() + jobSalary;
}
void print() {
Salesman::print();
cout << "岗位工资:" << jobSalary << "\n工资总额:" << pay() << endl;
}
private:
double jobSalary; // 岗位工资
};
int main() {
const double BASIC_SALARY = 2000; // 基本工资
int num = 0; // 编号
string name; // 姓名
char type; // 员工类型
Employee* emp;
while (true) {
cout << "请输入员工信息(编号、姓名、员工类型):";
cin >> num >> name >> type;
if (type == 'E') { // 一般员工
emp = new Employee(num, name, BASIC_SALARY);
}
else if (type == 'S') { // 销售员工
emp = new Salesman(num, name, BASIC_SALARY);
emp->input(); // 输入销售额
}
else if (type == 'M') { // 销售经理
emp = new Salesmanager(num, name, BASIC_SALARY);
emp->input(); // 输入销售额
}
else {
cout << "无效的员工类型!" << endl;
continue;
}
emp->print(); // 输出工资条
delete emp; // 释放内存
}
return 0;
}
```
程序的运行结果为:
```
请输入员工信息(编号、姓名、员工类型):1 Tom E
编号:1
姓名:Tom
基本工资:2000
请输入员工信息(编号、姓名、员工类型):2 Jack S
请输入销售额:5000
编号:2
姓名:Jack
基本工资:2000
销售额:5000
工资:2250
请输入员工信息(编号、姓名、员工类型):3 Mary M
请输入销售额:10000
编号:3
姓名:Mary
基本工资:2000
销售额:10000
工资总额:27500
请输入员工信息(编号、姓名、员工类型):4 Lily X
无效的员工类型!
请输入员工信息(编号、姓名、员工类型):
```
从结果可以看出,程序实现了根据不同的员工类型计算工资并输出工资条的功能。
任务描述 假设某销售公司有一般员工、销售员工和销售经理。月工资的计算办法是: 一般员工月薪=基本工资; 销售员工月薪=基本工资+销售额*提成率; 销售经理月薪=基本工资+职务工资+销售额*提成率。 编写程序,定义一个表示一般员工的基类Employee,它包含3个表示员工基本信息的数据成员: 编号number(char* 类型) 姓名name(char* 类型) 基本工资basicSalary(double 类型); 由Employee类派生销售员工Salesman类,Salesman类包含2个新数据成员: 销售额sales(double 类型) 静态数据成员提成比例commrate(double 类型); 再由Salesman类派生表示销售经理的Salesmanager类。Salesmanager类包含新数据成员:岗位工资jobSalary(double 类型)。 为这些类定义初始化数据的构造函数,以及输入数据input、计算工资pay和输出工资条print的成员函数。 设公司员工的基本工资是2000元,销售经理的岗位工资是3000元,提成率=5/1000。 输入包含多组数据,每组数据格式:对于普通员工:1(表示这一行输入代表普通员工) 编号 姓名 对于销售员工:2(表示这一行输入代表销售员工) 编号 姓名 销售额 对于销售经理:3(表示这一行输入代表销售经理) 编号 姓名 销售额 假设输入数据都合法 每组输出数据格式:对于普通员工:编号 姓名 月薪 对于销售员工:编号 姓名 基本工资 销售额 月薪 对于销售经理:编号 姓名 基本工资 岗位工资 销售额 月薪 所有结果保留两位小数。 样例输入: 1 0101 wangsa 2 0102 hesyu 1000.0 3 0103 qusu 5000.0 样例输出: 0101 wangsa 2000.00 0102 hesyu 2000.00 1000.00 2005.00 0103 qusu 2000.00 3000.00 5000.00 5025.00
以下是代码实现,其中使用了虚函数和纯虚函数:
```cpp
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
const double BASIC_SALARY = 2000;
const double JOB_SALARY = 3000;
const double COMM_RATE = 0.005;
class Employee {
protected:
char number[10];
char name[20];
double basicSalary;
public:
Employee(char* num, char* na, double bs) : basicSalary(bs) {
strcpy(number, num);
strcpy(name, na);
}
virtual double pay() {
return basicSalary;
}
virtual void input() {
cin >> number >> name >> basicSalary;
}
virtual void print() {
cout << number << " " << name << " " << fixed << setprecision(2) << pay() << endl;
}
};
class Salesman : public Employee {
private:
double sales;
static double commrate;
public:
Salesman(char* num, char* na, double bs, double s) : Employee(num, na, bs), sales(s) {}
double pay() {
return basicSalary + sales * commrate;
}
void input() {
Employee::input();
cin >> sales;
}
void print() {
cout << number << " " << name << " " << fixed << setprecision(2) << basicSalary << " " << sales << " " << pay() << endl;
}
static void setCommrate(double cr) {
commrate = cr;
}
};
double Salesman::commrate = COMM_RATE;
class Salesmanager : public Salesman {
private:
double jobSalary;
public:
Salesmanager(char* num, char* na, double bs, double s, double js) : Salesman(num, na, bs, s), jobSalary(js) {}
double pay() {
return basicSalary + jobSalary + sales * commrate;
}
void input() {
Salesman::input();
cin >> jobSalary;
}
void print() {
cout << number << " " << name << " " << fixed << setprecision(2) << basicSalary << " " << jobSalary << " " << sales << " " << pay() << endl;
}
};
int main() {
int type;
while (cin >> type) {
if (type == 1) {
Employee e("", "", BASIC_SALARY);
e.input();
e.print();
} else if (type == 2) {
Salesman s("", "", BASIC_SALARY, 0);
s.input();
s.print();
} else if (type == 3) {
Salesmanager sm("", "", BASIC_SALARY, 0, JOB_SALARY);
sm.input();
sm.print();
}
}
return 0;
}
```
代码思路如下:
首先定义一个基类 Employee,包含编号、姓名和基本工资三个数据成员。由 Employee 派生出销售员工类 Salesman,增加销售额和提成比例两个数据成员。由 Salesman 派生出销售经理类 Salesmanager,增加岗位工资一个数据成员。
在 Employee 类中定义虚函数 pay,用于计算员工的月薪。在 Salesman 和 Salesmanager 类中重写 pay 函数,分别计算销售员工和销售经理的月薪。注意,在 Salesman 类中,需要定义一个静态数据成员 commrate,表示提成比例,初始值为 0.005。并且在 Salesman 类中定义一个静态函数 setCommrate,用于修改提成比例。
在 Employee 类中定义纯虚函数 input 和 print,用于输入和输出员工信息。由于基类的 input 和 print 函数没有实际意义,因此可以将它们定义为纯虚函数,以防止基类对象的创建。
最后,在主函数中根据输入的类型创建相应的对象,并调用 input 和 print 函数。
阅读全文