1. 头文件与命名空间
#include <iostream> // 输入输出流库,提供cin/cout等基本I/O功能
#include <map> // 映射容器库,提供map数据结构(键值对集合)
#include <string> // 字符串库,提供string类及字符串操作
#include <iomanip> // 输入输出格式化库,提供setw等格式化控制
using namespace std; // 使用标准命名空间,避免写std::前缀
2. 学生结构体定义
struct student{string name; // 学生姓名(字符串类型)string sex; // 学生性别(字符串)int age; // 学生年龄(整数)int score; // 学生成绩(整数)string tele; // 电话号码(字符串)
};
-
关键点:定义了一个复合数据类型,用于存储单个学生的所有信息
3. 菜单显示函数
void menu(){cout << "\n===== 学生成绩管理系统 =====" << endl; // \n表示换行cout << "1. 添加学生成绩" << endl; // endl表示换行并刷新缓冲区cout << "2. 查询学生成绩" << endl;cout << "3. 修改学生成绩" << endl;cout << "4. 删除学生记录" << endl;cout << "5. 显示所有学生成绩" << endl;cout << "6. 统计分析" << endl; // 注意:此功能尚未实现cout << "0. 退出系统" << endl;cout << "请输入你的选择: "; // 提示用户输入
}
4. 添加学生功能
void add(map<int,student>& student_map){cout<<"请输入学生相关信息:"<<endl;int id;student s;cout<<"ID:";cin>>id; // 读取学生ID(作为map的键)cout<<"姓名:";cin>>s.name; // 读取姓名到结构体的name成员cout<<"性别:";cin>>s.sex; // 读取性别cout<<"年龄:";cin>>s.age; // 读取年龄cout<<"成绩:";cin>>s.score; // 读取成绩cout<<"电话:";cin>>s.tele; // 读取电话student_map.emplace(id,s); // 将id和学生插入map// emplace()直接在容器内构造元素,比insert更高效cout<<"添加成功!"<<endl; // 操作反馈
}
5. 修改学生信息功能
void mod(map<int,student>& student_map){int a;if (student_map.empty()) { // 检查map是否为空cout << "暂无学生记录!" << endl;return; // 提前退出函数}cout<<"请输入ID:";cin>>a;if(student_map.count(a)==0){ // 检查ID是否存在cout << "暂无该ID记录!" << endl;return;}else{student& s=student_map[a]; // 获取该ID对应学生的引用// 引用(&)允许直接修改原数据而不需复制// 显示当前信息cout << "\n===== 当前学生信息 =====" << endl;cout << "ID:" << a << endl;cout << "姓名:" << s.name << endl;cout << "性别:" << s.sex << endl;cout << "年龄:" << s.age << endl;cout << "成绩:" << s.score << endl;cout << "电话:" << s.tele << endl;// 输入新信息cout<<"请修改学生相关信息:"<<endl;cout<<"姓名:";cin>>s.name; // 直接修改原数据cout<<"性别:";cin>>s.sex;cout<<"年龄:";cin>>s.age;cout<<"成绩:";cin>>s.score;cout<<"电话:";cin>>s.tele;cout<<"修改成功!"<<endl;}
}
6. 查询学生功能
void find(map<int,student>& student_map){int a;if (student_map.empty()) { // 空map检查cout << "暂无学生记录!" << endl;return;}cout<<"请输入ID:";cin>>a;if(student_map.count(a)==0){ // 检查ID存在性cout << "暂无该ID记录!" << endl;return;}else{student& s=student_map[a]; // 获取学生引用// 显示信息cout << "\n===== 学生信息 =====" << endl;cout << "ID:" << a << endl;cout << "姓名:" << s.name << endl;cout << "性别:" << s.sex << endl;cout << "年龄:" << s.age << endl;cout << "成绩:" << s.score << endl;cout << "电话:" << s.tele << endl;}
}
7. 删除学生功能
void del(map<int,student>& student_map){int a;if (student_map.empty()) { // 空map检查cout << "暂无学生记录!" << endl;return;}cout<<"请输入ID:";cin>>a;if(student_map.count(a)==0){ // ID存在性检查cout << "暂无该ID记录!" << endl;return;}else{student& s=student_map[a]; // 获取引用// 显示将被删除的信息cout << "\n===== 当前学生信息 =====" << endl;cout << "ID:" << a << endl;cout << "姓名:" << s.name << endl;cout << "性别:" << s.sex << endl;cout << "年龄:" << s.age << endl;cout << "成绩:" << s.score << endl;cout << "电话:" << s.tele << endl;student_map.erase(a); // 从map中删除键值对// erase()根据键删除元素cout << "删除成功!" << endl;}
}
8. 显示所有学生功能
void display(map<int,student>& student_map){if (student_map.empty()) { // 空map检查cout << "暂无学生记录!" << endl;return;}cout << "\n===== 所有学生列表 =====" << endl;// 设置表头格式:setw(n)设置字段宽度为n字符cout<<setw(5)<<"ID"<<setw(10)<<"姓名"<<setw(5)<<"性别"<<setw(5)<<"年龄"<<setw(5)<<"成绩"<<setw(15)<<"电话"<<endl;// C++17结构化绑定遍历mapfor(const auto& [id,s]:student_map){// [id,s]:将键解包到id,值解包到s// const auto&:自动类型推导+常量引用(高效安全)// 格式化输出cout<<setw(5)<<id // 输出ID(5字符宽)<<setw(10)<<s.name // 姓名(10字符宽)<<setw(5)<<s.sex // 性别(5字符)<<setw(5)<<s.age // 年龄<<setw(5)<<s.score // 成绩<<setw(15)<<s.tele // 电话(15字符宽)<<endl;}
}
9. 主函数
int main(){map<int,student> student_map; // 创建map容器:键为int(学号),值为student结构体int choice; // 存储用户菜单选择// 主循环while(true){ // 无限循环(直到选择退出)menu(); // 显示菜单cin >> choice; // 读取用户选择switch (choice) { // 根据选择执行不同操作case 0: // 退出cout <<"感谢使用,再见"<< endl;return 0; // 结束程序case 1: // 添加add(student_map);break;case 2: // 查询find(student_map);break;case 3: // 修改mod(student_map);break;case 4: // 删除del(student_map);break;case 5: // 显示所有display(student_map);break;default: // 无效输入处理// 建议添加错误提示cout << "无效选项,请重新输入!" << endl;break;}}return 0;
}
关键概念深入解析
-
map容器:
-
使用红黑树实现的有序关联容器
-
student_map.count(key)
:检查键是否存在(O(log n)) -
student_map[key]
:访问元素(不存在时创建) -
student_map.erase(key)
:删除元素 -
student_map.emplace()
:高效插入
-
-
引用(&):
-
void mod(map<int,student>& student_map)
中的&
-
避免数据拷贝,直接操作原对象
-
函数内修改会影响调用处的原始数据
-
-
结构化绑定(C++17):
-
for(const auto& [id,s]:student_map)
-
等价于:
for(const auto& pair : student_map){int id = pair.first;student s = pair.second;// ... }
-
-
格式化输出:
-
setw(n)
:设置字段宽度 -
需包含
<iomanip>
头文件 -
确保列对齐,提高可读性
-
这个程序展示了使用C++标准库构建控制台应用的核心技术,包括数据结构设计、标准容器使用、输入输出处理和基本错误检查。map的使用是系统的核心,提供了高效的查找和管理功能。