5个学生,4门课程,编写函数实现(1)找出有课程不及格的学生,输出他们的序号和全部 课程成绩及平均成绩(2)按每个学生平均成绩由高到低对学生排序。要求函数参数使用指向一 维数组的指针

我的问题是:在调用排序函数中,我先得到每个人的平均分放入一维数组,再10-16行冒泡法排完序后得到此时的序号,但是不知道第二步想法成不成立,或者该怎么做,以下是我的代码,谢谢

img

img

这样写的 存的 c 肯定是不对的, 排序会比较很多次的,而且 也不能说第一次就是最小或最大的数,这样 复制c数组是有问题的
可以这样:

  • c 数组和 b 数组一起初始化,c数组中,每个就存 b数组的索引即可。
  • 排序b数组的同时,也将 相应的 c 数组中的 元素进行调整
void paixu(int (*p)[4])
{
    int i, j, t, b[5], c[5];
    for (i = 0; i < 5;i++)
    {
        int sum = 0;
        for (j=0;j < 4;j++)
            sum += *(*(p + j) + j);
        b[i] = sum / 4;
        c[i] = i;
    }

    for(i=0;i< 4; i++)
    {
        for(j=0;j<4-i;j++)
            if(b[j]<b[j+1])
            {
                t=b[j+1];
                b[j+1]=b[j];
                b[j]=t;
                t=c[j+1];
                c[j+1]=c[j];
                c[j] = t;
            }
    }
    printf("按平均成绩排序从大到小学号依此是:");
    for (i=0; i < 5;i++)
        printf("%d", c[i]);
}
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7759002
  • 这篇博客也不错, 你可以看下利用指针编写程序,定义一个3行3列的二维数组,并在程序中对其进行赋值,不需要从键盘输入,数组元素的类型不限,输出该二维数组以及各行的均值(保留至少两位小数),各行的均值可直接输出,也可存储于一维数组中
  • 除此之外, 这篇博客: 【数据结构】入栈、出栈代码-栈的顺序存储中的 测试试一下吧-判断字符串是否对称 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 算法思路:先将字符串入栈,然后出栈时一个一个和字符串对比,如果全部相同则表示对称,否则不对称。

    algotirhm.c

    #include "algorithm.h"
    
    
    //判断字符串是否是对称串
    bool symmetry(ElemeType_SStk str[])
    {
    	SqStack s;//创建一个栈
    	int i;
    	ElemeType_SStk e;
    	InitStack(s);//初始化一个栈
    	for (i = 0; str[i]!='\0'; i++)
    	{
    		Push(s, str[i]);//入栈
    	}
    	for (i = 0; str[i] != '\0'; i++)
    	{
    		Pop(s, e);
    		if (str[i] != e)
    		{
    			DestroyStack(s);//栈用完了得销毁
    			return false;
    		}
    	}
    	DestroyStack(s);//栈用完了得销毁   无论是true还是false,使用完的栈都要销毁
    	return true;
    }

    algotirhm.h

    #ifndef _INC_ALGORITHM
    #define _INC_ALGORITHM
    /*
    用于验证底层
    用于设计算法
    */
    #include "stack.h"
    
    bool symmetry(ElemeType_SStk str[]);//判断字符串是否是对称串
    
    #endif
    

    main.c

    #include "algorithm.h"
    
    ElemeType_SStk str[10] = { 1,2,3,4,4,3,2,1 };
    
    int main()
    {
    	if (symmetry(str))printf("true\n");
    	else printf("false\n");
    	return 0;
    }

  • 您还可以看一下 李月喜老师的企业微信开发自建内部应用开发篇课程中的 开发文档如何阅读,如何寻求帮助,如何找到同行小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    根据您提供的问题,您想要编写一个函数实现在一个包含5个学生和4个课程成绩的数组中找到有课程不及格的学生,并输出他们的序号和全部课程成绩及平均成绩。同时,您希望能够按每个学生平均成绩由高到低对该数组进行排序。因此,您需要采用一些排序算法来实现这个功能。下面我给您介绍几种可能适用的算法:

    1. 冒泡排序 冒泡排序是一种最简单的排序算法,它的思想是从数组头部开始,每次比较相邻的两个数,将较大的数往后移动,每轮循环可以保证当前未排序区间内最大的数被移动到了该区间的最后位置。因此,可以在每一轮循环结束后将当前轮最大值的下标保存下来,以便后续输出。具体实现步骤如下:
    void BubbleSort(int *arr, int n) {
        for (int i = 0; i < n - 1; i++) {
            int flag = 1; // 标记当前轮是否发生了交换
            for (int j = 0; j < n - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) { // 交换位置
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = 0;
                }
            }
            if (flag) break; // 如果当前轮未发生交换,则说明已有序,直接返回
        }
    }
    
    1. 快速排序 快速排序是一种常用的排序算法,它的核心思想是通过一趟排序将待排序的记录分隔成独立的两部分,前一部分记录的关键字均比后一部分记录的关键字小,然后对这两部分记录分别进行排序,以达到整个序列有序的目的。快速排序的基本思路如下:

    2. 选择一个基准元素,通常选择第一个元素或最后一个元素;

    3. 通过一趟扫描,将序列分为两个部分,第一部分的所有元素都小于等于基准元素,第二部分的所有元素都大于等于基准元素;
    4. 分别对这两个部分递归地进行快速排序,直到整个序列有序。

    具体实现步骤如下:

    // 快速排序算法
    void QuickSort(int *arr, int left, int right) {
        if (left >= right) return; // 递归终止条件:待排序区间只有一个元素
        int i = left, j = right, pivot = arr[left]; // 选择左侧元素为基准
        while (i < j) {
            while (i < j && arr[j] >= pivot) j--; // 从右向左扫描,找到第一个小于基准的位置
            if (i < j) arr[i++] = arr[j]; // 将该元素放到左侧
            while (i < j && arr[i] < pivot) i++; // 从左向右扫描,找到第一个大于等于基准的位置
            if (i < j) arr[j--] = arr[i]; // 将该元素放到右侧
        }
        arr[i] = pivot; // 将基准元素放到中间
        QuickSort(arr, left, i - 1); // 递归左侧区间
        QuickSort(arr, i + 1, right); // 递归右侧区间
    }
    
    1. 堆排序 与前面两种算法不同的是,堆排序并不是选择排序或交换排序的一种,而是基于选择的排序算法。它的基本思想是先将待排序序列构造成一个大根堆,此时整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值;然后对剩余n-1个元素重新构造成一个堆,重复执行上述操作,直到排序完成。具体实现步骤如下:
    // 堆排序算法
    void HeapSort(int *arr, int n) {
        // 1. 构建大根堆
        for (int i = n / 2 - 1; i >= 0; i--) { // 从最后一个非叶子节点向上遍历
            Heapify(arr, n, i);
        }
        // 2. 每次取出堆顶元素(最大值),并调整成新的堆
        for (int j = n - 1; j >= 0; j--) {
            int temp = arr[0];
            arr[0] = arr[j];
            arr[j] = temp; // 堆顶元素与末尾元素交换
            Heapify(arr, j, 0); // 调整成新的堆
        }
    }
    
    // 调整以i为根节点的大根堆
    void Heapify(int *arr, int n, int i) {
        int largest = i; // 初始化最大值为根节点
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        if (left < n && arr[left] > arr[largest]) largest = left; // 左孩子比根节点大
        if (right < n && arr[right] > arr[largest]) largest = right; // 右孩子比根节点大
        if (largest != i) { // 如果根节点不是最大值,则交换位置,并调整成新的堆
            int temp = arr[i];
            arr[i] = arr[largest];
            arr[largest] = temp;
            Heapify(arr, n, largest);
        }
    }
    

    除了以上三种排序算法之外,还有许多其他的排序算法(如归并排序、计数排序等),您可以根据实际情况选择合适的算法。不过基本思想都是一致的:将待排序序列进行分割,通过比较和交换操作将其变成有序序列。希望以上内容能够帮到您解决问题,如有疑问还请随时联系我。