C++ 学籍管理系统:基础功能实现及代码示例
C++ 学籍管理系统:基础功能实现及代码示例
本教程提供一个使用 C++ 实现的简单学籍管理系统的代码示例,涵盖学生基本信息、成绩录入、查询、删除、排序等功能。代码基于文本文件输入输出,易于理解和修改。
数据文件
- A.txt (学生基本信息) 学号 姓名 性别 宿舍号码 电话号码 01 张成成 男 501 87732111 02 李成华 女 101 87723112 03 王成凤 女 101 87723112 04 张明明 男 502 87734333 05 陈东 男 501 87732111 06 李果 男 502 87734333 07 张园园 女 102 87756122 ...
- B.txt (学生成绩信息) 学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 01 A01 大学物理 3 66 78 82 02 B03 高等数学 4 78 -1 90 01 B03 高等数学 4 45 -1 88 02 C01 VF 3 65 76 66 ...
功能说明
- 数据录入: 对 B.txt 进行数据录入,包含学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩。综合成绩和实得学分由程序自动计算。
- 查询: 分为学生基本情况查询和成绩查询两种。
- 学生基本情况查询: 输入学号或姓名,查询并显示学生基本信息;输入宿舍号码,查询并显示该宿舍所有学生信息。
- 成绩查询: 输入学号,查询并显示该学生的所有课程信息,包括课程编号、课程名称、综合成绩、实得学分等。
- 删除: 当在 A.txt 中删除一个学生时,自动地在 B.txt 中删除此人所有信息。
- 排序: 支持按综合成绩或实得学分升序或降序排序并显示数据。
C++ 代码实现
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
struct Student {
string studentID;
string name;
string gender;
string dormitory;
string phoneNumber;
};
struct Course {
string studentID;
string courseID;
string courseName;
int credit;
int usualGrade;
int experimentGrade;
int paperGrade;
int comprehensiveGrade;
int earnedCredit;
};
vector<Student> students;
vector<Course> courses;
// 从文件读取学生信息
void readStudentsFromFile(string filename) {
ifstream file(filename);
if (!file) {
cout << "Error opening file: " << filename << endl;
return;
}
string line;
while (getline(file, line)) {
istringstream iss(line);
Student student;
iss >> student.studentID >> student.name >> student.gender >> student.dormitory >> student.phoneNumber;
students.push_back(student);
}
file.close();
}
// 从文件读取课程信息
void readCoursesFromFile(string filename) {
ifstream file(filename);
if (!file) {
cout << "Error opening file: " << filename << endl;
return;
}
string line;
while (getline(file, line)) {
istringstream iss(line);
Course course;
iss >> course.studentID >> course.courseID >> course.courseName >> course.credit >> course.usualGrade >> course.experimentGrade >> course.paperGrade;
courses.push_back(course);
}
file.close();
}
// 将课程信息写入文件
void writeCoursesToFile(string filename) {
ofstream file(filename);
if (!file) {
cout << "Error opening file: " << filename << endl;
return;
}
for (const Course& course : courses) {
file << course.studentID << " " << course.courseID << " " << course.courseName << " " << course.credit << " " << course.usualGrade << " " << course.experimentGrade << " " << course.paperGrade << " " << course.comprehensiveGrade << " " << course.earnedCredit << endl;
}
file.close();
}
// 计算综合成绩和实得学分
void calculateComprehensiveGradeAndEarnedCredit() {
for (Course& course : courses) {
if (course.experimentGrade == -1) {
course.comprehensiveGrade = course.usualGrade * 0.3 + course.paperGrade * 0.7;
} else {
course.comprehensiveGrade = course.usualGrade * 0.15 + course.experimentGrade * 0.15 + course.paperGrade * 0.7;
}
if (course.comprehensiveGrade >= 90) {
course.earnedCredit = course.credit;
} else if (course.comprehensiveGrade >= 80) {
course.earnedCredit = course.credit * 0.8;
} else if (course.comprehensiveGrade >= 70) {
course.earnedCredit = course.credit * 0.75;
} else if (course.comprehensiveGrade >= 60) {
course.earnedCredit = course.credit * 0.6;
} else {
course.earnedCredit = 0;
}
}
}
// 添加课程
void addCourse() {
Course course;
cout << "Enter student ID: ";
cin >> course.studentID;
cout << "Enter course ID: ";
cin >> course.courseID;
cout << "Enter course name: ";
cin >> course.courseName;
cout << "Enter credit: ";
cin >> course.credit;
cout << "Enter usual grade: ";
cin >> course.usualGrade;
cout << "Enter experiment grade (-1 if none): ";
cin >> course.experimentGrade;
cout << "Enter paper grade: ";
cin >> course.paperGrade;
courses.push_back(course);
}
// 显示学生信息
void displayStudentInfo(const Student& student) {
cout << "Student ID: " << student.studentID << endl;
cout << "Name: " << student.name << endl;
cout << "Gender: " << student.gender << endl;
cout << "Dormitory: " << student.dormitory << endl;
cout << "Phone Number: " << student.phoneNumber << endl;
}
// 显示课程信息
void displayCourseInfo(const Course& course) {
cout << "Course ID: " << course.courseID << endl;
cout << "Course Name: " << course.courseName << endl;
cout << "Comprehensive Grade: " << course.comprehensiveGrade << endl;
cout << "Earned Credit: " << course.earnedCredit << endl;
}
// 搜索学生信息
void searchStudentInfo() {
int choice;
cout << "Search by: " << endl;
cout << "1. Student ID" << endl;
cout << "2. Name" << endl;
cout << "Enter your choice: ";
cin >> choice;
if (choice == 1) {
string studentID;
cout << "Enter student ID: ";
cin >> studentID;
for (const Student& student : students) {
if (student.studentID == studentID) {
displayStudentInfo(student);
break;
}
}
} else if (choice == 2) {
string name;
cout << "Enter name: ";
cin >> name;
for (const Student& student : students) {
if (student.name == name) {
displayStudentInfo(student);
}
}
} else {
cout << "Invalid choice." << endl;
}
}
// 搜索课程信息
void searchCourseInfo() {
string studentID;
cout << "Enter student ID: ";
cin >> studentID;
for (const Course& course : courses) {
if (course.studentID == studentID) {
displayCourseInfo(course);
}
}
}
// 删除学生
void deleteStudent(string studentID) {
auto studentIter = find_if(students.begin(), students.end(), [&](const Student& student) {
return student.studentID == studentID;
});
if (studentIter != students.end()) {
students.erase(studentIter);
courses.erase(remove_if(courses.begin(), courses.end(), [&](const Course& course) {
return course.studentID == studentID;
}), courses.end());
cout << "Student deleted successfully." << endl;
} else {
cout << "Student not found." << endl;
}
}
// 按综合成绩排序
void sortCoursesByComprehensiveGrade(bool ascending) {
sort(courses.begin(), courses.end(), [&](const Course& course1, const Course& course2) {
return ascending ? course1.comprehensiveGrade < course2.comprehensiveGrade : course1.comprehensiveGrade > course2.comprehensiveGrade;
});
}
// 按实得学分排序
void sortCoursesByEarnedCredit(bool ascending) {
sort(courses.begin(), courses.end(), [&](const Course& course1, const Course& course2) {
return ascending ? course1.earnedCredit < course2.earnedCredit : course1.earnedCredit > course2.earnedCredit;
});
}
int main() {
readStudentsFromFile("A.txt");
readCoursesFromFile("B.txt");
calculateComprehensiveGradeAndEarnedCredit();
int choice;
while (true) {
cout << "Menu: " << endl;
cout << "1. Add course" << endl;
cout << "2. Search student info" << endl;
cout << "3. Search course info" << endl;
cout << "4. Delete student" << endl;
cout << "5. Sort courses by comprehensive grade" << endl;
cout << "6. Sort courses by earned credit" << endl;
cout << "0. Exit" << endl;
cout << "Enter your choice: ";
cin >> choice;
if (choice == 1) {
addCourse();
} else if (choice == 2) {
searchStudentInfo();
} else if (choice == 3) {
searchCourseInfo();
} else if (choice == 4) {
string studentID;
cout << "Enter student ID: ";
cin >> studentID;
deleteStudent(studentID);
} else if (choice == 5) {
int sortChoice;
cout << "Sort by: " << endl;
cout << "1. Ascending" << endl;
cout << "2. Descending" << endl;
cout << "Enter your choice: ";
cin >> sortChoice;
bool ascending = sortChoice == 1;
sortCoursesByComprehensiveGrade(ascending);
} else if (choice == 6) {
int sortChoice;
cout << "Sort by: " << endl;
cout << "1. Ascending" << endl;
cout << "2. Descending" << endl;
cout << "Enter your choice: ";
cin >> sortChoice;
bool ascending = sortChoice == 1;
sortCoursesByEarnedCredit(ascending);
} else if (choice == 0) {
writeCoursesToFile("B.txt");
break;
} else {
cout << "Invalid choice." << endl;
}
}
return 0;
}
注意: 该代码仅实现基本功能,可根据实际需求进行改进。
运行说明: 将 A.txt 和 B.txt 文件与代码文件放置在同一目录下,然后编译运行代码。
原文地址: https://www.cveoy.top/t/topic/o3WF 著作权归作者所有。请勿转载和采集!