C++学习之路(三)解析讲解超简单学生信息管理系统代码知识点 - 《根据实例学知识》

上文 《C++学习之路(二)C++如何实现一个超简单的学生信息管理系统》我们初步认识了用C++如何写一个简单的学生信息管理系统,这次我们来对上次的代码进行拆解学习一下。

#include <iostream>
#include <fstream> // 文件操作需要的头文件
#include <utility>
#include <vector>

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::ofstreamstd::ifstream 实现了学生信息的保存和加载,展示了如何使用文件流操作来持久化数据。控制流结构,如 switch-casedo-while 循环,被用来实现用户交互,允许用户选择不同功能。

在这里插入图片描述


开始讲解

我们来逐行讲解每行代码的功能,并且列出相关的知识点。

#include <iostream>
#include <fstream> // 文件操作需要的头文件
#include <utility>
#include <vector>

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>:包含了输入输出流的标准头文件。

iostream 是 C++ 中用于包含输入输出流的标准头文件。这个头文件提供了对输入输出流的支持,允许你在程序中使用 std::cinstd::cout 来进行标准输入和输出操作。

这个头文件中定义了 std::cinstd::cout,分别代表标准输入流和标准输出流。它们是 C++ 中进行基本输入和输出操作的主要工具。通过这个头文件,你可以使用流操作符 <<>> 来从控制台读取输入或将数据输出到控制台。

除了 std::cinstd::cout<iostream> 头文件还提供了其他与流相关的类和函数,以支持更多的输入输出操作。如,std::cerrstd::clogstd::streambufstd::ofstreamstd::ifstream

这个头文件是 C++ 标准库中非常基础且常用的一部分,几乎每个 C++ 程序都会用到它,因为它是进行输入输出操作的关键。


#include <fstream>:包含了文件输入输出流的标准头文件。

fstream 是 C++ 标准库中的一个头文件,提供了文件输入输出操作所需的类和函数。它是由 “file stream”(文件流)所组成的缩写,用于支持文件的读取和写入操作。

这个头文件定义了几个重要的类,其中最常用的有两个:

  1. std::ifstream 这个类表示输入文件流,用于从文件中读取数据。它提供了读取文件内容的方法,可以从文件中读取文本或二进制数据。

  2. std::ofstream 这个类表示输出文件流,用于向文件中写入数据。它提供了向文件写入内容的方法,可以用于创建文件并写入文本或二进制数据。

除了这两个主要的文件流类之外,<fstream> 头文件还定义了一些其他与文件输入输出相关的类和功能,如 std::fstream(用于同时进行文件读取和写入的文件流)以及一些与文件操作有关的函数和类型。

使用 <fstream> 头文件可以使程序能够读取和写入文件,对于文件的操作提供了丰富的支持和灵活性,使得 C++ 程序能够方便地处理文件和文件中的数据。


#include <utility>:包含了实用工具的标准头文件。

utility 是 C++ 标准库中的一个头文件,提供了一些用于处理通用数据的工具函数和类模板。

这个头文件中最常用的类是 std::pair,它是一个模板类,用于将两个值作为一对存储,可以容纳不同类型的数据。std::pair 提供了 firstsecond 两个公共成员,分别用于存储这两个值,这种数据结构经常用于创建关联性强的数据对。

除了 std::pair 之外,<utility> 头文件还定义了一些通用的函数,如 std::swap,用于交换两个值的内容;std::move,用于将左值转换为右值引用,支持移动语义;以及一些支持比较和逻辑运算的函数模板,如 std::rel_ops 等。

这个头文件提供了一些通用的、可复用的工具,对于处理各种类型的数据,提供了更多的便利和灵活性。<utility> 头文件中的功能经常被用于模板编程、泛型编程以及容器、算法等标准库的实现中。


#include <vector>:包含了使用向量(vector)容器的标准头文件。

vector 是 C++ 标准库中的头文件,提供了向量(vector)容器的实现。std::vector 是一个动态数组,能够根据需要自动调整大小,是 C++ 中最常用的容器之一。

std::vector 的特点包括:

  1. 动态大小: std::vector 具有动态增长的能力,可以根据需要动态分配内存来存储元素。

  2. 随机访问: 可以通过索引来快速访问元素,支持常量时间复杂度的随机访问。

  3. 自动内存管理: std::vector 能够自动管理其内部的内存,当元素数量增加时,会自动重新分配内存空间。

  4. 与数组兼容: std::vector 与数组类似,但具有更多的功能和灵活性。

使用 std::vector 需要包含 <vector> 头文件,它提供了在向量中添加、删除、访问元素等操作所需的接口和方法,如 push_back()pop_back()at()size() 等。

std::vector 在实现动态数组时非常有用,能够方便地管理一系列元素,尤其在不确定元素数量时,使用它能够更加灵活地处理数据集合。


以下是 Student 类的定义:

  • private 部分包含了 nameidscore 三个私有成员变量,用于存储学生的姓名、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::cinstd::cout 进行输入和输出操作。

这些是代码中涉及的一些关键知识点和功能。理解和掌握这些知识点对于理解和编写类似的程序非常重要。


本文就到这里了,感谢您的阅读,明天还有更多的实例学习文章等着你 🎆。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天河书阁 VicRestart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值