(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结构化绑定遍历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;
}

关键概念深入解析

  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的使用是系统的核心,提供了高效的查找和管理功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89724.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用assembly解决jar包超大,实现依赖包、前端资源外置部署

成果物需要部署到用户内网的童鞋应该都遇到过该问题&#xff1a;引入的maven依赖越来越多&#xff0c;jar包越来越大&#xff0c;我之间甚至见过一两个G的依赖&#xff0c;想改个代码换到现场测试&#xff0c;包传到现场要一二十分钟&#xff0c;真正实现了改代码两分钟分钟&am…

基于PHP+MySQL实现(Web)英语学习与测试平台

数据库课设&#xff1a;英语学习与测试平台 运行环境要求 PHP7.1 基于 thinkPHP6.0、Layui、Xadmin 开发 主要功能 公共模块 登录注册个人信息修改密码修改 教师模块 文章查看发布班级管理测试查看发布批改历史成绩查看 学生模块 文章查看参与测试查看成绩 管理员模块…

WinForm中Settings.settings和app.config修改后信息不同步到exe.config问题

在 WinForms 项目中&#xff0c;Settings.settings 和 app.config/exe.config 的关系确实容易让人困惑。以下是问题的根本原因和解决方案&#xff1a; 问题本质 设计时文件&#xff1a;app.config&#xff08;源码中的配置文件&#xff09;运行时文件&#xff1a;bin/Debug/Yo…

【公司环境下发布个人NPM包完整教程】

&#x1f3e2; 公司环境下发布个人NPM包完整教程 创建时间: 2025年7月2日 适用场景: 公司电脑&#xff0c;需要临时切换个人账户发布npm包 &#x1f3af; 教程概述 场景说明 环境: 公司电脑&#xff0c;已配置公司npm账户目标: 临时使用个人账户发布npm包&#xff0c;发布后恢复…

渗透测试中 phpinfo() 的信息利用分析

在渗透测试中&#xff0c;phpinfo() 是一个非常常见却极具价值的信息泄露点。这个函数的本意是向开发者展示当前 PHP 环境的详细配置情况&#xff0c;包括编译选项、扩展模块、环境变量、系统信息、目录路径等。然而一旦该页面被暴露到互联网上&#xff0c;攻击者便可以借此收集…

《如何在 Spring 中实现 MQ 消息的自动重连:监听与发送双通道策略》

大家好&#xff0c;我是G探险者&#xff01;&#x1f4cc; 背景场景在高可用分布式系统中&#xff0c;我们经常面临&#xff1a;MQ 集群重启 → 消息监听中断MQ 网络短暂抖动 → 发送端连接失败一端恢复正常&#xff0c;另一端仍处于挂死状态如果你只配置了“连接工厂层”的重连…

OpenCV 安装使用教程

一、OpenCV 简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉和机器学习软件库&#xff0c;提供了超过 2500 个优化的算法&#xff0c;用于实时图像处理、视频分析、对象识别、人脸检测、机器学习等任务。 Python 提供了对 Open…

【SNN脉冲神经网络3】HH神经元软件仿真

本篇文章主要核心目的在于研究明白HH神经元的数学模型&#xff0c;并且验证其正确性。因此&#xff0c;在本篇文章中只会使用numpy函数库用于构建神经元&#xff0c;以及matplotlib用于绘图。1.导入对应的库import numpy as np import matplotlib.pyplot as plt import re impo…

「日拱一码」014 Python常用库——Pandas

目录 数据结构 pandas.Series &#xff1a;一维数组&#xff0c;类似于数组&#xff0c;但索引可以是任意类型&#xff0c;而不仅仅是整数 pandas.DataFrame &#xff1a;二维表格型数据结构&#xff0c;类似于 Excel 表格&#xff0c;每列可以是不同的数据类型 数据读取与写…

狂命爆肝21天,共51K字的JAVA学习笔记奉上,JAVA从入门到精通一文搞定,一文在手JAVA无忧

背景知识 Java 相关概念 JavaSE (Java Standard Edition): 基础版&#xff0c;用于开发桌面应用程序。JavaEE (Java Enterprise Edition): 企业版&#xff0c;用于开发企业级应用程序。JavaME (Java Micro Edition): 微型版&#xff0c;用于开发嵌入式系统和移动设备应用程序…

Dijkstra 算法#图论

Dijkstra 算法 算法前提&#xff1a;在没有负边的情况下使用。算法思路&#xff1a;将结点分成已确定最短路长度的点集 S 和未确定最短路长度的点集 T&#xff0c;每次从 T 集合中选取最短路长度最小的结点移到 S 集合中&#xff0c;并对其出边执行更新操作 从T集合中&#x…

开源与闭源大模型的生态与技术对比:以百度文心4.5开源为视角

技术对比&#xff1a;开源与闭源大模型的优劣势 性能对比&#xff1a;算力效率与场景适配的博弈 在模型性能的竞技场上&#xff0c;开源与闭源大模型呈现出明显的差异化特征。以百度文心4.5开源系列为例&#xff0c;其47B参数的混合专家&#xff08;MoE&#xff09;模型在飞桨…

企业电商解决方案哪家好?ZKmall模块商城全渠道支持 + 定制化服务更省心

在数字化浪潮席卷各行各业的当下&#xff0c;企业要想拓展市场、提升竞争力&#xff0c;搭建专属电商平台已经成了绕不开的选择。但市场上的电商解决方案五花八门&#xff0c;怎么才能挑到真正适合自己的&#xff1f;其实道理很简单&#xff1a;能同时搞定全渠道支持和定制化服…

使用哪种语言的人更容易通过面试?

Ruby 和 Swift&#xff01;似乎语言越大众面试通过率越低&#xff0c;毕竟岗位数量有限&#xff0c;Java 和 C 程序员所面对的竞争也会更加激烈。使用 Ruby 和 Swift 的程序员比例到底怎么样&#xff1f;我们可以从 Google Trends 中发现一些蛛丝马迹。最火热的 Java 的热度平均…

Axios 二次封装高级教程(含请求取消等功能)

Axios 二次封装高级教程&#xff08;含请求取消等功能&#xff09; 整理不易&#xff0c;收藏、点赞、关注哦&#xff01; 一、总体架构设计 目的&#xff1a;构建一套功能完善、易用且健壮的 HTTP 请求封装层 核心功能&#xff1a; 请求拦截、响应拦截请求取消&#xff08;防…

MobileNet V1的Pytorch实现并加载预训练模型进行验证

一. 环境 windonws 11RTX5060CUDA 12.8Pytorch 2.9.0dev20250630cu128torchvision 0.23.0dev20250701cu128 二. 代码 基于Mobilenet-CustomData 的Mobilenet_Pretrain.ipynb 1. 定义Mobile Net V1 import os import time import torch import torch.nn as nn import torch…

HTTP协议利用TCP的特性来实现长连接

在讨论网络协议时,经常会有人提出这样一个问题:“既然HTTP是基于TCP的,而TCP本身支持长连接,为什么HTTP不支持长连接?”这种说法其实是一种误解。实际上,HTTP确实可以并且经常使用长连接(也称为持久连接)。 什么是长连接? 首先,我们需要明确什么是“长连接”。在网…

整流电路Multisim电路仿真实验汇总——硬件工程师笔记

目录 1 整流电路基础 1.1 整流电路基本原理 1.2 整流电路的类型 1.2.1 单相整流电路 1.2.2 三相整流电路 1.3 整流电路的应用 1.3.1 直流电源 1.3.2 电池充电器 1.3.3 变频调速系统 1.34 电解和电镀 1.4 整流电路的优缺点 1.4.1 优点 1.4.2 缺点 2 二极管整流电路…

LangChain 全面入门

什么是 LangChain&#xff1f; LangChain 是一个专门为 大语言模型 (LLM) 应用开发设计的开源框架&#xff0c;帮你快速实现&#xff1a; • 多轮对话 • 知识库问答 (RAG) • 多工具协同调用 (function calling / tool) • 智能体 Agent 自动决策任务链 解耦 LLM 接口、Prom…

RabbitMQ 高级特性之消息确认

1. 简介 RabbitMQ 的消息发送流程&#xff1a; producer 将消息发送给 broker&#xff0c;consumer 从 broker 中获取消息并消费 那么在这里就涉及到了两种消息发送&#xff0c;即 producer 与 broker 之间和 consumer 与 broker 之间。 “消息确认” 讨论的是 consumer 与…