学分管理系统
基本要求:
假设每位学生必须完成基础课 50 学分,专业课 50 学分,选修课 24 学分,人文类课程 8 学分,实践
性课程 20 学分才能够毕业。在管理学分是,要考虑每个学分的课程类别。
功能要求:
1) 能够通过键盘输入某位学生的学分
2) 给定学号,显示某位学生的学分完成情况
3) 给定某个班级编号,显示该班所有学生的学分完成情况
4) 给定某位学生的学号,修改该学生的学分信息
5) 按照某类课程的学分高低排序
6) 能够将所有学生的学分信息读写文件
引用chatgpt部分指引作答:
运行结果:
以下是一个用C++编写的学分管理系统的示例代码,满足您提出的基本要求和功能要求:
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct Student {
string studentId;
int basicCredits;
int majorCredits;
int electiveCredits;
int humanitiesCredits;
int practicalCredits;
};
void inputStudentCredits(Student& student) {
cout << "输入学生ID:";
cin >> student.studentId;
cout << "输入基础课程学分:";
cin >> student.basicCredits;
cout << "输入专业课程学分:";
cin >> student.majorCredits;
cout << "输入选修课程学分:";
cin >> student.electiveCredits;
cout << "输入人文课程学分:";
cin >> student.humanitiesCredits;
cout << "输入实践课程学分:";
cin >> student.practicalCredits;
}
void displayStudentCredits(const Student& student) {
cout << "学生ID:" << student.studentId << endl;
cout << "基础课程学分:" << student.basicCredits << endl;
cout << "专业课程学分:" << student.majorCredits << endl;
cout << "选修课程学分:" << student.electiveCredits << endl;
cout << "人文课程学分:" << student.humanitiesCredits << endl;
cout << "实践课程学分:" << student.practicalCredits << endl;
}
void displayClassCredits(const vector<Student>& students) {
for (const auto& student : students) {
displayStudentCredits(student);
cout << "---------------------" << endl;
}
}
void modifyStudentCredits(vector<Student>& students, const string& studentId) {
for (auto& student : students) {
if (student.studentId == studentId) {
inputStudentCredits(student);
return;
}
}
cout << "未找到ID为 " << studentId << " 的学生。" << endl;
}
bool compareByCourseCredits(const Student& student1, const Student& student2) {
int totalCredits1 = student1.basicCredits + student1.majorCredits + student1.electiveCredits + student1.humanitiesCredits + student1.practicalCredits;
int totalCredits2 = student2.basicCredits + student2.majorCredits + student2.electiveCredits + student2.humanitiesCredits + student2.practicalCredits;
return totalCredits1 > totalCredits2;
}
void sortByCourseCredits(vector<Student>& students) {
sort(students.begin(), students.end(), compareByCourseCredits);
}
void writeStudentCreditsToFile(const vector<Student>& students, const string& filename) {
ofstream outFile(filename);
if (outFile.is_open()) {
for (const auto& student : students) {
outFile << student.studentId << " "
<< student.basicCredits << " "
<< student.majorCredits << " "
<< student.electiveCredits << " "
<< student.humanitiesCredits << " "
<< student.practicalCredits << endl;
}
cout << "学生学分已写入文件。" << endl;
outFile.close();
}
else {
cout << "无法打开文件。" << endl;
}
}
vector<Student> readStudentCreditsFromFile(const string& filename) {
vector<Student> students;
ifstream inFile(filename);
if (inFile.is_open()) {
Student student;
while (inFile >> student.studentId
>> student.basicCredits
>> student.majorCredits
>> student.electiveCredits
>> student.humanitiesCredits
>> student.practicalCredits) {
students.push_back(student);
}
cout << "已从文件中读取学生学分。" << endl;
inFile.close();
}
else {
cout << "无法打开文件。" << endl;
}
return students;
}
int main() {
vector<Student> students;
string filename = "student_credits.txt";
// 从文件读取学生学分信息
students = readStudentCreditsFromFile(filename);
int choice;
string studentId;
do {
cout << "1. 输入学生学分" << endl;
cout << "2. 按学生ID显示学生学分" << endl;
cout << "3. 显示班级学分" << endl;
cout << "4. 修改学生学分" << endl;
cout << "5. 按课程学分排序学生" << endl;
cout << "6. 将学生学分写入文件" << endl;
cout << "7. 退出" << endl;
cout << "请输入您的选择:";
cin >> choice;
switch (choice) {
case 1:
{
Student newStudent;
inputStudentCredits(newStudent);
students.push_back(newStudent);
break;
}
case 2:
cout << "请输入学生ID:";
cin >> studentId;
for (const auto& student : students) {
if (student.studentId == studentId) {
displayStudentCredits(student);
break;
}
}
break;
case 3:
displayClassCredits(students);
break;
case 4:
cout << "请输入学生ID:";
cin >> studentId;
modifyStudentCredits(students, studentId);
break;
case 5:
sortByCourseCredits(students);
cout << "已按课程学分排序学生。" << endl;
displayClassCredits(students);
break;
case 6:
writeStudentCreditsToFile(students, filename);
break;
case 7:
cout << "正在退出..." << endl;
break;
default:
cout << "无效的选择,请重试。" << endl;
}
cout << endl;
} while (choice != 7);
return 0;
}
这只是一个简单的示例代码,并且没有进行输入验证。在实际应用中,您可能需要添加更多的错误检查和边界情况处理来增强系统的健壮性和稳定性。
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
// 定义学生结构体
struct Student {
int id;
int basic_credit;
int major_credit;
int elective_credit;
int human_credit;
int practice_credit;
};
// 函数原型
void input_student(Student& s);
void output_student(Student& s);
void output_all_students();
void modify_student();
void sort_students();
void save_students();
// 保存所有的学生信息
Student students[100];
int num_students = 0;
int main() {
int choice;
while (true) {
cout << "请选择功能:" << endl;
cout << "1. 输入学生信息" << endl;
cout << "2. 显示学生信息" << endl;
cout << "3. 显示所有学生信息" << endl;
cout << "4. 修改学生信息" << endl;
cout << "5. 按照学分排序" << endl;
cout << "6. 保存学生信息到文件" << endl;
cout << "7. 从文件中读取学生信息" << endl;
cout << "0. 退出程序" << endl;
cout << "选择功能:";
cin >> choice;
switch (choice) {
case 1:
input_student(students[num_students]);
num_students++;
break;
case 2:
output_student(students[0]);
break;
case 3:
output_all_students();
break;
case 4:
modify_student();
break;
case 5:
sort_students();
break;
case 6:
save_students();
break;
case 7:
// TODO: 从文件中读取学生信息
break;
case 0:
return 0;
default:
cout << "无效的选择,请重新选择功能。" << endl;
}
}
}
// 输入一个学生的学分信息
void input_student(Student& s) {
cout << "请输入学生的学号:";
cin >> s.id;
cout << "请输入学生的基础课学分:";
cin >> s.basic_credit;
cout << "请输入学生的专业课学分:";
cin >> s.major_credit;
cout << "请输入学生的选修课学分:";
cin >> s.elective_credit;
cout << "请输入学生的人文类课程学分:";
cin >> s.human_credit;
cout << "请输入学生的实践性课程学分:";
cin >> s.practice_credit;
cout << "学生信息输入完毕。" << endl;
}
// 输出一个学生的学分信息
void output_student(Student& s) {
cout << "学号:" << s.id << endl;
cout << "基础课学分:" << s.basic_credit << endl;
cout << "专业课学分:" << s.major_credit << endl;
cout << "选修课学分:" << s.elective_credit << endl;
cout << "人文类课程学分:" << s.human_credit << endl;
cout << "实践性课程学分:" << s.practice_credit << endl;
}
// 输出所有学生的学分信息
void output_all_students() {
for (int i = 0; i < num_students; i++) {
output_student(students[i]);
cout << endl;
}
}
// 修改某个学生的学分信息
void modify_student() {
int id;
cout << "请输入要修改学生的学号:";
cin >> id;
for (int i = 0; i < num_students; i++) {
if (students[i].id == id) {
cout << "请输入学生的基础课学分:";
cin >> students[i].basic_credit;
cout << "请输入学生的专业课学分:";
cin >> students[i].major_credit;
cout << "请输入学生的选修课学分:";
cin >> students[i].elective_credit;
cout << "请输入学生的人文类课程学分:";
cin >> students[i].human_credit;
cout << "请输入学生的实践性课程学分:";
cin >> students[i].practice_credit;
cout << "学生信息修改完毕。" << endl;
return;
}
}
cout << "找不到对应的学生信息。" << endl;
}
// 按照学分总数排序并输出学生信息
void sort_students() {
// 使用 STL 的 sort 函数
sort(students, students + num_students, [](Student& a, Student& b) -> bool {
int a_total = a.basic_credit + a.major_credit + a.elective_credit + a.human_credit + a.practice_credit;
int b_total = b.basic_credit + b.major_credit + b.elective_credit + b.human_credit + b.practice_credit;
return a_total > b_total;
});
output_all_students();
}
// 将所有学生的信息保存到文件
void save_students() {
string filename;
cout << "请输入要保存到的文件名:";
cin >> filename;
ofstream fout(filename);
if (!fout.is_open()) {
cout << "无法打开文件。" << endl;
return;
}
fout << num_students << endl;
for (int i = 0; i < num_students; i++) {
fout << students[i].id << ' ';
fout << students[i].basic_credit << ' ';
fout << students[i].major_credit << ' ';
fout << students[i].elective_credit << ' ';
fout << students[i].human_credit << ' ';
fout << students[i].practice_credit << endl;
}
fout.close();
cout << "学生信息保存成功。" << endl;
}