学生成绩排序,使用随机数,冒泡排序,选择排序结构体,链表等

现有四个班级,每个班级有45名学生,本学期有5门课程考试,,每门课程成绩是百分制。假定每个同学的成绩记录包含:学号、姓名各门课程的成绩共7项,其中学号是一个10位的字符串,每个学生都有唯一的学号,并且这4个班的成绩分别放在4个数组中。
要求利用随机函数编写一个函数给每个学生生成各科考试的成绩(0~100之间的整数),通过调用该函数生成全部学生的成绩
编写计算平均成绩的函数,计算每个同学的平均成绩并保存在成绩数组中
用冒泡排序对四个班级的成绩按照每个同学的平均成绩进行非递增的排序
用选择排序对四个班级的成绩按照每个同学的平均成绩进行非递增的排序
将排序后的每个同学的平均成绩构造一个按所有同学的平均成绩排序的单链表

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7765226
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 这里需要对堆有一定的了解,堆就是一个比较特殊的完全二叉树,在最大堆里,每个节点的值都大于其左右两个孩子节点的值。这就是最大堆。反之就是最小堆。拿最大堆举例子,每次堆顶的元素值,不就是当前数列的最大吗?这不就成选择排序里的简单排序了吗?找完之后,将他和完全二叉树里最后一个结点的值进行交换,然后做一个自顶向下的自我调整,将他再次调整成一个完全二叉堆。第二次取最大的树,这时我们需要将上一次找到的结点屏蔽掉,不然会陷入一个死循环。无数次找完之后,再按层序的思想将二叉树里的数据遍历到一个数组当中,这时的数组为一个有序的数组。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 算法思想

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以完成这个程序。

    1. 随机生成各科考试的成绩(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();
                }
            }
        }
    }
    
    1. 计算每个同学的平均成绩,并保存在成绩数组中。

    可以遍历每个班级的成绩数组,计算出每个学生的平均成绩,并将其存储到成绩数组的第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;
            }
        }
    }
    
    1. 使用冒泡排序对四个班级的成绩按照每个同学的平均成绩进行非递增的排序。

    冒泡排序可以通过双重循环遍历数组实现,每次比较相邻的两个元素,如果需要交换,就进行交换。具体实现代码如下:

    // 冒泡排序
    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;
                    }
                }
            }
        }
    }
    
    1. 使用选择排序对四个班级的成绩按照每个同学的平均成绩进行非递增的排序。

    选择排序也是通过双重循环实现,每次遍历剩余的元素,找到其中的最值并进行交换。具体实现代码如下:

    // 选择排序
    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;
                }
            }
        }
    }
    
    1. 将排序后的每个同学的平均成绩构造一个按所有同学的平均成绩排序的单链表。

    这里需要定义一个结构体,来表示每个学生的信息,包括学号、姓名、各科成绩和平均成绩。然后遍历成绩数组,将每个学生的信息放入结构体中,以平均成绩为关键字,使用链表进行排序。具体实现代码如下:

    #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()进行排序
    }
    

    完成以上步骤后,程序实现完毕。完整代码如下: