完整c++设计一个小型学生信息管理系统,对成绩可以进行录入、增加、删除、查询等功能。
时间: 2023-07-10 13:34:42 浏览: 114
好的,下面是一个完整的C++实现,包括学生信息的结构体定义、学生信息管理类的实现、异常处理、数据存储等功能。
首先,我们定义一个学生信息的结构体,包括学生姓名、学号、班级、课程名称、成绩等信息。
```c++
struct Student {
string name;
string id;
string className;
string courseName;
float score;
};
```
接下来,我们定义一个学生信息管理类,该类实现对学生信息的录入、增加、删除、查询等功能。为了方便数据存储,我们使用了文件存储。
```c++
class StudentManager {
private:
vector<Student> students; // 存储所有学生信息的容器
string filename; // 数据存储的文件名
public:
// 构造函数,初始化数据存储文件名
StudentManager(const string& filename);
// 添加学生信息
void addStudent(const Student& student);
// 删除学生信息
void deleteStudent(const string& id);
// 修改学生信息
void updateStudent(const string& id, const Student& student);
// 查询学生信息
Student getStudent(const string& id);
// 获取所有学生信息
vector<Student> getAllStudents();
// 获取某个班级的所有学生信息
vector<Student> getStudentsByClass(const string& className);
// 获取某个课程的所有学生信息
vector<Student> getStudentsByCourse(const string& courseName);
// 从文件中读取学生信息
void loadFromFile();
// 将学生信息写入文件
void saveToFile();
};
```
在实现上述方法时,我们需要使用文件读写操作,这里使用C++标准库中的fstream类实现。我们需要在构造函数中初始化数据存储的文件名,并在析构函数中保存数据到文件。
```c++
StudentManager::StudentManager(const string& filename) {
this->filename = filename;
// 从文件中读取学生信息
loadFromFile();
}
void StudentManager::saveToFile() {
ofstream outfile(filename);
if(!outfile.is_open()) {
throw runtime_error("数据文件打开失败!");
}
for(auto& student : students) {
outfile << student.name << "," << student.id << "," << student.className << "," << student.courseName << "," << student.score << endl;
}
outfile.close();
}
void StudentManager::loadFromFile() {
ifstream infile(filename);
if(!infile.is_open()) {
throw runtime_error("数据文件打开失败!");
}
students.clear();
string line;
while(getline(infile, line)) {
stringstream ss(line);
string name, id, className, courseName;
float score;
getline(ss, name, ',');
getline(ss, id, ',');
getline(ss, className, ',');
getline(ss, courseName, ',');
ss >> score;
students.push_back({name, id, className, courseName, score});
}
infile.close();
}
```
接下来,我们可以实现添加学生信息的方法:
```c++
void StudentManager::addStudent(const Student& student) {
// 将学生信息存储到容器中
students.push_back(student);
// 将学生信息写入文件
saveToFile();
}
```
删除学生信息的方法可以这样实现:
```c++
void StudentManager::deleteStudent(const string& id) {
// 遍历容器,找到指定学号的学生信息并删除
for (auto it = students.begin(); it != students.end(); it++) {
if (it->id == id) {
students.erase(it);
// 将学生信息写入文件
saveToFile();
return;
}
}
throw runtime_error("未找到指定学号的学生信息!");
}
```
查询学生信息的方法可以这样实现:
```c++
Student StudentManager::getStudent(const string& id) {
// 遍历容器,找到指定学号的学生信息并返回
for (const auto& student : students) {
if (student.id == id) {
return student;
}
}
// 如果没有找到,抛出异常
throw runtime_error("未找到指定学号的学生信息!");
}
```
修改学生信息的方法可以这样实现:
```c++
void StudentManager::updateStudent(const string& id, const Student& student) {
// 遍历容器,找到指定学号的学生信息并修改
for (auto& s : students) {
if (s.id == id) {
s = student;
// 将学生信息写入文件
saveToFile();
return;
}
}
throw runtime_error("未找到指定学号的学生信息!");
}
```
获取所有学生信息的方法可以这样实现:
```c++
vector<Student> StudentManager::getAllStudents() {
return students;
}
```
获取某个班级的所有学生信息的方法可以这样实现:
```c++
vector<Student> StudentManager::getStudentsByClass(const string& className) {
vector<Student> result;
for (const auto& student : students) {
if (student.className == className) {
result.push_back(student);
}
}
return result;
}
```
获取某个课程的所有学生信息的方法可以这样实现:
```c++
vector<Student> StudentManager::getStudentsByCourse(const string& courseName) {
vector<Student> result;
for (const auto& student : students) {
if (student.courseName == courseName) {
result.push_back(student);
}
}
return result;
}
```
最后,我们可以在main函数中使用学生信息管理类来实现对学生信息的录入、增加、删除、查询等功能。
```c++
int main() {
try {
StudentManager manager("data.txt");
manager.addStudent({"张三", "1001", "班级1", "语文", 80});
manager.addStudent({"李四", "1002", "班级2", "数学", 90});
manager.addStudent({"王五", "1003", "班级1", "英语", 85});
auto allStudents = manager.getAllStudents();
for (const auto& student : allStudents) {
cout << student.name << " " << student.id << " " << student.className << " " << student.courseName << " " << student.score << endl;
}
auto class1Students = manager.getStudentsByClass("班级1");
for (const auto& student : class1Students) {
cout << student.name << " " << student.id << " " << student.className << " " << student.courseName << " " << student.score << endl;
}
auto englishStudents = manager.getStudentsByCourse("英语");
for (const auto& student : englishStudents) {
cout << student.name << " " << student.id << " " << student.className << " " << student.courseName << " " << student.score << endl;
}
manager.deleteStudent("1002");
auto student = manager.getStudent("1001");
student.score = 85;
manager.updateStudent("1001", student);
allStudents = manager.getAllStudents();
for (const auto& student : allStudents) {
cout << student.name << " " << student.id << " " << student.className << " " << student.courseName << " " << student.score << endl;
}
} catch (const exception& e) {
cerr << e.what() << endl;
}
return 0;
}
```
这样,我们就实现了一个小型学生信息管理系统,具备对成绩的录入、增加、删除、查询等功能,并且可以实现数据的持久化存储。
阅读全文