白骑士的C++教学实战项目篇 4.2 学生成绩管理系统

19 篇文章 0 订阅
17 篇文章 0 订阅

系列目录

上一篇:白骑士的C++教学实战项目篇 4.1 简单的计算器

        在这一节中,我们将通过实现一个学生成绩管理系统来巩固和实践C++的知识。该系统将涉及数据结构设计、基本功能的实现(添加、删除、修改、查询)以及文件的存储与读取操作。

项目简介

        学生成绩管理系统是一种用于记录和管理学生成绩的应用程序。它可以实现以下功能:

  • 添加学生及其成绩
  • 删除学生及其成绩
  • 修改学生成绩
  • 查询学生成绩
  • 将学生成绩保存到文件中,并从文件中读取

        该系统将通过命令行界面与用户交互,接受用户的指令并进行相应的操作。

数据结构设计

        首先,我们需要设计一个数据结构来存储学生的信息和成绩。我们将使用结构体(struct)来定义学生的数据结构,包括学生的学号、姓名和成绩,代码如下:

#include <iostream>
#include <vector>
#include <string>
#include <fstream>


// 学生数据结构
struct Student {
    int id;

    std::string name;

    double score;
};


// 函数声明
void addStudent(std::vector<Student>& students);
void deleteStudent(std::vector<Student>& students);
void modifyStudent(std::vector<Student>& students);
void queryStudent(const std::vector<Student>& students);
void saveToFile(const std::vector<Student>& students, const std::string& filename);
void loadFromFile(std::vector<Student>& students, const std::string& filename);
void displayMenu();

功能实现

        我们将逐步实现添加、删除、修改、查询学生成绩的功能。

添加学生

void addStudent(std::vector<Student>& students) {
    Student student;

    std::cout << "Enter student ID: ";
    std::cin >> student.id;
    std::cout << "Enter student name: ";

    std::cin.ignore(); // 忽略上一个输入留下的换行符
    std::getline(std::cin, student.name);

    std::cout << "Enter student score: ";
    std::cin >> student.score;

    students.push_back(student);

    std::cout << "Student added successfully.\n";
}

删除学生

void deleteStudent(std::vector<Student>& students) {
    int id;

    std::cout << "Enter student ID to delete: ";
    std::cin >> id;

    for (auto it = students.begin(); it != students.end(); ++it) {
        if (it->id == id) {
            students.erase(it);

            std::cout << "Student deleted successfully.\n";

            return;
        }
    }

    std::cout << "Student not found.\n";
}

修改学生

void modifyStudent(std::vector<Student>& students) {
    int id;

    std::cout << "Enter student ID to modify: ";
    std::cin >> id;

    for (auto& student : students) {
        if (student.id == id) {
            std::cout << "Enter new student name: ";

            std::cin.ignore();
            std::getline(std::cin, student.name);

            std::cout << "Enter new student score: ";
            std::cin >> student.score;
            std::cout << "Student modified successfully.\n";

            return;
        }
    }

    std::cout << "Student not found.\n";
}

查询学生

void queryStudent(const std::vector<Student>& students) {
    int id;

    std::cout << "Enter student ID to query: ";
    std::cin >> id;

    for (const auto& student : students) {
        if (student.id == id) {
            std::cout << "Student ID: " << student.id << "\n";
            std::cout << "Student Name: " << student.name << "\n";
            std::cout << "Student Score: " << student.score << "\n";

            return;
        }
    }

    std::cout << "Student not found.\n";
}

文件存储与读取

        为了实现数据的持久化,我们需要将学生信息保存到文件中,并能够从文件中读取学生信息。

保存到文件

void saveToFile(const std::vector<Student>& students, const std::string& filename) {
    std::ofstream ofs(filename);

    if (!ofs) {
        std::cerr << "Error opening file for writing.\n";

        return;
    }

    for (const auto& student : students) {
        ofs << student.id << "\n" << student.name << "\n" << student.score << "\n";
    }

    ofs.close();

    std::cout << "Data saved to file successfully.\n";
}

从文件读取

void loadFromFile(std::vector<Student>& students, const std::string& filename) {
    std::ifstream ifs(filename);

    if (!ifs) {
        std::cerr << "Error opening file for reading.\n";

        return;
    }

    students.clear();
    Student student;

    while (ifs >> student.id) {
        ifs.ignore(); // 忽略换行符

        std::getline(ifs, student.name);

        ifs >> student.score;

        students.push_back(student);
    }

    ifs.close();

    std::cout << "Data loaded from file successfully.\n";
}

菜单展示

        我们还需要一个菜单来展示可用的操作,并根据用户选择调用相应的函数,代码如下:

void displayMenu() {
    std::cout << "Student Grade Management System\n";
    std::cout << "1. Add Student\n";
    std::cout << "2. Delete Student\n";
    std::cout << "3. Modify Student\n";
    std::cout << "4. Query Student\n";
    std::cout << "5. Save to File\n";
    std::cout << "6. Load from File\n";
    std::cout << "7. Exit\n";
    std::cout << "Enter your choice: ";
}


int main() {
    std::vector<Student> students;
    std::string filename = "students.txt";

    int choice;


    while (true) {
        displayMenu();

        std::cin >> choice;

        switch (choice) {
            case 1:
                addStudent(students);

                break;

            case 2:
                deleteStudent(students);

                break;

            case 3:
                modifyStudent(students);

                break;

            case 4:
                queryStudent(students);

                break;

            case 5:
                saveToFile(students, filename);

                break;

            case 6:
                loadFromFile(students, filename);

                break;

            case 7:
                std::cout << "Exiting...\n";

                return 0;

            default:
                std::cout << "Invalid choice. Please try again.\n";
        }
    }
}

总结

        通过实现这个学生成绩管理系统项目,我们复习了结构体、向量和文件操作等C++基础知识,并进一步理解了如何设计和实现一个实际的应用程序。该系统不仅实现了基本的学生成绩管理功能,还包括数据的持久化存储,能够更好地帮助我们掌握C++编程技巧。

下一篇:白骑士的C++教学实战项目篇 4.3 多线程网络服务器​​​​​​​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白骑士所长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值