现有四个班级,每个班级有45名学生,本学期有5门课程考试,,每门课程成绩是百分制。假定每个同学的成绩记录包含:学号、姓名各门课程的成绩共7项,其中学号是一个10位的字符串,每个学生都有唯一的学号,并且这4个班的成绩分别放在4个数组中。
要求利用随机函数编写一个函数给每个学生生成各科考试的成绩(0~100之间的整数),通过调用该函数生成全部学生的成绩
编写计算平均成绩的函数,计算每个同学的平均成绩并保存在成绩数组中
用冒泡排序对四个班级的成绩按照每个同学的平均成绩进行非递增的排序
用选择排序对四个班级的成绩按照每个同学的平均成绩进行非递增的排序
将排序后的每个同学的平均成绩构造一个按所有同学的平均成绩排序的单链表
我可以完成这个程序。
可以使用随机数生成函数rand(),每次生成一个0~100之间的整数,并将其存储到成绩数组中。具体实现代码如下:
#include <cstdlib> // 需要头文件来使用rand()
#include <ctime> // 需要头文件来获取时间作为随机数生成器的种子
// 生成随机数的函数
int generateRandomScore() {
return rand() % 101; // 生成0~100之间的整数
}
// 生成各科成绩的函数
void generateScores(int scoreArray[][5], int classNum) {
srand(time(nullptr)); // 使用当前时间作为随机数生成器的种子,确保每次随机数不同
for (int i = 0; i < classNum; i++) {
for (int j = 0; j < 45; j++) {
for (int k = 0; k < 5; k++) {
scoreArray[i][k] = generateRandomScore();
}
}
}
}
可以遍历每个班级的成绩数组,计算出每个学生的平均成绩,并将其存储到成绩数组的第6个元素中,即可完成该步骤。具体实现代码如下:
// 计算每个学生的平均成绩
void calculateAverageScores(int scoreArray[][5], int classNum) {
for (int i = 0; i < classNum; i++) {
for (int j = 0; j < 45; j++) {
int sum = 0;
for (int k = 0; k < 5; k++) {
sum += scoreArray[i][k];
}
float average = sum / 5.0f;
scoreArray[i][5] = average;
}
}
}
冒泡排序可以通过双重循环遍历数组实现,每次比较相邻的两个元素,如果需要交换,就进行交换。具体实现代码如下:
// 冒泡排序
void bubbleSort(int scoreArray[][6], int numRows, int numCols) {
for (int i = 0; i < numRows - 1; i++) {
for (int j = 0; j < numRows - i - 1; j++) {
if (scoreArray[j][5] < scoreArray[j + 1][5]) {
for (int k = 0; k < numCols; k++) {
int temp = scoreArray[j][k];
scoreArray[j][k] = scoreArray[j + 1][k];
scoreArray[j + 1][k] = temp;
}
}
}
}
}
选择排序也是通过双重循环实现,每次遍历剩余的元素,找到其中的最值并进行交换。具体实现代码如下:
// 选择排序
void selectionSort(int scoreArray[][6], int numRows, int numCols) {
for (int i = 0; i < numRows - 1; i++) {
int maxIndex = i;
for (int j = i + 1; j < numRows; j++) {
if (scoreArray[j][5] > scoreArray[maxIndex][5]) {
maxIndex = j;
}
}
if (maxIndex != i) {
for (int k = 0; k < numCols; k++) {
int temp = scoreArray[i][k];
scoreArray[i][k] = scoreArray[maxIndex][k];
scoreArray[maxIndex][k] = temp;
}
}
}
}
这里需要定义一个结构体,来表示每个学生的信息,包括学号、姓名、各科成绩和平均成绩。然后遍历成绩数组,将每个学生的信息放入结构体中,以平均成绩为关键字,使用链表进行排序。具体实现代码如下:
#include <iostream>
#include <algorithm> // 使用std::sort()进行排序
#include <vector> // 使用std::vector作为链表的存储容器
using namespace std;
// 学生信息结构体
struct Student {
string id;
string name;
vector<int> scores; // 使用vector存储各科成绩
float average;
};
// 将成绩数组转换为学生信息结构体
void scoresToStudents(int scoreArray[][6], int numRows, vector<Student>& students) {
for (int i = 0; i < numRows; i++) {
Student student;
student.id = to_string((i / 45) * 1000 + i % 45); // 生成学号,例如:第1个班第1个学生的学号为“1001”
student.name = "Student " + to_string(i + 1); // 生成姓名,例如:第1个学生的姓名为“Student 1”
for (int j = 0; j < 5; j++) {
student.scores.push_back(scoreArray[i / 45][j * 45 + i % 45]); // 将成绩存储到vector中
}
student.average = scoreArray[i / 45][5]; // 将平均成绩存储到结构体中
students.push_back(student); // 将结构体存储到vector中
}
}
// 比较函数,用于std::sort()排序
bool compare(const Student& a, const Student& b) {
return a.average > b.average; // 按照平均成绩从大到小排序
}
// 同学的平均成绩构造一个按所有同学的平均成绩排序的单链表
void sortStudentsByAverage(vector<Student>& students) {
sort(students.begin(), students.end(), compare); // 使用std::sort()进行排序
}
完成以上步骤后,程序实现完毕。完整代码如下: