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…

JSON 基本语法以及在Java 中的使用

文章目录 一、JSON 概述1.1 什么是 JSON1.2 JSON数据类型和语法1.3 JSON 优势 二、使用 JSON2.1 在 Java程序中使用 JSON2.2 Jackson的使用2.2.1 Jackson的简单介绍2.2.2 反序列化2.2.3 序列化 参考资料 一、JSON 概述 1.1 什么是 JSON JSON&#xff08;JavaScript Object No…

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 功能安…

数据分析完整流程一般包括哪几个环节/步骤

问题定义&#xff1a; 确定需要解决的问题或目标&#xff0c;明确分析的方向和目的。 数据收集&#xff1a; 收集与问题相关的数据&#xff0c;可以包括从各种来源获取的结构化或非结构化数据。 数据清洗&#xff1a; 对收集到的数据进行清理&#xff0c;处理缺失值、异常值和…

JavaScript 中的事件

1、鼠标事件&#xff1a; 鼠标单击事件&#xff08;click&#xff09;&#xff1a; 方法一 &#xff08;onclick&#xff09; <button id"btn" onclick"alert(88888)">点击弹框</button> 方法二&#xff08;利用addEventListener&#xff09;…

洛谷(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 …

ssh: connect to host github.com port 22: Connection timed out

问题描述 本来好好的git push到GitHub突然有一天会卡住&#xff0c;不报错也不提示超时。 查了各种办法&#xff1a; 从ssh改成https&#xff0c;然后发现2021年8月好像停用了https的访问方式&#xff0c;需要生成口令&#xff0c;感觉太麻烦和奇怪就没有解决了。git remote…

Webpack5入门到原理21:提升开发体验

SourceMap 为什么 开发时我们运行的代码是经过 webpack 编译后的&#xff0c;例如下面这个样子&#xff1a; /** ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").* This devtool is neither made for product…

更新Ubuntu并同步网络时间

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

Webpack5入门到原理19:React 脚手架搭建

开发模式配置 // webpack.dev.js const path require("path"); const ESLintWebpackPlugin require("eslint-webpack-plugin"); const HtmlWebpackPlugin require("html-webpack-plugin"); const ReactRefreshWebpackPlugin require("…

使用 ImportBeanDefinitionRegistrar 向Spring容器中注入Bean

目录 一、如何使用二、优点 一、如何使用 ImportBeanDefinitionRegistrar是Spring提供的一个接口&#xff0c;允许你在运行时动态地注册Bean定义到Spring容器中。通过实现这个接口&#xff0c;你可以在配置类上使用Import注解&#xff0c;并在registerBeanDefinitions方法中自…

蓝桥杯练习题(十二)

&#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…