C++基础:结构体数组综合训练
- 员工信息处理系统
- 题目描述
- 输入描述
- 输出描述
- 解题思路
- 参考代码
员工信息处理系统
题目描述
在一家企业中,员工信息的准确性和时效性是日常人事管理工作的关键。由于企业员工数量众多,手动统计与更新员工信息不仅耗费大量时间,还容易出现错误。作为企业的技术人员,你准备开发一个专门的信息管理系统来协助人事部门高效完成这项任务。
该系统旨在实现以下核心功能,以全面覆盖员工信息管理的各个方面:
(1)添加员工功能:每当企业迎来新员工时,人事专员可以输入新员工数量,然后快速录入每位新员工的工号 ID、姓名 name、年龄 age、性别 gender 以及业绩评分 score 等关键信息。(注:员工信息具体数据类型可参考示例和数据范围说明)
(2)删除员工功能:面对员工离职或岗位调整的情况,系统可以通过工号快速定位并删除相应员工的信息。
(3)修改员工信息功能:考虑到员工信息可能因各种原因需要更新(如年龄增长、业绩变化等),系统能够通过工号检索到具体员工后,对其信息进行修改。
(4)查询员工信息功能:为了快速获取某位员工的详细信息,系统提供了按工号查询的功能。
(5)统计员工数据功能:系统能够自动计算并展示全体员工的业绩评分平均值。
(6)清空数据功能:随着财年的结束和部分员工的离职,系统提供了清空当前企业所有员工信息的选项。
输入描述
每次操作,只能是下列七个操作中的一个,每次操作将按照操作提示进行输入,数据保证合法。
1、添加员工功能:输入一行 insert n,表示进行添加员工功能,n 表示新加入员工的数量,然后输入 n 行信息,依次为 ID、name、age、gender、score。
2、删除员工功能:输入一行 del ID,表示进行删除工号为 ID 的员工信息。
3、修改员工信息功能:输入一行 update ID,表示进行更新工号为 ID 的员工信息,然后第二行输入员工信息,依次为 ID、name、age、gender、score。
4、查询员工信息功能:输入一行 Find ID,表示查询工号为 ID 的员工信息,然后输出一行,依次为员工的 ID、name、age、gender、score。
5、统计员工数据功能:输入一行 calc,表示统计员工数据,然后输出一行,为当前企业员工业绩的平均值。
6、清空数据功能:输入一行 clear,表示清空,清空表示所有员工信息都被删除。
7、退出系统:输入一行 exit,表示退出系统,此时程序停止执行。
输出描述
每次执行功能 4,输出一行,信息以一个空格分隔,依次为学生的 ID、name、age、gender、score。
每次执行功能 5,输出一行,包含一个数字,保留两位小数,表示平均分。
当执行功能 7,按存储顺序输出所有学生信息,每个学生信息占一行,信息以一个空格分隔,依次为学生的 ID、name、age、gender、score,然后结束程序。
输入样例
insert 5
20000101011 wangcai 15 f 100
20000101012 xiaoqiang 25 m 70
20000101013 xingxing 35 f 67
20000101014 afa 11 f 78
20000101015 aqi 19 m 26
del 20000101013
calc
update 20000101014
20000101014 kaka 12 m 90
Find 20000101015
clear
insert 2
20000101011 wangcai 15 f 100
20000101012 xiaoqiang 25 m 70
exit
输出样例
68.50
20000101015 aqi 19 m 26
20000101011 wangcai 15 f 100
20000101012 xiaoqiang 25 m 70
注意
本题目输入输出量较大,推荐使用更快的输入输出方式,例如:scanf、printf。
数据范围
每组操作数量最多不超过 10001000 次。
添加学生功能中,每次 nn 不超过 2020。
学号 ID 为11位数,姓名 name 长度不超过 1010 且都为小写字母,年龄 age 在 00 到 100100 之间,性别 gender 为 m 或者 f ,信息学成绩 score 为整数,在 00 到 100100 之间。
数据保证学号ID不重复。
解题思路
- 数据结构设计
- 结构体定义:定义 Student 结构体来存储单个学生的信息,包含学号 id、姓名 name、年龄 age、性别 gender 和成绩 score。
- 静态数组存储:使用静态数组 students[20005] 存储所有学生的信息,同时定义全局变量 studentCount 记录当前学生数量,totalScore 记录所有学生的总成绩。
- 功能函数实现
- 添加学生(insertStudents):
- 接收要添加的学生数量 n 作为参数。
- 循环 n 次,每次读取一个学生的学号、姓名、年龄、性别和成绩,并将其存储到数组中。
- 每添加一个学生,更新 studentCount 和 totalScore。
- 删除学生(deleteStudent):
- 接收要删除的学生的学号 id 作为参数。
- 遍历数组,找到学号匹配的学生。
- 从 totalScore 中减去该学生的成绩,将其后的学生信息依次前移覆盖该学生,同时 studentCount 减 1。
- 修改学生信息(updateStudent):
- 接收要修改信息的学生的学号 id 作为参数。
- 遍历数组,找到学号匹配的学生。
- 先从 totalScore 中减去该学生原来的成绩,再读取新的信息并更新到数组中,最后将新成绩累加到 totalScore 中。
- 查找学生信息(findStudent):
- 接收要查找的学生的学号 id 作为参数。
- 遍历数组,找到学号匹配的学生并输出其信息。
- 统计学生数据(calculateAverage):
- 若 studentCount 为 0,输出 0.00。
- 否则,计算并输出 totalScore 除以 studentCount 的结果,保留两位小数。
- 清空数据(clearData):将 studentCount 和 totalScore 重置为 0,相当于清空所有学生信息。
- 输出所有学生信息(printAllStudents):遍历数组,依次输出每个学生的信息。
- 主函数逻辑
- 使用 while (true) 循环不断读取用户输入的操作指令。
- 根据不同的操作指令,执行相应的功能函数:
- 若指令为 insert,读取要添加的学生数量 n,调用 insertStudents 函数。
- 若指令为 del,读取要删除的学生的学号 id,调用 deleteStudent 函数。
- 若指令为 update,读取要修改信息的学生的学号 id,调用 updateStudent 函数。
- 若指令为 Find,读取要查找的学生的学号 id,调用 findStudent 函数。
- 若指令为 calc,调用 calculateAverage 函数。
- 若指令为 clear,调用 clearData 函数。
- 若指令为 exit,调用 printAllStudents 函数输出所有学生信息,然后退出循环,结束程序。
- 输入输出优化
考虑到输入输出量较大,部分输入使用 scanf,部分输出使用 printf 以提高效率。对于字符串输入,使用 cin 处理姓名和性别等信息。同时,使用 std::string 类型存储操作指令,方便进行字符串比较。
参考代码
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
// 定义学生结构体,用于存储学生的各项信息
struct Student {
long long id; // 学生的学号,使用 long long 类型以适应可能较长的学号
string name; // 学生的姓名,使用 string 类型方便处理字符串
int age; // 学生的年龄,使用 int 类型存储整数
string gender; // 学生的性别,使用 string 类型存储 "m" 或 "f" 等字符串
int score; // 学生的信息学成绩,使用 int 类型存储整数
};
// 定义一个静态数组,用于存储学生信息,最多可存储 20005 个学生
Student students[20005];
// 记录当前学生的数量,初始化为 0
int studentCount = 0;
// 记录所有学生的总成绩,初始化为 0
int totalScore = 0;
// 添加学生的函数,参数 n 表示要添加的学生数量
void insertStudents(int n) {
// 循环 n 次,依次输入每个学生的信息
for (int i = 0; i < n; ++i) {
// 学生数量加 1
studentCount++;
// 读取学生的学号
scanf("%lld", &students[studentCount].id);
// 读取学生的姓名
cin >> students[studentCount].name;
// 读取学生的年龄
scanf("%d", &students[studentCount].age);
// 读取学生的性别
cin >> students[studentCount].gender;
// 读取学生的成绩
scanf("%d", &students[studentCount].score);
// 将该学生的成绩累加到总成绩中
totalScore += students[studentCount].score;
}
}
// 删除学生的函数,参数 id 表示要删除的学生的学号
void deleteStudent(long long id) {
// 遍历所有学生,查找要删除的学生
for (int i = 1; i <= studentCount; ++i) {
if (students[i].id == id) {
// 从总成绩中减去要删除学生的成绩
totalScore -= students[i].score;
// 将后面的学生信息依次向前移动,覆盖要删除的学生信息
for (int j = i; j < studentCount; ++j) {
students[j] = students[j + 1];
}
// 学生数量减 1
studentCount--;
// 找到并删除学生后,提前返回
return;
}
}
}
// 修改学生信息的函数,参数 id 表示要修改信息的学生的学号
void updateStudent(long long id) {
// 遍历所有学生,查找要修改信息的学生
for (int i = 1; i <= studentCount; ++i) {
if (students[i].id == id) {
// 从总成绩中减去该学生原来的成绩
totalScore -= students[i].score;
// 读取新的学号
scanf("%lld", &students[i].id);
// 读取新的姓名
cin >> students[i].name;
// 读取新的年龄
scanf("%d", &students[i].age);
// 读取新的性别
cin >> students[i].gender;
// 读取新的成绩
scanf("%d", &students[i].score);
// 将新的成绩累加到总成绩中
totalScore += students[i].score;
// 找到并修改学生信息后,提前返回
return;
}
}
}
// 查找学生信息的函数,参数 id 表示要查找的学生的学号
void findStudent(long long id) {
// 遍历所有学生,查找指定学号的学生
for (int i = 1; i <= studentCount; ++i) {
if (students[i].id == id) {
// 找到学生后,输出该学生的信息
printf("%lld %s %d %s %d\n", students[i].id, students[i].name.c_str(), students[i].age, students[i].gender.c_str(), students[i].score);
// 找到学生后,提前返回
return;
}
}
}
// 统计学生数据的函数,用于计算并输出学生的平均成绩
void calculateAverage() {
// 如果学生数量为 0,输出 0.00
if (studentCount == 0) {
printf("0.00\n");
} else {
// 计算平均成绩并输出,保留两位小数
printf("%.2f\n", (double)totalScore / studentCount);
}
}
// 清空数据的函数,将学生数量和总成绩重置为 0
void clearData() {
studentCount = 0;
totalScore = 0;
}
// 输出所有学生信息的函数,遍历所有学生并输出其信息
void printAllStudents() {
for (int i = 1; i <= studentCount; ++i) {
printf("%lld %s %d %s %d\n", students[i].id, students[i].name.c_str(), students[i].age, students[i].gender.c_str(), students[i].score);
}
}
int main() {
string op; // 用于存储用户输入的操作指令
while (true) {
// 读取用户输入的操作指令
cin >> op;
if (op == "insert") {
int n;
// 读取要添加的学生数量
scanf("%d", &n);
// 调用添加学生的函数
insertStudents(n);
} else if (op == "del") {
long long id;
// 读取要删除的学生的学号
scanf("%lld", &id);
// 调用删除学生的函数
deleteStudent(id);
} else if (op == "update") {
long long id;
// 读取要修改信息的学生的学号
scanf("%lld", &id);
// 调用修改学生信息的函数
updateStudent(id);
} else if (op == "Find") {
long long id;
// 读取要查找的学生的学号
scanf("%lld", &id);
// 调用查找学生信息的函数
findStudent(id);
} else if (op == "calc") {
// 调用统计学生数据的函数
calculateAverage();
} else if (op == "clear") {
// 调用清空数据的函数
clearData();
} else if (op == "exit") {
// 调用输出所有学生信息的函数
printAllStudents();
// 退出循环,结束程序
break;
}
}
return 0;
}