C++实现一个简单的学生管理系统

目录

1.一个简单的学生管理系统简介

2.定义一个 Student 类

2.1用于表示学生信息。

3.定义一个 StudentManager 类

3.1用于管理学生信息。

4.在 main 函数中

4.1使用上述两个类来实现一个简单的学生管理系统

5.C++类模板


推荐阅读:

calloc与realloc和malloc的区别以及new-CSDN博客文章浏览阅读549次,点赞17次,收藏8次。newmalloccalloc、realloc 和 malloc 是 C/C++ 中用于动态内存分配的函数。malloc 函数:malloc 函数用于在堆上分配指定大小的内存块。它接受一个参数,即所需内存块的字节数,返回一个指向分配内存的指针。如果分配失败,则返回 NULL。calloc 函数:calloc 函数类似于 malloc 函数,但它还会将分配的内存块初始化为零。它接受两个参数,即所需内存块的个数和每个内存块的字节数。它返回一个指向分配内存的指针。如果分配失败,则返回 NULL。https://blog.csdn.net/m0_62338174/article/details/135709282?spm=1001.2014.3001.5501

 C/C++ 中用于动态内存分配的函数。

  1. malloc 函数:malloc 函数用于在堆上分配指定大小的内存块。它接受一个参数,即所需内存块的字节数,返回一个指向分配内存的指针。如果分配失败,则返回 NULL。

  2. calloc 函数:calloc 函数类似于 malloc 函数,但它还会将分配的内存块初始化为零。它接受两个参数,即所需内存块的个数和每个内存块的字节数。它返回一个指向分配内存的指针。如果分配失败,则返回 NULL。

  3. realloc 函数:realloc 函数用于重新分配已分配内存的大小。它接受两个参数,即原始内存块的指针和新的内存块大小。如果内存分配成功,则返回一个指向新分配内存的指针。如果分配失败,则返回 NULL。同时,realloc 函数还会尝试保留原始内存块中的数据,将其复制到新分配的内存块中。


 


1.一个简单的学生管理系统简介

该系统可以添加、查询和删除学生信息,并将学生信息保存到文件中。

这个学生管理系统的设计包括了以下几个方面:

  1. 学生类(Student)的定义:包括学生的姓名、年龄、性别等信息,并提供了显示信息、从文件中读取信息、将信息写入文件等功能。

  2. 学生管理类(StudentManager)的定义:包括添加、查询和删除学生信息的功能,以及将学生信息保存到文件的功能。

  3. 在主函数中使用上述两个类来实现一个简单的学生管理系统:通过用户输入实现添加、查询和删除学生信息的功能,并将修改后的学生信息保存到文件中。

这个学生管理系统提供了基本的学生信息管理功能,并且通过文件输入输出流库实现了将信息保存到文件和从文件中读取信息的功能。同时,还提到了可以扩展该系统,增加成绩、课程表等功能。

此外,还介绍了C++类模板的概念,说明了类模板的定义以及使用类模板时的一些注意事项,强调了类模板的灵活性和通用性,以及它在提高代码复用性和可维护性方面的优势。

2.定义一个 Student

2.1用于表示学生信息。

该类包含学生的姓名、年龄和性别信息,以及操作这些信息的成员函数。其中,为了方便操作,我们使用字符串表示学生的性别信息,1 表示男性,0 表示女性。

#include <iostream>
#include <fstream> // 文件输入输出流库
#include <vector>class Student {
public:// 默认构造函数Student() {name = "";age = 0;gender = "";}// 带参数的构造函数Student(std::string n, int a, std::string g) {name = n;age = a;gender = g;}// 成员函数,用于显示学生信息void DisplayInfo() const {std::cout << "姓名:" << name << "\t年龄:" << age << "\t性别:" << gender << std::endl;}// 成员函数,用于从文件中读取学生信息void LoadFromFile(std::ifstream& file) {file >> name >> age >> gender;}// 成员函数,用于将学生信息写入文件void WriteToFile(std::ofstream& file) const {file << name << " " << age << " " << gender << std::endl;}// getter 函数,用于获取学生姓名std::string GetName() const {return name;}private:std::string name;   // 姓名int age;            // 年龄std::string gender; // 性别
};

3.定义一个 StudentManager

3.1用于管理学生信息。

该类包含添加、查询和删除学生信息的成员函数,以及将学生信息保存到文件的成员函数。

class StudentManager {
public:// 成员函数,用于添加学生信息void AddStudent(const Student& s) {students.push_back(s);}// 成员函数,用于查询学生信息void QueryStudent(const std::string& name) const {bool found = false;for (const auto& s : students) {if (s.GetName() == name) {s.DisplayInfo();found = true;}}if (!found) {std::cout << "未找到姓名为" << name << "的学生" << std::endl;}}// 成员函数,用于删除学生信息void DeleteStudent(const std::string& name) {for (auto it = students.begin(); it != students.end(); ++it) {if (it->GetName() == name) {students.erase(it);std::cout << "已删除姓名为" << name << "的学生" << std::endl;return;}}std::cout << "未找到姓名为" << name << "的学生" << std::endl;}// 成员函数,用于从文件中读取学生信息void LoadFromFile(const std::string& filename) {std::ifstream file(filename);if (!file.is_open()) {std::cerr << "文件打开失败:" << filename << std::endl;return;}Student s;while (!file.eof()) {s.LoadFromFile(file);if (s.GetName() != "") { // 去除文件末尾多余空行students.push_back(s);}}file.close();}// 成员函数,用于将学生信息写入文件void WriteToFile(const std::string& filename) const {std::ofstream file(filename);if (!file.is_open()) {std::cerr << "文件打开失败:" << filename << std::endl;return;}for (const auto& s : students) {s.WriteToFile(file);}file.close();}private:std::vector<Student> students; // 学生信息列表
};

4.在 main 函数中

4.1使用上述两个类来实现一个简单的学生管理系统

具体来说,程序首先从文件中读取学生信息,然后通过用户输入实现添加、查询和删除学生信息的功能,最后将修改后的学生信息保存到文件中。

int main() {StudentManager manager;manager.LoadFromFile("students.txt"); // 从文件中读取学生信息int choice = 0;while (true) {std::cout << "1. 添加学生信息" << std::endl;std::cout << "2. 查询学生信息" << std::endl;std::cout << "3. 删除学生信息" << std::endl;std::cout << "4. 退出程序" << std::endl;std::cout << "请选择操作:";std::cin >> choice;if (choice == 1) { // 添加学生信息std::string name, gender;int age;std::cout << "请输入学生姓名、年龄和性别(男/女):";std::cin >> name >> age >> gender;manager.AddStudent(Student(name, age, gender));}else if (choice == 2) { // 查询学生信息std::string name;std::cout << "请输入要查询的学生姓名:";std::cin >> name;manager.QueryStudent(name);}else if (choice == 3) { // 删除学生信息std::string name;std::cout << "请输入要删除的学生姓名:";std::cin >> name;manager.DeleteStudent(name);}else if (choice == 4) { // 保存并退出程序manager.WriteToFile("students.txt");break;}else {std::cout << "无效的选项,请重新输入" << std::endl;}}return 0;
}

最终,当用户选择退出程序时,程序会将修改后的学生信息保存到文件 students.txt 中。可以通过查看该文件来验证学生信息是否被正确地保存。

通过上面的代码实现,我们学习了如何使用 C++ 类来管理数据,以及如何使用文件输入输出流库将数据保存到文件中。这是一个简单的学生管理系统,但是可以扩展为更复杂的系统,例如添加成绩、课程表等功能。

#include <iostream>
#include <fstream> // 文件输入输出流库
#include <vector>class Student {
public:// 默认构造函数Student() {name = "";age = 0;gender = "";}// 带参数的构造函数Student(std::string n, int a, std::string g) {name = n;age = a;gender = g;}// 成员函数,用于显示学生信息void DisplayInfo() const {std::cout << "姓名:" << name << "\t年龄:" << age << "\t性别:" << gender << std::endl;}// 成员函数,用于从文件中读取学生信息void LoadFromFile(std::ifstream& file) {file >> name >> age >> gender;}// 成员函数,用于将学生信息写入文件void WriteToFile(std::ofstream& file) const {file << name << " " << age << " " << gender << std::endl;}// getter 函数,用于获取学生姓名std::string GetName() const {return name;}private:std::string name;   // 姓名int age;            // 年龄std::string gender; // 性别
};
class StudentManager {
public:// 成员函数,用于添加学生信息void AddStudent(const Student& s) {students.push_back(s);}// 成员函数,用于查询学生信息void QueryStudent(const std::string& name) const {bool found = false;for (const auto& s : students) {if (s.GetName() == name) {s.DisplayInfo();found = true;}}if (!found) {std::cout << "未找到姓名为" << name << "的学生" << std::endl;}}// 成员函数,用于删除学生信息void DeleteStudent(const std::string& name) {for (auto it = students.begin(); it != students.end(); ++it) {if (it->GetName() == name) {students.erase(it);std::cout << "已删除姓名为" << name << "的学生" << std::endl;return;}}std::cout << "未找到姓名为" << name << "的学生" << std::endl;}// 成员函数,用于从文件中读取学生信息void LoadFromFile(const std::string& filename) {std::ifstream file(filename);if (!file.is_open()) {std::cerr << "文件打开失败:" << filename << std::endl;return;}Student s;while (!file.eof()) {s.LoadFromFile(file);if (s.GetName() != "") { // 去除文件末尾多余空行students.push_back(s);}}file.close();}// 成员函数,用于将学生信息写入文件void WriteToFile(const std::string& filename) const {std::ofstream file(filename);if (!file.is_open()) {std::cerr << "文件打开失败:" << filename << std::endl;return;}for (const auto& s : students) {s.WriteToFile(file);}file.close();}private:std::vector<Student> students; // 学生信息列表
};
int main() {StudentManager manager;manager.LoadFromFile("students.txt"); // 从文件中读取学生信息int choice = 0;while (true) {std::cout << "1. 添加学生信息" << std::endl;std::cout << "2. 查询学生信息" << std::endl;std::cout << "3. 删除学生信息" << std::endl;std::cout << "4. 退出程序" << std::endl;std::cout << "请选择操作:";std::cin >> choice;if (choice == 1) { // 添加学生信息std::string name, gender;int age;std::cout << "请输入学生姓名、年龄和性别(男/女):";std::cin >> name >> age >> gender;manager.AddStudent(Student(name, age, gender));}else if (choice == 2) { // 查询学生信息std::string name;std::cout << "请输入要查询的学生姓名:";std::cin >> name;manager.QueryStudent(name);}else if (choice == 3) { // 删除学生信息std::string name;std::cout << "请输入要删除的学生姓名:";std::cin >> name;manager.DeleteStudent(name);}else if (choice == 4) { // 保存并退出程序manager.WriteToFile("students.txt");break;}else {std::cout << "无效的选项,请重新输入" << std::endl;}}return 0;
}

5.C++类模板

是一种通用的类定义,它允许我们编写一次代码,然后在需要时使用不同的类型参数进行实例化。通过使用类模板,可以提供一种灵活的方式来处理各种数据类型的需求。

类模板的定义以关键字template开头,后面跟着一个或多个模板参数。模板参数可以是类型参数、非类型参数或模板参数包。通过在模板定义中使用这些参数,我们可以在使用类模板时指定不同的类型或值。

使用类模板时,我们需要提供具体的类型或值作为模板参数,以实例化一个特定的类。根据不同的模板参数,编译器会生成相应的类定义。这使得我们可以使用相同的代码来处理不同的数据类型,提高了代码的复用性和可维护性。

类模板可以用于定义一些通用的数据结构和算法,如容器类(例如向量、链表、队列等)和排序算法(例如快速排序、归并排序等)。通过使用类模板,我们可以在不同的场景中使用相同的逻辑,而无需为每种数据类型编写重复的代码。

总而言之,C++类模板提供了一种强大的机制,允许我们以通用的方式处理不同的数据类型。通过模板参数化,可以生成具体的类定义,以适应各种类型的需求。这样可以提高代码的复用性和可维护性,使我们能够更高效地开发和管理代码。

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

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

相关文章

多线程(看这一篇就够了,超详细,满满的干货)

多线程 一.认识线程&#xff08;Thread&#xff09;1. 1) 线程是什么1. 2) 为啥要有线程1.3) 进程和线程的区别标题1.4) Java的线程和操作系统线程的关系 二.创建线程方法1:继承Thread类方法2:实现Runnable接口方法3:匿名内部类创建Thread子类对象标题方法4:匿名内部类创建Runn…

MySQL TINYINT(1)和TINYINT(2)有什么区别?

文章目录 1.直接建表2.查询数据3.总结 身为程序员&#xff0c;拿事实说话拿代码说话最直观了&#xff0c;show the code 1.直接建表 CREATE TABLE tinyinttest (id int NOT NULL,a TINYINT(1) NOT NULL DEFAULT 0,b TINYINT(2) NOT NULL DEFAULT 0,c TINYINT(1) ZEROFILL NOT…

Unity下实现跨平台的RTMP推流|轻量级RTSP服务|RTMP播放|RTSP播放低延迟解决方案

2018年&#xff0c;我们开始在原生RTSP|RTMP直播播放器的基础上&#xff0c;对接了Unity环境下的低延迟播放&#xff0c;毫秒级延迟&#xff0c;发布后&#xff0c;就得到了业内一致的认可。然后我们覆盖了Windows、Android、iOS、Linux的RTMP推送、轻量级RTSP服务和RTSP|RTMP播…

VRRP协议负载分担

VRRP流量负载分担 VRRP负载分担与VRRP主备备份的基本原理和报文协商过程都是相同的。同样对于每一个VRRP备份组,都包含一个Master设备和若干Backup设备。与主备备份方式不同点在于:负载分担方式需要建立多个VRRP备份组,各备份组的Master设备可以不同;同一台VRRP设备可以加…

ctfshow信息收集(web1-web20)

目录 web1 web2 web3 web4 web5 web6 web7 web9 web10 web11 web14 web15 web16 web17 web18 web19 web20 web1 根据提示的孩子开发的时候注释没有被及时删除 web2 js原因无法查看源代码 第一种方法 在url前加入 view-source&#xff1a; 会显示页面源代…

【车载HMI开发工具--EB GUIDE 与 Unity 合作提供一体化的沉浸式 HMI 设计开发工具链】【转载】

随着车载高性能计算平台的日益普及以及显示器尺寸和数量的不断增加&#xff0c;沉浸式车载人机交互界面&#xff08;HMI&#xff09;的需求也在持续增长。为了将实时 3D 技术带入车载 HMI 领域&#xff0c;Unity 与 Elektrobit (EB)展开了合作&#xff0c;EB 是推进 HMI 功能安…

洛谷(CodeForces)历年愚人节题目,难度普及+/提高,让你怀疑自己智商

INTERCALC 题目描述 DO YOU EXPECT ME TO FIND THIS OUT? WHAT BASE AND/XOR LANGUAGE INCLUDES string? DON’T BYTE OF MORE THAN YOU CAN CHEW YOU CAN ONLY DISTORT THE LARGEST OF MATHEMATICS SO FAR SAYING “ABRACADABRA” WITHOUT A MAGIC AND WON’T DO YOU …

更新Ubuntu并同步网络时间

ubuntu环境搭建专栏&#x1f517;点击跳转 Ubuntu系统环境搭建&#xff08;九&#xff09;——更新Ubuntu并同步网络时间 文章目录 Ubuntu系统环境搭建&#xff08;九&#xff09;——更新Ubuntu并同步网络时间1.更新Ubuntu1.1 查看ubuntu版本和详细信息1.2 创建root用户1.3 更…

蓝桥杯练习题(十二)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;十二&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他…

黑马程序员-瑞吉外卖-day4

实现账号的启动禁止 EmployeeController PutMappingpublic R<String> update(RequestBody Employee employee){employeeService.updateById(employee);return R.success("员工信息修改成功");} 出错 解决 common目录下 引入JacksonObjectMapper package com…

AI绘画Stable Diffusion进阶使用

本文讲解&#xff0c;模型底模&#xff0c;VAE美化模型&#xff0c;Lora模型&#xff0c;hypernetwork。 文本Stable Diffusion 简称sd 欢迎关注 使用模型 C站&#xff1a;https://civitai.com/ huggingface&#xff1a;https://huggingface.co/models?pipeline_tagtext-to-…

怎么移除WordPress后台工具栏的查看站点子菜单?如何改为一级菜单?

默认情况下&#xff0c;我们在WordPress后台想要访问前端网站&#xff0c;需要将鼠标移动到左上角的站点名称&#xff0c;然后点击下拉菜单中的“查看站点”才行&#xff0c;而且还不是新窗口打开。那么有没有办法将这个“查看站点”子菜单变成一级菜单并显示在顶部管理工具栏中…

Vulnhub靶机:FunBox 2

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;FunBox 2&#xff08;10.0.2.27&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/funbo…

基于Servlet建立表白墙网站

目录 一、设计思想 二、设计表白墙页面&#xff08;前端--VSCode&#xff09; 1、效果图 2、html部分&#xff08;网页上有哪些内容&#xff09; 3、css部分&#xff08;页面内容的具体样式&#xff09; 4、js部分&#xff08;页面行为&#xff09; 三、借助Servlet实现客…

TCP服务器最多支持多少客户端连接

目录 一、理论数值 二、实际部署 参考 一、理论数值 首先知道一个基础概念&#xff0c;对于一个 TCP 连接可以使用四元组&#xff08;src_ip, src_port, dst_ip, dst_port&#xff09;进行唯一标识。因为服务端 IP 和 Port 是固定的&#xff08;如下图中的bind阶段&#xff0…

Python(18)--文件输入/输出 Ⅱ

​ 大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 前言 前一篇文章&#xff08;python(17)–文件的输入/输出-CSDN博客&#xff09;介绍了如何操作文本文件和二进制文件&#xff0c;以及对应…

WorkPlus:构建高效协作的企业即时通讯解决方案

在现代企业中&#xff0c;高效沟通是实现协作和改善工作效率的关键。而企业即时通讯工具成为了推进沟通的利器。作为一款高质量的企业即时通讯解决方案&#xff0c;WorkPlus以其卓越的性能和独特的功能&#xff0c;助力企业构建高效协作的新格局。 为什么选择WorkPlus作为企业即…

gin中间件篇

1. 全局中间件 所有请求都经过此中间件 package mainimport ("fmt""time""github.com/gin-gonic/gin" )// 定义中间 func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t : time.Now()fmt.Println("中间件开始执行了&quo…

数据结构【DS】Ch8 排序

文章目录 插入排序选择排序归并&基数外部排序 插入排序 交换排序 选择排序 归并&基数 外部排序

Macos数据库管理软件:Navicat Premium for Mac 16.3.5中文版

Navicat Premium 16 for Mac是一款强大的数据库管理和开发工具&#xff0c;支持多种数据库系统&#xff0c;如MySQL、Oracle、SQL Server等。它提供了直观的用户界面和丰富的功能&#xff0c;使用户能够轻松地创建、管理和维护数据库。 软件下载&#xff1a;Navicat Premium fo…