关于#c语言#的问题:编写程序输入所有学生一门课程的成绩,要求打印出该门课程的最高分、平均分、并按成绩从低到高排序输出所有学生的成绩(每行输出10个学生的成绩)

关于#c语言#的问题:编写程序输入所有学生一门课程的成绩,要求打印出该门课程的最高分、平均分、并按成绩从低到高排序输出所有学生的成绩(每行输出10个学生的成绩)

问题描述:

题目:某个班级有30个学生,编写程序输入所有学生一门课程的成绩,要求打印出该门课程的最高分、平均分、并按成绩从低到高排序输出所有学生的成绩(每行输出10个学生的成绩)。

PS:我只能把前一个人 成绩和后一个 比较大小 把大的成绩反到前面那个a[ ]里面,如何全部比较

img

#include<stdio.h>
int main(void)
{
    int a[30];
    int i,t,sum=0;
    for(i=0;i<30;i++)
    {
        scanf("请输入成绩为%d",&a[i]);
        sum+=a[i];
    }
    for(i=0;i<29;i++)
    {
        if(a[i]<=a[i+1])
        {
            t=a[i+1];
        } 
        else
        {
            t=a[i];
            a[i]=a[i+1];
            a[i+1]=t;
        }
    }
    printf("最高分为%d\n",t);
    printf("平均分为%d\n",sum/30);
    for(i=0;i<30;i++)
    {
        if(i%10==0)
        printf("\n");
        printf("%5d",a[i]);
    }
    return 0;
}


可以使用冒泡排序方法

#include <stdio.h>
int main() {
    int i,j,t.a[30];
    for(i=0;i<30;i++){
        scanf("%d",&a[i]);
    }
    for(i=0;i<29;i++){
        for(j=0;j<29-i;j++){
            if(a[j]>a[j+1]){
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
}

问题分开看的话
一遍堆排序可以找极值(最大最小值)
遍历一遍可以计算平均值
排序算法有多种

综合看可以根据实际需求取舍
方案1: 使用堆排序,第一次建堆就可以输出最大值了,只是在排序过程中无法完成平均分的计算,需要多加一次遍历计算平均分
优点:快速输出最大分数,不用等排序完成,时间复杂度平均是nlogn

方案2:使用快速排序等其它排序方法,完成排序后后输出最大分数,多加一次遍历计算平均分。
时间复杂度平均为nlogn,不稳定

方案3:使用冒泡等排序算法,冒一次泡就可以计算出平均分
优点:不用等排序完成即可输出平均分
时间复杂度n2