帮我用c++写一个程序:学生成绩管理系统,并实现以下要求: 定义学生(student)类,其中包括姓名、性别、学号、班级和语文数学英语物理学科的成绩。 设计菜单实现功能选择; 输入功能:输入学生信息,并以txt格式保存到文件中; 计算每个学生的总分与平均分的功能, 按照学生的每一科的功课成绩排序的功能。 按照学生的总成绩排序的功能。 学号修改学生信息的功能; 根据学号删除学生信息的功能; 查询功能: 能够根据学号查询学生信息; 能够根据姓名、班级查询学生信息; 统计学生成绩,按照班级和科目计算平均分。 所有的增加、修改、删除能同步到txt文件;也从txt文件读取数据到程序。

时间: 2024-01-08 16:02:28 浏览: 46
以下是基于C++的学生成绩管理系统的程序代码,包含了您提供的所有功能要求: ```c++ #include <iostream> #include <fstream> #include <iomanip> #include <string> #include <vector> #include <algorithm> using namespace std; // 定义学生类 class Student { public: string name; char gender; string id; string cls; int chinese; int math; int english; int physics; int total_score; // 构造函数 Student(string name, char gender, string id, string cls, int chinese, int math, int english, int physics) { this->name = name; this->gender = gender; this->id = id; this->cls = cls; this->chinese = chinese; this->math = math; this->english = english; this->physics = physics; this->total_score = chinese + math + english + physics; } // 重载小于运算符,用于排序 bool operator < (const Student& st) const { return total_score < st.total_score; } // 输出学生信息 void display() { cout << setw(10) << name << setw(5) << gender << setw(15) << id << setw(10) << cls; cout << setw(5) << chinese << setw(5) << math << setw(5) << english << setw(5) << physics; cout << setw(5) << total_score << endl; } }; // 学生信息管理类 class StudentManager { private: vector<Student> students; // 从文件中读取学生信息 void readFromFile() { ifstream in("students.txt"); if (!in) return; string name, id, cls; char gender; int chinese, math, english, physics; while (in >> name >> gender >> id >> cls >> chinese >> math >> english >> physics) { students.push_back(Student(name, gender, id, cls, chinese, math, english, physics)); } in.close(); } // 将学生信息写入文件 void writeToFile() { ofstream out("students.txt"); for (auto& st : students) { out << st.name << " " << st.gender << " " << st.id << " " << st.cls << " "; out << st.chinese << " " << st.math << " " << st.english << " " << st.physics << endl; } out.close(); } // 根据学号查找学生 Student* findById(string id) { for (auto& st : students) { if (st.id == id) { return &st; } } return nullptr; } public: // 构造函数 StudentManager() { readFromFile(); } // 添加学生 void addStudent() { string name, id, cls; char gender; int chinese, math, english, physics; cout << "请输入学生姓名:"; cin >> name; cout << "请输入学生性别(男/女):"; cin >> gender; cout << "请输入学生学号:"; cin >> id; cout << "请输入学生班级:"; cin >> cls; cout << "请输入学生语文成绩:"; cin >> chinese; cout << "请输入学生数学成绩:"; cin >> math; cout << "请输入学生英语成绩:"; cin >> english; cout << "请输入学生物理成绩:"; cin >> physics; students.push_back(Student(name, gender, id, cls, chinese, math, english, physics)); cout << "学生信息添加成功!" << endl; writeToFile(); } // 修改学生信息 void modifyStudent() { string id; cout << "请输入要修改的学生学号:"; cin >> id; Student* st = findById(id); if (st == nullptr) { cout << "未找到对应的学生信息!" << endl; } else { cout << "请输入新的学生姓名:"; cin >> st->name; cout << "请输入新的学生性别(男/女):"; cin >> st->gender; cout << "请输入新的学生班级:"; cin >> st->cls; cout << "请输入新的学生语文成绩:"; cin >> st->chinese; cout << "请输入新的学生数学成绩:"; cin >> st->math; cout << "请输入新的学生英语成绩:"; cin >> st->english; cout << "请输入新的学生物理成绩:"; cin >> st->physics; st->total_score = st->chinese + st->math + st->english + st->physics; cout << "学生信息修改成功!" << endl; writeToFile(); } } // 删除学生 void deleteStudent() { string id; cout << "请输入要删除的学生学号:"; cin >> id; auto it = students.begin(); while (it != students.end()) { if (it->id == id) { it = students.erase(it); cout << "学生信息删除成功!" << endl; writeToFile(); return; } else { ++it; } } cout << "未找到对应的学生信息!" << endl; } // 按照每个科目成绩排序 void sortBySubject() { int choice; cout << "请选择排序方式(1.语文 2.数学 3.英语 4.物理):"; cin >> choice; switch (choice) { case 1: sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.chinese > b.chinese; }); break; case 2: sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.math > b.math; }); break; case 3: sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.english > b.english; }); break; case 4: sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.physics > b.physics; }); break; default: cout << "无效的选择!" << endl; return; } cout << "按照科目成绩排序成功!" << endl; } // 按照总成绩排序 void sortByTotalScore() { sort(students.begin(), students.end()); cout << "按照总成绩排序成功!" << endl; } // 统计平均分 void calculateAverageScore() { int choice; cout << "请选择统计方式(1.班级 2.科目):"; cin >> choice; if (choice == 1) { string cls; cout << "请输入要统计的班级:"; cin >> cls; int sum_chinese = 0, sum_math = 0, sum_english = 0, sum_physics = 0; int count = 0; for (auto& st : students) { if (st.cls == cls) { sum_chinese += st.chinese; sum_math += st.math; sum_english += st.english; sum_physics += st.physics; count++; } } if (count > 0) { cout << "班级:" << cls << endl; cout << "语文平均分:" << sum_chinese / count << endl; cout << "数学平均分:" << sum_math / count << endl; cout << "英语平均分:" << sum_english / count << endl; cout << "物理平均分:" << sum_physics / count << endl; } else { cout << "未找到对应的班级信息!" << endl; } } else if (choice == 2) { int sum_chinese = 0, sum_math = 0, sum_english = 0, sum_physics = 0; int count = students.size(); for (auto& st : students) { sum_chinese += st.chinese; sum_math += st.math; sum_english += st.english; sum_physics += st.physics; } cout << "科目平均分:" << endl; cout << "语文:" << sum_chinese / count << endl; cout << "数学:" << sum_math / count << endl; cout << "英语:" << sum_english / count << endl; cout << "物理:" << sum_physics / count << endl; } else { cout << "无效的选择!" << endl; return; } } // 根据学号查询学生信息 void queryById() { string id; cout << "请输入要查询的学生学号:"; cin >> id; Student* st = findById(id); if (st == nullptr) { cout << "未找到对应的学生信息!" << endl; } else { cout << setw(10) << "姓名" << setw(5) << "性别" << setw(15) << "学号" << setw(10) << "班级"; cout << setw(5) << "语文" << setw(5) << "数学" << setw(5) << "英语" << setw(5) << "物理"; cout << setw(5) << "总分" << endl; st->display(); } } // 根据姓名和班级查询学生信息 void queryByNameAndCls() { string name, cls; cout << "请输入要查询的学生姓名:"; cin >> name; cout << "请输入要查询的学生班级:"; cin >> cls; bool found = false; cout << setw(10) << "姓名" << setw(5) << "性别" << setw(15) << "学号" << setw(10) << "班级"; cout << setw(5) << "语文" << setw(5) << "数学" << setw(5) << "英语" << setw(5) << "物理"; cout << setw(5) << "总分" << endl; for (auto& st : students) { if (st.name == name && st.cls == cls) { st.display(); found = true; } } if (!found) { cout << "未找到对应的学生信息!" << endl; } } // 显示菜单 void showMenu() { cout << "======================================" << endl; cout << "欢迎使用学生成绩管理系统!" << endl; cout << "1.添加学生信息" << endl; cout << "2.修改学生信息" << endl; cout << "3.删除学生信息" << endl; cout << "4.按照每个科目成绩排序" << endl; cout << "5.按照总成绩排序" << endl; cout << "6.统计平均分" << endl; cout << "7.根据学号查询学生信息" << endl; cout << "8.根据姓名和班级查询学生信息" << endl; cout << "0.退出程序" << endl; cout << "======================================" << endl; } // 运行程序 void run() { int choice; while (true) { showMenu(); cout << "请输入要执行的操作序号:"; cin >> choice; switch (choice) { case 1: addStudent(); break; case 2: modifyStudent(); break; case 3: deleteStudent(); break; case 4: sortBySubject(); break; case 5: sortByTotalScore(); break; case 6: calculateAverageScore(); break; case 7: queryById(); break; case 8: queryByNameAndCls(); break; case 0: cout << "感谢使用本系统,再见!" << endl; return; default: cout << "无效的选择,请重新输入!" << endl; break; } } } }; int main() { StudentManager manager; manager.run(); return 0; } ``` 程序中使用了文件存储学生信息,数据会被保存在名为“students.txt”的文件中。每次进行学生信息的添加、修改、删除等操作后,文件都会被更新。当程序启动时,会从文件中读取学生信息并存储到内存中,以便进行后续的查询和统计。

相关推荐

最新推荐

recommend-type

毕业设计基于STC12C5A、SIM800C、GPS的汽车防盗报警系统源码.zip

STC12C5A通过GPS模块获取当前定位信息,如果车辆发生异常震动或车主打来电话(主动请求定位),将通过GSM发送一条定位短信到车主手机,车主点击链接默认打开网页版定位,如果有安装高德地图APP将在APP中打开并展示汽车当前位置 GPS模块可以使用多家的GPS模块,需要注意的是,当前程序对应的是GPS北斗双模芯片,故只解析 GNRMC数据,如果你使用GPS芯片则应改为GPRMC数据即可。 系统在初始化的时候会持续短鸣,每初始化成功一部分后将长鸣一声,如果持续短鸣很久(超过20分钟),建议通过串口助手查看系统输出的调试信息,系统串口默认输出从初始化开始的所有运行状态信息。 不过更建议你使用SIM868模块,集成GPS.GSM.GPRS,使用更加方便
recommend-type

基于tensorflow2.x卷积神经网络字符型验证码识别.zip

基于tensorflow2.x卷积神经网络字符型验证码识别 卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。
recommend-type

【三维装箱】遗传和模拟退火算法求解三维装箱优化问题【含Matlab源码 031期】.zip

【三维装箱】遗传和模拟退火算法求解三维装箱优化问题【含Matlab源码 031期】.zip
recommend-type

自己编写的python 程序计算cpk/ppk

cpk&ppk python 小程序,品友点评
recommend-type

基于Springboot开发的分布式抽奖系统.zip

基于springboot的java毕业&课程设计
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。