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结构化绑定遍历map
for(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的使用是系统的核心,提供了高效的查找和管理功能。