系列目录
在这一节中,我们将通过实现一个学生成绩管理系统来巩固和实践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 多线程网络服务器