如何保存为另一个文件)。 下面是一个C++程序的实现示例: ```cpp #include <iostream> #include <fstream> #include <vector> using namespace std; // 课程信息结构体 struct Course { int code; // 课程编号 string name; // 课程名称 }; // 评分项目结构体 struct ScoreItem { string name; // 项目名称 float weight; // 所占比例 }; // 学生成绩结构体 struct StudentScore { int studentId; // 学号 string studentName; // 姓名 vector<float> scores; // 成绩列表 float totalScore; // 总成绩 }; // 保存数据到文件 void saveDataToFile(vector<Course> courses, vector<ScoreItem> scoreItems, vector<StudentScore> studentScores) { ofstream file("data.txt", ios::binary); // 保存课程信息和评分项目信息 int coursesCount = courses.size(); file.write((char*)&coursesCount, sizeof(int)); for (int i = 0; i < coursesCount; i++) { file.write((char*)&courses[i], sizeof(Course)); } int scoreItemsCount = scoreItems.size(); file.write((char*)&scoreItemsCount, sizeof(int)); for (int i = 0; i < scoreItemsCount; i++) { file.write((char*)&scoreItems[i], sizeof(ScoreItem)); } // 保存学生成绩 int studentScoresCount = studentScores.size(); file.write((char*)&studentScoresCount, sizeof(int)); for (int i = 0; i < studentScoresCount; i++) { file.write((char*)&studentScores[i], sizeof(StudentScore)); } file.close(); } // 从文件中读取数据 void loadDataFromFile(vector<Course>& courses, vector<ScoreItem>& scoreItems, vector<StudentScore>& studentScores) { ifstream file("data.txt", ios::binary); // 读取课程信息和评分项目信息 int coursesCount; file.read((char*)&coursesCount, sizeof(int)); for (int i = 0; i < coursesCount; i++) { Course course; file.read((char*)&course, sizeof(Course)); courses.push_back(course); } int scoreItemsCount; file.read((char*)&scoreItemsCount, sizeof(int)); for (int i = 0; i < scoreItemsCount; i++) { ScoreItem scoreItem; file.read((char*)&scoreItem, sizeof(ScoreItem)); scoreItems.push_back(scoreItem); } // 读取学生成绩 int studentScoresCount; file.read((char*)&studentScoresCount, sizeof(int)); for (int i = 0; i < studentScoresCount; i++) { StudentScore studentScore; file.read((char*)&studentScore, sizeof(StudentScore)); studentScores.push_back(studentScore); } file.close(); } // 录入或修改课程信息 void enterOrUpdateCourseInfo(vector<Course>& courses) { Course course; cout << "请输入课程编号:"; cin >> course.code; cout << "请输入课程名称:"; cin >> course.name; bool updated = false; for (int i = 0; i < courses.size(); i++) { if (courses[i].code == course.code) { courses[i] = course; // 更新已有课程信息 updated = true; break; } } if (!updated) { courses.push_back(course); // 添加新的课程信息 } } // 录入或修改评分项目信息 void enterOrUpdateScoreItemInfo(vector<ScoreItem>& scoreItems) { ScoreItem scoreItem; cout << "请输入项目名称:"; cin >> scoreItem.name; cout << "请输入所占比例:"; cin >> scoreItem.weight; bool updated = false; for (int i = 0; i < scoreItems.size(); i++) { if (scoreItems[i].name == scoreItem.name) { scoreItems[i] = scoreItem; // 更新已有评分项目信息 updated = true; break; } } if (!updated) { scoreItems.push_back(scoreItem); // 添加新的评分项目信息 } } // 录入学生成绩 void enterStudentScores(vector<Course> courses, vector<ScoreItem> scoreItems, vector<StudentScore>& studentScores) { if (courses.empty() || scoreItems.empty()) { cout << "请先录入课程信息和评分项目信息!" << endl; return; } int courseIndex; for (int i = 0; i < courses.size(); i++) { cout << i + 1 << ". " << courses[i].name << endl; } cout << "请输入要录入成绩的课程序号:"; cin >> courseIndex; courseIndex--; float totalWeight = 0; for (int i = 0; i < scoreItems.size(); i++) { totalWeight += scoreItems[i].weight; } vector<float> weights; for (int i = 0; i < scoreItems.size(); i++) { weights.push_back(scoreItems[i].weight / totalWeight); // 计算各项目权重 } bool updated = false; for (int i = 0; i < studentScores.size(); i++) { if (studentScores[i].studentId == courseIndex) { cout << "学生成绩已存在,是否更新?(Y/N)"; char choice; cin >> choice; if (choice == 'Y' || choice == 'y') { studentScores[i].scores.clear(); for (int j = 0; j < scoreItems.size(); j++) { float score; cout << "请输入" << scoreItems[j].name << "的成绩:"; cin >> score; studentScores[i].scores.push_back(score); } // 计算总成绩 studentScores[i].totalScore = 0; for (int j = 0; j < scoreItems.size(); j++) { studentScores[i].totalScore += studentScores[i].scores[j] * weights[j]; } updated = true; } break; } } if (!updated) { StudentScore studentScore; studentScore.studentId = courseIndex; cout << "请输入学号:"; cin >> studentScore.studentName; for (int i = 0; i < scoreItems.size(); i++) { float score; cout << "请输入" << scoreItems[i].name << "的成绩:"; cin >> score; studentScore.scores.push_back(score); } // 计算总成绩 studentScore.totalScore = 0; for (int j = 0; j < scoreItems.size(); j++) { studentScore.totalScore += studentScore.scores[j] * weights[j]; } studentScores.push_back(studentScore); } } // 显示课程信息 void displayCourseInfo(vector<Course> courses) { cout << "课程信息:" << endl; for (int i = 0; i < courses.size(); i++) { cout << "课程编号: " << courses[i].code << ",课程名称: " << courses[i].name << endl; } } // 显示评分项目信息 void displayScoreItemInfo(vector<ScoreItem> scoreItems) { cout << "评分项目信息:" << endl; for (int i = 0; i < scoreItems.size(); i++) { cout << "项目名称: " << scoreItems[i].name << ",所占比例: " << scoreItems[i].weight << "%" << endl; } } // 显示学生成绩单 void displayStudentScores(vector<Course> courses, vector<ScoreItem> scoreItems, vector<StudentScore> studentScores) { if (courses.empty() || scoreItems.empty()) { cout << "还没有录入课程信息和评分项目信息!" << endl; return; } for (int i = 0; i < studentScores.size(); i++) { cout << "学号: " << studentScores[i].studentId + 1 << ",姓名: " << studentScores[i].studentName << endl; cout << "成绩详情:" << endl; for (int j = 0; j < scoreItems.size(); j++) { cout << scoreItems[j].name << ": " << studentScores[i].scores[j] << endl; } cout << "总成绩: " << studentScores[i].totalScore << endl; } } int main() { vector<Course> courses; vector<ScoreItem> scoreItems; vector<StudentScore> studentScores; // 检查是否已保存数据 ifstream file("data.txt", ios::binary); if (file) { cout << "检测到上次已保存的数据,是否读取?(Y/N)"; char choice; cin >> choice; if (choice == 'Y' || choice == 'y') { loadDataFromFile(courses, scoreItems, studentScores); } file.close(); } // 用户身份选择 int identity; cout << "请选择身份:1.教师 2.学生" << endl; cin >> identity; if (identity == 1) { while (true) { cout << "请选择操作:1.录入/修改课程信息 2.录入/修改评分项目信息 3.录入学生成绩 4.显示课程信息 5.显示评分项目信息 6.显示学生成绩单 7.保存数据并退出" << endl; int choice; cin >> choice; switch (choice) { case 1: enterOrUpdateCourseInfo(courses); break; case 2: enterOrUpdateScoreItemInfo(scoreItems); break; case 3: enterStudentScores(courses, scoreItems, studentScores); break; case 4: displayCourseInfo(courses); break; case 5: displayScoreItemInfo(scoreItems); break; case 6: displayStudentScores(courses, scoreItems, studentScores); break; case 7: saveDataToFile(courses, scoreItems, studentScores); return 0; default: cout << "请选择正确的操作!" << endl; break; } } } else if (identity == 2) { displayStudentScores(courses, scoreItems, studentScores); } else { cout << "请选择正确的身份!" << endl; } return 0; } ``` 注意:上述示例中的数据保存在名为"data.txt"的二进制文件中。 [2024-05-24 02:01:02 | AI写代码神器 | 6361点数解答]