### ACM程序设计大赛知识点解析
#### 数据库设计与SQL查询
**知识点1:数据库表结构设计**
本题涉及三个表的设计:
1. **Employee_info** 表:存储员工信息。
- **Employee_no (PK)**:员工编号,主键。
- **Department_no (FK)**:部门编号,外键,关联Department_info表。
- **name**:姓名。
- **sex**:性别。
- **phonecode**:电话号码。
- **address**:地址。
2. **Project_info** 表:存储公司项目的相关信息。
- **project_no (PK)**:项目编号,主键。
- **Department_no (FK)**:部门编号,外键,关联Department_info表。
- **Project_name**:项目名称。
- **project_manager (FK)**:项目负责人编号,外键,关联Employee_info表的Employee_no。
3. **Department_info** 表:存储部门信息。
- **Department_no (PK)**:部门编号,主键。
- **name**:部门名称。
- **Department_manager (FK)**:部门负责人编号,外键,关联Employee_info表的Employee_no。
**知识点2:SQL查询**
1. **创建表的SQL语句**
```sql
CREATE TABLE Employee_info (
Employee_no INT PRIMARY KEY,
Department_no INT,
name VARCHAR(50),
sex CHAR(1),
phonecode VARCHAR(20),
address VARCHAR(100),
FOREIGN KEY (Department_no) REFERENCES Department_info(Department_no)
);
CREATE TABLE Project_info (
project_no INT PRIMARY KEY,
Department_no INT,
Project_name VARCHAR(100),
project_manager INT,
FOREIGN KEY (Department_no) REFERENCES Department_info(Department_no),
FOREIGN KEY (project_manager) REFERENCES Employee_info(Employee_no)
);
CREATE TABLE Department_info (
Department_no INT PRIMARY KEY,
name VARCHAR(50),
Department_manager INT,
FOREIGN KEY (Department_manager) REFERENCES Employee_info(Employee_no)
);
```
2. **插入测试数据的SQL语句**
```sql
INSERT INTO Employee_info VALUES (1, 1, '张三', '男', '13611111111', 'A');
-- 其他员工信息类似插入
INSERT INTO Project_info VALUES (1, 1, '《计量支付》', 1);
-- 其他项目信息类似插入
INSERT INTO Department_info VALUES (1, 'IPMS', 3);
-- 其他部门信息类似插入
```
3. **查询1:按性别返回联系方式**
```sql
SELECT
name AS Name,
CASE
WHEN sex = '男' THEN address
ELSE phonecode
END AS Contact_way
FROM Employee_info;
```
4. **查询2:列出所有员工在项目中的任职情况**
```sql
SELECT
e.name AS name,
e.phonecode AS phonecode,
COALESCE(p.Project_name, '') AS Project_name
FROM Employee_info e
LEFT JOIN Project_info p ON e.Employee_no = p.project_manager;
```
5. **查询3:列出所有员工及其所在部门的详细信息**
```sql
SELECT
e.name AS name,
d.name AS Department_name,
dm.name AS Department_Manager_Name,
dm.phonecode AS Department_Manager_Phonecode,
COALESCE(p.Project_name, '') AS Responsible_Project
FROM Employee_info e
JOIN Department_info d ON e.Department_no = d.Department_no
JOIN Employee_info dm ON d.Department_manager = dm.Employee_no
LEFT JOIN Project_info p ON e.Employee_no = p.project_manager;
```
#### 算法与数据结构实现
**知识点3:归并排序算法**
归并排序是一种分而治之的排序算法。其基本思想是将数组分成两半,递归地对这两半进行排序,然后将两个已排序的子数组合并成一个最终排序好的数组。
1. **合并过程**
- 初始化两个指针分别指向两个已排序数组的开头。
- 比较两个指针所指向的元素,将较小的元素放入新的数组中,并移动相应的指针。
- 当一个数组中的所有元素都已经被放入新数组后,将另一个数组剩余的元素依次放入新数组中。
2. **实现示例**
- 分割数组直到每个子数组只有一个元素。
- 合并这些子数组直到得到完全排序的数组。
#### 面向对象编程
**知识点4:多态实现商场收银系统**
1. **类图设计**
- **抽象类 BaseCharge**:定义计费接口。
- **具体类 NormalCharge**:实现正常收费逻辑。
- **具体类 DiscountCharge**:实现打折收费逻辑。
- **具体类 RebateCharge**:实现返利收费逻辑。
2. **计费方式**
- **正常收费**:按商品原价计算。
- **打折收费**:按折扣比例计算。
- **返利收费**:满足一定条件时给予返利。
3. **运行示例**
- 输入商品单价和数量。
- 选择计费方式。
- 输出应付款额和实际付款额。
通过以上分析,我们可以看到该ACM程序设计大赛题目涵盖了数据库设计、SQL查询、排序算法和面向对象编程等多个方面的知识点。这些问题不仅考验了参赛者的理论基础,还要求他们具备一定的实践操作能力。