(C++)学生管理系统(测试2版)(map数组的应用)(string应用)(引用)(C++教学)(C++项目)

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;
}

关键概念深入解析

  1. map容器

    • 使用红黑树实现的有序关联容器

    • student_map.count(key):检查键是否存在(O(log n))

    • student_map[key]:访问元素(不存在时创建)

    • student_map.erase(key):删除元素

    • student_map.emplace():高效插入

  2. 引用(&)

    • void mod(map<int,student>& student_map)中的&

    • 避免数据拷贝,直接操作原对象

    • 函数内修改会影响调用处的原始数据

  3. 结构化绑定(C++17)

    • for(const auto& [id,s]:student_map)

    • 等价于:

      for(const auto& pair : student_map){
          int id = pair.first;
          student s = pair.second;
          // ...
      }

  4. 格式化输出

    • setw(n):设置字段宽度

    • 需包含<iomanip>头文件

    • 确保列对齐,提高可读性

这个程序展示了使用C++标准库构建控制台应用的核心技术,包括数据结构设计、标准容器使用、输入输出处理和基本错误检查。map的使用是系统的核心,提供了高效的查找和管理功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值