22级计算机类共有5个班,每班现假定有50名同学,本学期有6门课程考试,每门课程成绩是百分制。现规定每个同学的成绩记录包含以下数据:学号、姓名以及各门课程的成绩共8项,其中学号是一个8位的数字,每个学生都有唯一的学号。编写程序完成以下操作要求: (1) 编写一个成绩生成函数,使用随机数方法,利用随机函数生成学生的各门课程的成绩(每门课程的成绩都是0∽100之间的整数),通过调用该函数生成全部学生的成绩(因为学生太多,现在不要你输入真实成绩),学号可以简单按顺序号来,姓名也可以简单处理(比如:字母加数字的形式)。以班为单位把成绩记录(包括学号 姓名 6门课程成绩)存入5个不同的输入文件in1(in2、in3、in4、in5)中(每个文件分别存为二进制格式和文本格式两份),在文件内以学号排序; (2)计算每个同学的平均成绩并把它保存在每项成绩记录的后面,对平均成绩按从大到小的递减方式进行班内排序,并在每行成绩记录前面加上排序后的序号;以班为单位保存为输出文件out1(out2、out3、out4、out5)(每个文件分别存为二进制格式和文本格式两份);
时间: 2024-02-17 20:02:46 浏览: 72
Students-elective-courses-system.zip_假定有n门课程
5星 · 资源好评率100%
以下是一个实现上述要求的 C++ 程序,其中使用了随机数产生虚拟成绩,使用了 STL 中的容器和算法来进行排序和数据处理。需要注意的是,由于每个学生的成绩记录包含了 8 个数据项,因此在二进制文件中的存储方式需要进行特殊处理。
```cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
// 学生结构体,包含学号、姓名和各门课程的成绩
struct Student {
int id; // 学号
string name; // 姓名
vector<int> scores; // 成绩
double avgScore; // 平均成绩
};
// 生成随机数,返回 0~maxNum 之间的整数
int getRandom(int maxNum) {
return rand() % (maxNum + 1);
}
// 生成学生的成绩记录
void generateScores(vector<Student>& students) {
for (int i = 0; i < students.size(); i++) {
// 生成学号
students[i].id = i + 1;
// 生成姓名
students[i].name = "Student" + to_string(i + 1);
// 生成各门课程的成绩
for (int j = 0; j < 6; j++) {
int score = getRandom(100);
students[i].scores.push_back(score);
}
}
}
// 将学生的成绩记录写入二进制文件
void writeBinaryFile(const string& filename, const vector<Student>& students) {
ofstream out(filename, ios::out | ios::binary);
if (!out) {
cerr << "Failed to open file " << filename << endl;
return;
}
// 将每个学生的成绩记录写入文件
for (const Student& student : students) {
// 先写入学号
out.write((char*)&student.id, sizeof(student.id));
// 再写入姓名
out.write(student.name.c_str(), student.name.size() + 1);
// 再写入各门课程的成绩
for (int score : student.scores) {
out.write((char*)&score, sizeof(score));
}
}
out.close();
}
// 将学生的成绩记录写入文本文件
void writeTextFile(const string& filename, const vector<Student>& students) {
ofstream out(filename, ios::out);
if (!out) {
cerr << "Failed to open file " << filename << endl;
return;
}
// 将每个学生的成绩记录写入文件
for (const Student& student : students) {
// 先写入学号和姓名
out << student.id << " " << student.name << " ";
// 再写入各门课程的成绩
for (int score : student.scores) {
out << score << " ";
}
out << endl;
}
out.close();
}
// 计算每个同学的平均成绩
void calculateAvgScore(vector<Student>& students) {
for (Student& student : students) {
double totalScore = 0.0;
for (int score : student.scores) {
totalScore += score;
}
student.avgScore = totalScore / student.scores.size();
}
}
// 按平均成绩从大到小排序,并添加序号
void sortAndAddRank(vector<Student>& students) {
sort(students.begin(), students.end(), [](const Student& a, const Student& b) {
return a.avgScore > b.avgScore;
});
for (int i = 0; i < students.size(); i++) {
students[i].scores.push_back(i + 1); // 添加排序后的序号
}
}
// 将学生的成绩记录写入输出文件
void writeOutputFile(const string& filename, const vector<Student>& students) {
ofstream out(filename, ios::out);
if (!out) {
cerr << "Failed to open file " << filename << endl;
return;
}
// 将每个学生的成绩记录写入文件
for (const Student& student : students) {
// 先写入排序后的序号
out << student.scores.back() << " ";
// 再写入学号和姓名
out << student.id << " " << student.name << " ";
// 再写入各门课程的成绩和平均成绩
for (int score : student.scores) {
out << score << " ";
}
out << endl;
}
out.close();
}
int main() {
srand(time(nullptr)); // 初始化随机数种子
const int numClasses = 5; // 班级数
const int numStudentsPerClass = 50; // 每班学生数
vector<vector<Student>> classes(numClasses); // 每个班级的学生
// 初始化学生信息
for (int i = 0; i < numClasses; i++) {
classes[i].resize(numStudentsPerClass);
generateScores(classes[i]); // 生成成绩
calculateAvgScore(classes[i]); // 计算平均成绩
sortAndAddRank(classes[i]); // 排序并添加排序后的序号
}
// 将学生的成绩记录写入文件
for (int i = 0; i < numClasses; i++) {
const string filename = "in" + to_string(i + 1);
writeBinaryFile(filename + ".bin", classes[i]); // 写入二进制文件
writeTextFile(filename + ".txt", classes[i]); // 写入文本文件
}
// 将排序后的成绩记录写入文件
for (int i = 0; i < numClasses; i++) {
const string filename = "out" + to_string(i + 1);
writeBinaryFile(filename + ".bin", classes[i]); // 写入二进制文件
writeTextFile(filename + ".txt", classes[i]); // 写入文本文件
}
return 0;
}
```
阅读全文