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

源代码:

#include   // 输入输出流库,提供cin/cout等基本I/O功能
#include        // 映射容器库,提供map数据结构(键值对集合)
#include     // 字符串库,提供string类及字符串操作
#include    // 输入输出格式化库,提供setw等格式化控制
using namespace std; // 使用标准命名空间,避免写std::前缀

// 定义学生结构体:包含多个相关数据的复合类型
struct student{
    string name;  // 学生姓名(字符串类型)
    string sex;   // 学生性别(字符串)
    int age;      // 学生年龄(整数)
    int score;    // 学生成绩(整数)
    string tele;  // 电话号码(字符串)
};

// 菜单显示函数
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 << "请输入你的选择: ";  // 提示用户输入
}

// 添加学生函数
void add(map& student_map){  // &表示引用参数(直接操作原对象)
    cout << "请输入学生相关信息:" << endl;
    int id;        // 学生ID(键)
    student s;     // 临时学生对象
    
    cout << "ID:";
    cin >> id;     // 从键盘读取整数ID
    
    cout << "姓名:";
    cin >> s.name; // 读取姓名到结构体的name成员
    
    cout << "性别:";
    cin >> s.sex;  // 读取性别
    
    cout << "年龄:";
    cin >> s.age;  // 读取年龄
    
    cout << "成绩:";
    cin >> s.score; // 读取成绩
    
    cout << "电话:";
    cin >> s.tele;  // 读取电话
    
    // 将id和学生对象插入map
    student_map.emplace(id, s);  // emplace直接构造元素(高效)
    cout << "添加成功!" << endl;
}

// 显示所有学生函数
void display(map& student_map){
    if (student_map.empty()) {  // 检查map是否为空
        cout << "暂无学生记录!" << endl;
        return;  // 提前退出函数
    }
    
    cout << "\n===== 所有学生列表 =====" << endl;
    // 设置表头格式:setw(5)表示占5字符宽度
    cout << setw(5) << "ID" << setw(10) << "姓名" << setw(5) << "性别"
         << setw(5) << "年龄" << setw(5) << "成绩" << setw(15) << "电话" << endl;
    
    // 遍历map中的所有元素
    for(const auto& [id,s] : student_map){  // C++17结构化绑定
        // auto:自动类型推导(此处推导为pair)
        // [id,s]:将键解包到id,值解包到s
        // const&:只读引用(避免拷贝)
        
        // 格式化输出每个字段
        cout << setw(5) << id       // 输出ID(5字符宽)
             << setw(10) << s.name  // 输出姓名(10字符宽)
             << setw(5) << s.sex    // 输出性别
             << setw(5) << s.age    // 输出年龄
             << setw(5) << s.score  // 输出成绩
             << setw(15) << s.tele  // 输出电话(15字符宽)
             << endl;
    }
}

int main(){
    map student_map;  // 创建map容器:键为int,值为student结构体
    int choice;  // 存储用户菜单选择
    
    while(true){  // 无限循环(直到选择退出)
        menu();   // 显示菜单
        cin >> choice;  // 读取用户选择
        
        switch (choice) {  // 根据选择执行不同操作
            case 0:  // 退出
                cout << "感谢使用,再见" << endl;
                return 0;  // 结束程序(退出码0)
            
            case 1:  // 添加学生
                add(student_map);  // 调用添加函数
                break;  // 跳出switch
                
            case 2:  // 查询(暂未实现)
                // 预留实现位置
                break;
                
            case 5:  // 显示所有学生
                display(student_map);
                break;
                
            default:  // 无效输入处理
                cout << "无效选项,请重新输入!" << endl;
                break;
        }
    }
    return 0;  // 程序正常结束
}

 代码详解:

关键概念深入解释

引用(&)

  • 作用:创建变量的别名

  • 示例map& student_map

  • 原理:引用不复制数据,而是直接操作原始变量

  • 优点

    • 避免大数据拷贝的开销

    • 函数内修改会影响原始变量

  • 对比:不使用引用时,函数会创建参数的副本

auto关键字

  • 作用:自动类型推导

  • 示例const auto& [id,s]

  • 原理:编译器根据赋值表达式右侧推导类型

  • 优点

    • 简化复杂类型声明

    • 提高代码可读性

    • 避免类型书写错误

  • 适用场景

    • 迭代器类型

    • 模板编程

    • 复杂类型声明

结构化绑定(C++17)

  • 作用:解包复合类型

  • 示例[id,s]解包map元素

  • 等价代码

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

    • 代码更简洁

    • 避免直接操作first/second

    • 提高可读性

map容器

  • 特性

    • 键值对存储(key-value)

    • 按键自动排序

    • 快速查找(O(log n))

  • 常用操作

    • emplace(): 高效插入

    • find(): 查找元素

    • erase(): 删除元素

    • size(): 元素数量

    • empty(): 判空

格式化输出

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

  • left/right:设置对齐方式

  • setprecision(n):设置浮点数精度

  • fixed:固定小数点格式

  • 使用要求:需包含头文件

注释详解:

// 包含输入输出流库 - 提供cin(标准输入)和cout(标准输出)等功能
//  是C++标准库的一部分,用于处理控制台输入输出
#include 

// 包含映射容器库 - 提供map数据结构
// map是键值对(key-value)容器,可高效存储和检索数据
#include 

// 包含字符串库 - 提供string类及相关操作
// string比C语言字符数组更安全、更方便
#include 

// 包含输入输出格式化库 - 提供setw等格式化控制符
// 用于控制输出格式(如列宽、对齐方式等)
#include 

// 使用标准命名空间 - 避免每次调用标准库函数时写"std::"
// 例如可直接写cout而不是std::cout
using namespace std;

// 定义学生结构体 - 将多个相关数据组合成自定义类型
// struct是C++中创建自定义数据类型的基本方式
struct student{
    string name;  // 学生姓名 - 字符串类型
    string sex;   // 学生性别 - 字符串类型
    int age;      // 学生年龄 - 整型(4字节)
    int score;    // 学生成绩 - 整型
    string tele;  // 电话号码 - 字符串类型
};

// 菜单显示函数 - 无参数无返回值(void)
void menu(){
    // 输出菜单标题 - \n是换行符
    cout << "\n===== 学生成绩管理系统 =====" << endl;  
    // endl = end line,换行并刷新输出缓冲区
    cout << "1. 添加学生成绩" << endl;  
    cout << "2. 查询学生成绩" << endl;
    cout << "3. 修改学生成绩" << endl;
    cout << "4. 删除学生记录" << endl;
    cout << "5. 显示所有学生成绩" << endl;
    cout << "6. 统计分析" << endl;
    cout << "0. 退出系统" << endl;
    cout << "请输入你的选择: ";  // 提示用户输入选择
}

// 添加学生函数 - 参数是map的引用(&)
// &表示引用 - 直接操作原始map而非副本
void add(map& student_map){
    cout << "请输入学生相关信息:" << endl;
    int id;        // 局部变量 - 学生ID(键)
    student s;     // 局部变量 - 学生结构体实例
    
    cout << "ID:";
    cin >> id;     // 从标准输入读取整数到id变量
    
    cout << "姓名:";
    cin >> s.name; // 读取字符串到结构体的name成员
    
    cout << "性别:";
    cin >> s.sex;  // 读取性别
    
    cout << "年龄:";
    cin >> s.age;  // 读取整数到age
    
    cout << "成绩:";
    cin >> s.score; // 读取成绩
    
    cout << "电话:";
    cin >> s.tele;  // 读取电话号码
    
    // 将id和学生插入map
    // emplace()直接在容器内构造元素,比insert更高效
    student_map.emplace(id, s);  
    cout << "添加成功!" << endl; // 操作反馈
}

// 显示所有学生函数
void display(map& student_map){
    // 检查map是否为空 - empty()是map的成员函数
    if (student_map.empty()) {  
        cout << "暂无学生记录!" << endl;
        return;  // 提前退出函数
    }
    
    cout << "\n===== 所有学生列表 =====" << endl;
    // 输出表头 - setw(5)设置字段宽度为5字符
    cout << setw(5) << "ID" << setw(10) << "姓名" << setw(5) << "性别"
         << setw(5) << "年龄" << setw(5) << "成绩" << setw(15) << "电话" << endl;
    
    // 遍历map中的所有元素 - 使用范围for循环
    // const auto& - 自动类型推导+常量引用(高效安全)
    // [id,s] - C++17结构化绑定(将pair解包为id和s)
    for(const auto& [id,s] : student_map){  
        // 格式化输出每个字段
        cout << setw(5) << id       // 输出ID(5字符宽)
             << setw(10) << s.name  // 姓名(10字符宽)
             << setw(5) << s.sex    // 性别
             << setw(5) << s.age    // 年龄
             << setw(5) << s.score  // 成绩
             << setw(15) << s.tele  // 电话(15字符宽)
             << endl; // 每行结束换行
    }
}

// 主函数 - 程序入口点
int main(){
    // 创建map容器 - 键为int(学号),值为student结构体
    map student_map;  
    
    int choice;  // 存储用户菜单选择
    
    // 无限循环 - 直到用户选择退出
    while(true){  
        menu();   // 调用函数显示菜单
        cin >> choice;  // 读取用户输入
        
        // switch语句 - 根据选择执行不同操作
        switch (choice) {  
            case 0:  // 退出选项
                cout << "感谢使用,再见" << endl;
                return 0;  // 结束程序(返回0表示成功)
            
            case 1:  // 添加学生
                add(student_map);  // 调用添加函数
                break;  // 跳出switch
                
            case 2:  // 查询(目前是空实现)
                // TODO标记 - 表示需要后续实现
                break;
                
            case 5:  // 显示所有学生
                display(student_map); // 调用显示函数
                break;
                
            default:  // 处理无效输入
                // 输出错误提示
                cout << "无效选项,请重新输入!" << endl;
                break;
        }
    }
    return 0;  // 程序正常结束
}

注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!

你可能感兴趣的:(C++基础教学,STL,C++,C++项目,c++,算法,开发语言,数据结构,后端)