上文 《C++学习之路(二)C++如何实现一个超简单的学生信息管理系统》我们初步认识了用C++如何写一个简单的学生信息管理系统,这次我们来对上次的代码进行拆解学习一下。
#include
#include // 文件操作需要的头文件
#include
#include
class Student {
private:
std::string name;
int id;
float score;
public:
// 构造函数,用于初始化学生对象
Student(std::string n, int i, float s) : name(std::move(n)), id(i), score(s) {}
// 显示学生信息
void display() {
std::cout << "Name: " << name << "\tID: " << id << "\tScore: " << score << std::endl;
}
// 获取学生姓名
std::string getName() const {
return name;
}
// 获取学生ID
int getID() const {
return id;
}
// 获取学生成绩
float getScore() const {
return score;
}
};
// 添加学生信息
void addStudent(std::vector<Student> &students) {
std::string name;
int id;
float score;
std::cout << "Enter name: ";
std::cin >> name;
std::cout << "Enter ID: ";
std::cin >> id;
std::cout << "Enter score: ";
std::cin >> score;
Student newStudent(name, id, score);
students.push_back(newStudent);
}
// 显示所有学生信息
void displayAllStudents(std::vector<Student> &students) {
std::cout << "Student List:" << std::endl;
for (Student student : students) {
student.display();
}
}
// 保存学生信息到文件
void saveToFile(std::vector<Student> &students) {
std::ofstream file("students.txt"); // 创建文件输出流对象
if (file.is_open()) {
for (const auto &student : students) {
file << student.getName() << " " << student.getID() << " " << student.getScore() << std::endl;
}
file.close(); // 关闭文件
std::cout << "Student information saved to file." << std::endl;
} else {
std::cout << "Unable to open file." << std::endl;
}
}
// 从文件加载学生信息
void loadFromFile(std::vector<Student> &students) {
std::ifstream file("students.txt"); // 创建文件输入流对象
if (file.is_open()) {
std::string name;
int id;
float score;
while (file >> name >> id >> score) {
Student loadedStudent(name, id, score);
students.push_back(loadedStudent);
}
file.close(); // 关闭文件
std::cout << "Student information loaded from file." << std::endl;
} else {
std::cout << "No previous data found." << std::endl;
}
}
int main() {
std::vector<Student> students;
loadFromFile(students); // 从文件加载学生信息
int choice;
do {
std::cout << "\nStudent Management System\n";
std::cout << "1. Add Student\n";
std::cout << "2. Display All Students\n";
std::cout << "3. Save to File\n";
std::cout << "4. Exit\n";
std::cout << "Enter your choice: ";
std::cin >> choice;
switch (choice) {
case 1:
addStudent(students);
break;
case 2:
displayAllStudents(students);
break;
case 3:
saveToFile(students);
break;
case 4:
std::cout << "Exiting...\n";
break;
default:
std::cout << "Invalid choice!\n";
break;
}
} while (choice != 4);
return 0;
}
这个学生信息管理系统涵盖了C++编程的多个关键方面,展示了面向对象编程、文件操作、函数使用、容器和控制流等重要概念的应用。在这个实例中,使用了类(Student
类)来封装学生信息,通过私有成员和公共接口提供了访问和操作数据的方式。
构造函数
被用于对象的初始化,成员函数则允许对学生信息进行显示和访问。另外,利用 std::vector
容器来管理多个学生对象,展示了容器在存储和操作数据上的便利性。此外,文件操作
是关键的一部分,通过 std::ofstream
和 std::ifstream
实现了学生信息的保存和加载,展示了如何使用文件流操作来持久化数据。控制流结构
,如 switch-case
和 do-while
循环,被用来实现用户交互,允许用户选择不同功能。
我们来逐行讲解每行代码的功能,并且列出相关的知识点。
#include
#include // 文件操作需要的头文件
#include
#include
class Student {
private:
std::string name;
int id;
float score;
public:
// 构造函数,用于初始化学生对象
Student(std::string n, int i, float s) : name(std::move(n)), id(i), score(s) {}
// 显示学生信息
void display() {
std::cout << "Name: " << name << "\tID: " << id << "\tScore: " << score << std::endl;
}
// 获取学生姓名
std::string getName() const {
return name;
}
// 获取学生ID
int getID() const {
return id;
}
// 获取学生成绩
float getScore() const {
return score;
}
};
#include
:包含了输入输出流的标准头文件。iostream
是 C++ 中用于包含输入输出流的标准头文件。这个头文件提供了对输入输出流的支持,允许你在程序中使用 std::cin
和 std::cout
来进行标准输入和输出操作。
这个头文件中定义了 std::cin
和 std::cout
,分别代表标准输入流和标准输出流。它们是 C++ 中进行基本输入和输出操作的主要工具。通过这个头文件,你可以使用流操作符 <<
和 >>
来从控制台读取输入或将数据输出到控制台。
除了 std::cin
和 std::cout
,
头文件还提供了其他与流相关的类和函数,以支持更多的输入输出操作。如,std::cerr
、std::clog
、std::streambuf
、std::ofstream
、std::ifstream
这个头文件是 C++ 标准库中非常基础且常用的一部分,几乎每个 C++ 程序都会用到它,因为它是进行输入输出操作的关键。
#include
:包含了文件输入输出流的标准头文件。fstream
是 C++ 标准库中的一个头文件,提供了文件输入输出操作所需的类和函数。它是由 “file stream”(文件流)所组成的缩写,用于支持文件的读取和写入操作。
这个头文件定义了几个重要的类,其中最常用的有两个:
std::ifstream
: 这个类表示输入文件流,用于从文件中读取数据。它提供了读取文件内容的方法,可以从文件中读取文本或二进制数据。
std::ofstream
: 这个类表示输出文件流,用于向文件中写入数据。它提供了向文件写入内容的方法,可以用于创建文件并写入文本或二进制数据。
除了这两个主要的文件流类之外,
头文件还定义了一些其他与文件输入输出相关的类和功能,如 std::fstream
(用于同时进行文件读取和写入的文件流)以及一些与文件操作有关的函数和类型。
使用
头文件可以使程序能够读取和写入文件,对于文件的操作提供了丰富的支持和灵活性,使得 C++ 程序能够方便地处理文件和文件中的数据。
#include
:包含了实用工具的标准头文件。utility
是 C++ 标准库中的一个头文件,提供了一些用于处理通用数据的工具函数和类模板。
这个头文件中最常用的类是 std::pair
,它是一个模板类,用于将两个值作为一对存储,可以容纳不同类型的数据。std::pair
提供了 first
和 second
两个公共成员,分别用于存储这两个值,这种数据结构经常用于创建关联性强的数据对。
除了 std::pair
之外,
头文件还定义了一些通用的函数,如 std::swap
,用于交换两个值的内容;std::move
,用于将左值转换为右值引用,支持移动语义;以及一些支持比较和逻辑运算的函数模板,如 std::rel_ops
等。
这个头文件提供了一些通用的、可复用的工具,对于处理各种类型的数据,提供了更多的便利和灵活性。
头文件中的功能经常被用于模板编程、泛型编程以及容器、算法等标准库的实现中。
#include
:包含了使用向量(vector)容器的标准头文件。vector
是 C++ 标准库中的头文件,提供了向量(vector)容器的实现。std::vector
是一个动态数组,能够根据需要自动调整大小,是 C++ 中最常用的容器之一。
std::vector
的特点包括:
动态大小: std::vector
具有动态增长的能力,可以根据需要动态分配内存来存储元素。
随机访问: 可以通过索引来快速访问元素,支持常量时间复杂度的随机访问。
自动内存管理: std::vector
能够自动管理其内部的内存,当元素数量增加时,会自动重新分配内存空间。
与数组兼容: std::vector
与数组类似,但具有更多的功能和灵活性。
使用 std::vector
需要包含
头文件,它提供了在向量中添加、删除、访问元素等操作所需的接口和方法,如 push_back()
、pop_back()
、at()
、size()
等。
std::vector
在实现动态数组时非常有用,能够方便地管理一系列元素,尤其在不确定元素数量时,使用它能够更加灵活地处理数据集合。
以下是 Student
类的定义:
private
部分包含了 name
、id
和 score
三个私有成员变量,用于存储学生的姓名、ID 和分数。public
部分包含了类的公共接口,包括构造函数和成员函数,用于访问和操作私有成员变量。Student
类中,包括私有成员变量和公共成员函数。接下来是一些函数的定义:
// 添加学生信息
void addStudent(std::vector<Student> &students) {
// ... 省略部分代码
}
// 显示所有学生信息
void displayAllStudents(std::vector<Student> &students) {
// ... 省略部分代码
}
// 保存学生信息到文件
void saveToFile(std::vector<Student> &students) {
// ... 省略部分代码
}
// 从文件加载学生信息
void loadFromFile(std::vector<Student> &students) {
// ... 省略部分代码
}
这些函数包括了操作学生信息的功能,如添加学生信息、显示所有学生信息、将学生信息保存到文件以及从文件加载学生信息。
最后是 main
函数,程序的入口:
int main() {
std::vector<Student> students;
loadFromFile(students); // 从文件加载学生信息
int choice;
do {
// ... 省略部分代码
std::cin >> choice;
switch (choice) {
case 1:
addStudent(students);
break;
case 2:
displayAllStudents(students);
break;
case 3:
saveToFile(students);
break;
case 4:
std::cout << "Exiting...\n";
break;
default:
std::cout << "Invalid choice!\n";
break;
}
} while (choice != 4);
return 0;
}
这段代码包括了主程序的逻辑,使用一个 do-while
循环实现了一个简单的菜单选择器,让用户选择要执行的操作。根据用户的选择,调用相应的函数进行操作。
do-while
循环,根据用户的选择执行不同的操作。std::cin
和 std::cout
进行输入和输出操作。这些是代码中涉及的一些关键知识点和功能。理解和掌握这些知识点对于理解和编写类似的程序非常重要。
本文就到这里了,感谢您的阅读,明天还有更多的实例学习文章等着你 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 。