【C++】实现学生管理系统(完整版)

💕💕💕大家好,这是作业侠系列之C++实现学生管理系统,还是那句话,大家不想cv或者cv了跑不起来,三连后都可以来找我要源码,私信或评论留下你的邮箱即可。有任何问题有可以私聊我,大家觉得还行的话,期待你们的三连,这也是我创作的最大动力💕💕💕


往期源码回顾:
【Java】实现绘图板(完整版)
【C++】图书管理系统(完整板)
【Java】实现计算器(完整版)
【Python】实现爬虫,爬取天气情况并进行分析(完整版)
【Java】实现记事本(完整版)
【Java】实现多线程计算阶乘和(完整版)

插个小广告
本人在线接单,无中介,价格实惠!!!有兴趣的小伙伴可以私聊我,质量保证

学生管理系统功能概览,具体操作大家可以自己运行试试:

在这里插入图片描述
代码概览:

OperationManagement.h  将学生,成绩等信息等从文件中读取出来以及其他操作,放入容器中,便于操作,不用一直对文件进行I/O.
Score.h  用于对成绩抽象,并实现了>>的重载,便于文件读入,读出
Student.h  对学生进行的抽象,同样实现了>>的重载,便于文件读入,读出

插个小广告
本人在线接单,无中介,价格实惠!!!有兴趣的小伙伴可以私聊我,质量保证

全部代码与讲解:
1.sms.cpp

#include <iostream>
#include "OperationManagement.h"
int main()
{
	OperationManagement om;
	om.init();
	while (true)
	{
		om.showMenu();
		cout << "请输入您要使用的功能序号:" << endl;
		int choice;
		cin >> choice;
		switch (choice)
		{
		case 0:                   //添加功能
			om.addStudent();
			break;
		case 1:                   //删除功能  
			om.deleteStudent();
			break;
		case 2:                   //更新功能
			om.updateStudent();
			break;
		case 3:                   
			om.addScore();
			break;
		case 4:                   
			om.deleteScore();
			break;
		case 5:                   
			om.updateScore();
			break;
		case 6:                   
			om.displayStudentInfo();
			break;
		default:
			system("cls");       //cls的作用是清空屏幕的功能,使用户可以再次输入选项数字
			break;
		}
	}
	system("pause");             //使程序有一个暂停阻碍的功能,防止界面突然退出
	return 0;

}


score.cpp

#include "Score.h"

Score::Score()
{
}

Score::Score(string id, string course, int score)
    : studentId(id), courseName(course), scoreValue(score) {}

string Score::getStudentId() { return studentId; }

string Score::getCourseName() { return courseName; }

int Score::getScoreValue() { return scoreValue; }

void Score::setStudentId(string id) {
    studentId = id;
}

void Score::setCourseName(string course) {
    courseName = course;
}

void Score::setScoreValue(int score) {
    scoreValue = score;
}


istream& operator>>(istream& input, Score* s) {
    input >> s->studentId >> s->courseName >> s->scoreValue ;
    return input;
}

ostream& operator<<(ostream& output, const Score* s) {
    output << s->studentId << " " << s->courseName << " " << s->scoreValue  << endl;
    return output;
}

void Score::display() {
    cout << "学生ID: " << studentId << " "<<"课程名称: " << courseName << " "<<"分值: " << scoreValue << endl;
}

student.cpp

#include "Student.h"

Student::Student()
{
}

Student::Student(string id,string n, string dorm,string phone)
    : studentId(id), name(n), dormitory(dorm), phoneNumber(phone) {}

string Student::getStudentId() { return studentId; }

string Student::getName() { return name; }

string Student::getDormitory() { return dormitory; }

string Student::getPhoneNumber() { return phoneNumber; }


void Student::setStudentId(string id) {
    studentId = id;
}

void Student::setName(string n) {
    name = n;
}

void Student::setDormitory(string dorm) {
    dormitory = dorm;
}

void Student::setPhoneNumber(string phone) {
    phoneNumber = phone;
}

istream& operator>>(istream& input, Student* s) {
    input >> s->studentId >> s->name >> s->dormitory >> s->phoneNumber  ;
    return input;
}

ostream& operator<<(ostream& output, const Student* s) {
    output << s->studentId << " " << s->name << " " << s->dormitory << " " << s->phoneNumber ;
    return output;
}

OperationManagement.cpp

#include "OperationManagement.h"
#include<fstream>
#include<iostream>

using namespace std;
void OperationManagement::init()
{
	ifstream readFile;
	readFile.open("students.txt");
	if (!readFile.is_open())
	{
		cout << "学生数据读取错误" << endl;
		readFile.close();
		return;
	}
	while (!readFile.eof())
	{
		Student* student = new Student();
		readFile >>student;
		string id = student->getStudentId();
		students[id] = student;
	}
	readFile.close();
	readFile.open("scores.txt");
	if (!readFile.is_open())
	{
		cout << "成绩数据读取错误" << endl;
		readFile.close();
		return;
	}
	while (!readFile.eof())
	{

		Score* score = new Score();
		readFile >> score;
		string id = score->getStudentId();
		scores.insert(make_pair(id, score));
	}
	readFile.close();
}


void OperationManagement::displayStudentInfo() {
	string studentId;
	cout << "请输入您要查询的学生学号" << endl;
	cin >> studentId;
	for (auto map : students) {
		if (map.first == studentId) {
			Student* student = map.second;
			cout << "学号: "<< studentId <<"学生信息如下:" << endl;
			cout << "姓名: " << student->getName() << " " << "宿舍: " << student->getDormitory() << " " << "电话: " << student->getPhoneNumber() << endl;

			// 查询学生成绩
			cout << "该生成绩情况如下:" << endl;
			if (scores.size() == 0) {
				cout << "暂无成绩" << endl;
			}
			else {
				for (auto smap : scores) {
					if (smap.first == studentId) {
						Score* score = new Score();
						score = smap.second;
						cout << "课程名: " << score->getCourseName() << " 分值: " << score->getScoreValue() << endl;
					}
				}
			}

			return;
		}
	}

	cout << "未找到该学生信息!" << endl;
}

void OperationManagement::showMenu()
{
	cout << "------------O.o  欢迎您使用学生管理系统  o.O------------" << endl;
	cout << "------------O.o  可用的功能编号如下 :       o.O------------" << endl;
	cout << "------------O.o  0,添加学生信息功能         o.O------------" << endl;
	cout << "------------O.o  1,查找学生信息功能         o.O------------" << endl;
	cout << "------------O.o  2,修改学生信息功能         o.O------------" << endl;
	cout << "------------O.o  3,添加学生成绩功能         o.O------------" << endl;
	cout << "------------O.o  4,删除学生成绩功能         o.O------------" << endl;
	cout << "------------O.o  5,修改学生成绩功能         o.O------------" << endl;
	cout << "------------O.o  6,查询学生信息         o.O------------" << endl;
}

void OperationManagement::addStudent() {
	cout << "请输入您要添加的学生的学号:" << endl;
	string id;
	cin >> id;
	// 检查学生是否已存在
	if (students.count(id) > 0) {
		cout << "该学号已存在,添加失败" << endl;
	}
	else {
		string name;
		string dormitory;
		string phoneNumber;
		cout << "请输入您要添加的学生的姓名:" << endl;
		cin >> name;
		cout << "请输入您要添加的学生的所在宿舍:" << endl;
		cin >> dormitory;
		cout << "请输入您要添加的学生的电话:" << endl;
		cin >> phoneNumber;
		Student* student = new Student(id, name, dormitory, phoneNumber);
		students[id] = student;
		ofstream writeFile("students.txt", ios::app);
		writeFile << endl << student;
		cout << "学生信息添加成功!" << endl;
	}
}


void OperationManagement::deleteStudent() {
	cout << "请输入您要删除的学生的学号:" << endl;
	string id;
	cin >> id;
	// 检查学生是否已存在
	if (students.count(id) == 0) {
		cout << "该学号不存在,删除失败" << endl;
	}
	else {
		auto it = students.find(id);

		// 如果找到了对应的学生,则从unordered_map中删除该学生
		if (it != students.end()) {
			delete it->second;  // 删除指针指向的内存
			students.erase(it);  // 从unordered_map中删除该学生
			ofstream writeFile("students.txt", ios::out);
			for (auto student : students)
			{
				writeFile << endl << student.second;
			}
			cout << "删除成功" << endl;
		}
		else {
			cout << "删除失败,未知错误" << endl;
		}
	}
}

void OperationManagement::updateStudent() {
	cout << "请输入您要修改的学生的学号:" << endl;
	string id;
	cin >> id;
	// 检查学生是否已存在
	if (students.count(id) == 0) {
		cout << "该学号不存在,修改失败" << endl;
	}
	else {
		auto it = students.find(id);
		string cmd, name;
		string dormitory;
		string phoneNumber;
		if (it != students.end()) {
			while (1)
			{
				cout << "请输入您要修改的相应信息,输入对应序号即可:" << endl;
				cout << "1.修改学生姓名" << endl;
				cout << "2.修改学生宿舍" << endl;
				cout << "3.修改学生电话" << endl;
				cout << "若您确认修改,请输入:y" << endl;
				cin >> cmd;
				if (cmd == "1")
				{
					cout << "请输入您要修改为的学生姓名:" << endl;
					cin >> name;
					it->second->setName(name);
				}
				else if (cmd == "2")
				{
					cout << "请输入您要修改为的宿舍:" << endl;
					cin >> dormitory;
					it->second->setDormitory(dormitory);
				}
				else if (cmd == "3")
				{
					cout << "请输入您要修改为的电话:" << endl;
					cin >> phoneNumber;
					it->second->setPhoneNumber(phoneNumber);
				}
				else if (cmd == "y")
				{
					ofstream writeFile("students.txt", ios::out);
					for (auto student : students)
					{
						writeFile << endl << student.second;
					}
					writeFile.close();
					cout << "修改成功" << endl;
					break;
				}
			}
		}
	}
}





void OperationManagement::addScore() {
	cout << "请输入您要添加成绩的学生的学号:" << endl;
	string id;
	cin >> id;
	// 检查学生是否已存在
	if (students.count(id) == 0) {
		cout << "该学号不存在,添加失败" << endl;
	}
	else {
		string courseName;
		int scoreValue;
		cout << "请输入您要添加的课程名称:" << endl;
		cin >> courseName;
		bool flag = false;
		for (auto score : scores)
		{
			if (score.second->getCourseName() == courseName)
			{
				flag = true;
				break;
			}
		}
		if (flag)
		{
			cout << "该学生本课程已有分数若要修改,请使用修改成绩功能" << endl;
		}
		cout << "请输入您要添加的课程分值:" << endl;
		cin >> scoreValue;
		Score* score = new Score(id, courseName,scoreValue);
		scores.insert(make_pair(id, score));
		ofstream writeFile("scores.txt", ios::app);
		writeFile << endl << score;
		cout << "学生成绩添加成功!" << endl;
	}
}


void OperationManagement::deleteScore() {
	cout << "请输入您要删除成绩的学生的学号:" << endl;
	string id;
	cin >> id;
	// 检查学生是否已存在
	if (scores.count(id) == 0) {
		cout << "该学号学生暂无课程成绩,删除失败" << endl;
	}
	else {
		cout << "找到该学生课程成绩情况如下" << endl;
		for (auto score : scores)
		{
			if (score.second->getStudentId() == id)
			{
				score.second->display();
			}
		}
		cout << "请输入您要删除的该学生课程成绩名称" << endl;
		string delName;
		cin >> delName;
		bool flag = false;
		for (auto it = scores.begin(); it != scores.end(); ) {
			// 获取当前元素的键和值
			string studentId = it->first;
			Score* score = it->second;

			// 如果需要删除该元素,则进行删除操作
			if (studentId == id && score->getCourseName() == delName) {
				delete score;  // 释放Score对象占用的内存
				it = scores.erase(it);  // 从unordered_map中删除该元素
				flag = true;
				break;
			}
			else {
				++it;  // 移动到下一个元素
			}
		}
		if (flag)
		{
			ofstream writeFile("scores.txt", ios::out);
			for (auto score : scores)
			{
				writeFile << endl << score.second;
			}
			cout << "删除成功" << endl;
		}
		else {
			cout << "删除失败,该学生没有此课程名称的成绩" << endl;
		}
	}
}

void OperationManagement::updateScore() {
	cout << "请输入您要修改成绩的学生的学号:" << endl;
	string id;
	cin >> id;
	// 检查学生是否已存在
	if (scores.count(id) == 0) {
		cout << "该学号学生暂无课程成绩,修改失败" << endl;
	}
	else {
		cout << "找到该学生课程成绩情况如下" << endl;
		for (auto score : scores)
		{
			if (score.second->getStudentId() == id)
			{
				score.second->display();
			}
		}
		cout << "请输入您要修改的该学生课程成绩名称" << endl;
		string upName;
		cin >> upName;
		bool flag = false;
		for (auto it = scores.begin(); it != scores.end(); ) {
			// 获取当前元素的键和值
			string studentId = it->first;
			Score* score = it->second;

			// 如果需要删除该元素,则进行修改操作
			if (studentId == id && score->getCourseName() == upName) {
				cout << "请输入您要修改为的分值:" << endl;
				int newS;
				cin >> newS;
				score->setScoreValue(newS);
				flag = true;
				break;
			}
			else {
				++it;  // 移动到下一个元素
			}
		}
		if (flag)
		{
			ofstream writeFile("scores.txt", ios::out);
			for (auto score : scores)
			{
				writeFile << endl << score.second;
			}
			cout << "修改成功" << endl;
		}
		else {
			cout << "修改失败,该学生没有此课程名称的成绩" << endl;
		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx + Tomcat 负载均衡、动静分离

前言 Tomcat简介 最初是由Sun的软件构架师詹姆斯邓肯戴维森开发 安装Tomcat后&#xff0c;安装路径下面的目录和文件&#xff0c;是使用或者配置Tomcat的重要文件 Nginx 应用 Nginx是一款非常优秀的HTTP服务器软件 &#xff08;1&#xff09;支持高达50 000个并发连接数的响应…

workhome 2024.06.16 math-6

数学分析语句断句&#xff0c;分析&#xff0c;画画做图&#xff0c;逻辑&#xff0c;解析&#xff0c;计算过程&#xff0c;严谨&#xff0c;我们程序出错多数是因为不够严谨&#xff0c;少了漏了可能出现的情况。 1&#xff09; https://download.csdn.net/download/spencer_…

Aspose将doc,ppt转成pdf

1.需要引入的jar包 链接: https://pan.baidu.com/s/1t3wqq7KrHi50K9KX3-Eb9A?pwdu4se 提取码: u4se <dependency><groupId>com.aspose</groupId><artifactId>aspose-words-jdk16</artifactId><version>15.8.0</version><scop…

xss+csrf项目实例

项目背景&#xff1a; 如下&#xff1a;我们是在一个类似文章管理系统的网站上面发现的该漏洞。我们将其运行在本地的phpstudy集成环境上面。 源码地址下载链接&#xff1a;https://pan.baidu.com/s/1MpnSAq7a_oOcGh4XgPE-2w 提取码&#xff1a;4444 考察内容&#xff1a; …

C. Rooks Defenders(树状数组)

You have a square chessboard of size nnnn. Rows are numbered from top to bottom with numbers from 11 to nn, and columns — from left to right with numbers from 11 to nn. So, each cell is denoted with pair of integers (x,y)(x,y) (1≤x,y≤n1≤x,y≤n), where …

质疑标普,理解标普,加入标普

上周我在文章里提到过&#xff0c;标普信息科技LOF(161128)出现套利机会。每天申购卖出&#xff0c;到现在一个账户56*6336润。 得益于美股七巨头轮流领涨&#xff0c;161128依旧坚挺&#xff0c;每天溢价都是10%&#xff0c;成交量1个多亿&#xff0c;场内新增份额才400万份&…

大模型生成的常见Top-k、Top-p、Temperature参数

参考&#xff1a; https://zhuanlan.zhihu.com/p/669661536 topK&#xff0c;topP https://www.douyin.com/video/7380126984573127945 主要是softmax产生的词表每个词的概率分布后&#xff0c; topK&#xff0c;比如K3&#xff0c;表示采样概率最大的前3个&#xff0c;其他全…

第一篇——怎样堵住我们人生错误的源头

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 再次开始了孙子兵法的学习&#xff0c;之前听完就让我醍醐灌顶&#xff0…

Python基础用法 之 变量

1.变量的定义 变量的作用&#xff1a;是⽤来保存数据的。定义的语法&#xff1a;变量名 数据值使用&#xff1a;直接使⽤变量名 即可使⽤变量中存储的数据。注意&#xff1a;变量必须先定义后使用。 (即 必须 先存⼊数据 才能 获取数据) 。 # 需求 1, 定义⼀个变量 保存你的名…

设计模式- 责任链模式Chain of Responsibility(行为型)

责任链模式(Chain of Responsibility) 责任链模式是一种行为模式&#xff0c;它为请求创建一个接收者对象的链&#xff0c;解耦了请求的发送者和接收者。责任链模式将多个处理器串联起来形成一条处理请求的链。 图解 角色 抽象处理者&#xff1a; 一个处理请求的接口&#xf…

TSP:人工原生动物优化器(APO)求解旅行商问题TSP(可以更改数据),MATLAB代码

一、旅行商问题介绍 二、人工原生动物优化算法求解TSP 2.1算法介绍 人工原生动物优化器&#xff08;Artificial Protozoa Optimizer &#xff0c;APO&#xff09;由Xiaopeng Wang等人于2024年提出&#xff0c;其灵感来自自然界中的原生动物。APO 模拟了原生动物的觅食、休眠和…

Spark-Shuffle阶段优化-Bypass机制详解

Spark概述 Spark-Shuffle阶段优化-Bypass机制详解 Spark的Bypass机制是一种特定情况下的优化策略&#xff0c;目的是减少Shuffle过程中不必要的排序开销&#xff0c;从而提升性能。当Shuffle分区数较少且数据量不大时&#xff0c;Bypass机制可以显著加快Shuffle速度。 1.什么…

统计套利—配对交易策略

配对交易是一种基于统计学的交易策略&#xff0c;通过两只股票的差价来获取收益&#xff0c;因而与很多策略不同&#xff0c;它是一种中性策略&#xff0c;理论上可以做到和大盘走势完全无关。 配对交易的基本原理是&#xff0c;两个相似公司的股票&#xff0c;其股价走势虽然在…

STM32CubeMX配置-外部中断配置

一、简介 MCU为STM32G070&#xff0c;配置为上升沿触发外部中断&#xff0c;在上升沿外部中断回调函数中进行相关操作。 二、外部中断配置 查看规格书中管教描述&#xff0c;找到I/O对应的外部中断线&#xff0c;然后进行如下上升沿触发外部中断配置。 三、生成代码 调用上升沿…

C语言:文件系统

一、目录和文件 在当前目录下使用touch 创建一个名为 -a的文件: touch -a ; // 错误&#xff0c; touch -- -a//正确 touch ./-a 正确 ls -n可以看到对象的用户id&#xff0c;可以在/etc/passwd中查看&#xff0c;/etc/group可以看到组号 获取文件属性 #include <sys/ty…

自动化测试xmind的常用技术

xmind思维导图的用法&#xff0c;我们在自动化测试中&#xff0c;写用例会用到思维导图工具xmind&#xff0c;下面总结xmind的一些常见用法。 在桌面上点击xmind图标&#xff0c;打开xmind 1、快捷按键 添加子主题:insert键 添加同级主题&#xff1a;回车键enter 删除&#…

爆火的治愈系插画工具又来了,额度居然有18w,根本花不完?

AI治愈插画又又又来了 今天给大家推荐一款完全免费的软件&#xff0c;用过的人都说好&#xff01; 先来看看我生成的图 制作过程非常简单&#xff0c;输入你想要生成的画面咒语。 工具地址&#xff1a;https://www.qiyuai.net/ 模型目前有两种 我上面的图就是用的第一种通用…

libharu维基页面

文章目录 安装Linux/UNIX:macOS:Windows (非 Cygwin/MSYS):使用 VCPKG 依赖管理器:注意&#xff1a; Cygwin/MSYS: 使用错误处理函数类型错误处理用户自定义错误处理函数使用用户自定义错误处理函数C语言中的错误处理C中的错误处理 其他编程语言错误代码列表总结 图像图形模式路…

【每天学会一个渗透测试工具】AWVS安装及使用指南

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨AWVS介绍 是应用漏洞扫描工具 &#x1f4a6;使用docker安装 docker pull dockermi3aka/awvs启动镜像 docker run -dit …

元数据、数据元、数据字典、数据模型及元模型的区别详解

在数据管理和分析领域&#xff0c;有许多相似的概念&#xff0c;如元数据、数据元、数据字典、数据模型和元模型。这些概念的定义和应用往往容易混淆。 数据元 数据元是通过一系列属性描述的数据单元&#xff0c;包括定义、标识、表示以及允许值等。这些属性帮助我们理解和使用…