使用C语言统计学生成绩

某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。
考试后要求:
(1)计算每个学生的总分和平均分;
(2)按总分成绩由高到低排出成绩的名次;
(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
提示:用二维数组score存放每个学生各门课程的成绩,用一维数组num存放每个学生
的学号,用一维数组sum存放每个学生的总分,用一维数组aver存放每个学生的平均分。
(1)用函数编程实现计算每个学生的总分;
(2)用函数编程实现按总分由高到低对学生成绩排序,注意:排序时,一维数组sum
元素的变化应连同二维数组score和一维数组num和aver一起变化;
(3)用函数编程实现查找学号为k的学生在班级中的排名名次及相关成绩等信息,找
不到时返回-1值。

代码如下:

#include <stdio.h>
//计算总分
void total(int score[][3],int n,int sum[])
{
    int i,j;
    for (i=0;i<n;i++)
    {
        sum[i] = 0;
        for(j=0;j<3;j++)
            sum[i] += score[i][j];
    }
}
//计算平均分
void averger(int sum[],int n,float avg[])
{
    int i;
    for(i=0;i<n;i++)
        avg[i] = 1.0 * sum[i]/3;
}

//按总分排序
void sort(int sum[],int n,int score[][3],float avg[],int num[])
{
    int i,j;
    int t,k;
    float f;
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if (sum[j] < sum[j+1])
            {
                t = sum[j];
                sum[j] = sum[j+1];
                sum[j+1]=t;

                //交换平均分
                f=avg[j];
                avg[j+1]=avg[j+1];
                avg[j+1]=f;
                //交换score
                for(k=0;k<3;k++)
                {
                    t = score[j][k];
                    score[j][k]= score[j+1][k];
                    score[j+1][k] = t;
                }
                //交换学号
                t = num[j];
                num[j]=num[j+1];
                num[j+1]=t;
            }
        }
    }
}

//排名,并保存名次
void pm(int sum[],int pm[],int n)
{
    int i = 0;
    int mc = 1;
    pm[0] = 1;
    for (i=1;i<n;i++)
    {
        if(sum[i]== sum[i-1])
            pm[i] = mc;
        else
        {
            mc++;
            pm[i] = mc;
        }
    }
}


//打印名次表
void printmc(int num[],int n,int pm[])
{
    int i;
    printf("学号  排名\n");
    for (i=0;i<n;i++)
    {
        printf("%-2d  %d\n",num[i],pm[i]);
    }
}
//查找k
int findstu(int num[],int score[][3],int n,int sum[],int mc[],int k)
{
    int i=0;
    for (i=0;i<n;i++)
    {
        if(num[i] == k)
        {
            printf("学号:%d\n",num[i]);
            printf("成绩:%d %d %d\n",score[i][0],score[i][1],score[i][2]);
            printf("总成绩:%d\n",sum[i]);
            printf("名次:%d\n",mc[i]);
            break;
        }
    }
    if(i==n)
    {
        printf("未找到该学号学员\n");
        return -1;
    }
    return 0;
}

int main()
{
    int score[30][3],sum[30],num[30],mc[30];
    float avg[30];
    int n,k,i,j;
    printf("请输入学员人数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("请输入学员%d的数学、英语和物理成绩:",i+1);
        num[i] = i+1;
        for(j=0;j<3;j++)
            scanf("%d",&score[i][j]);
    }

    //计算总成绩
    total(score,n,sum);
    //计算平均成绩
    averger(sum,n,avg);
    //根据总成绩排序
    sort(sum,n,score,avg,num);
    //排名
    pm(sum,mc,n);
    //打印排名
    printmc(num,n,mc);
    //查找某个学号学员的信息
    printf("请输入要查找的学员学号:");
    scanf("%d",&k);
    findstu(num,score,n,sum,mc,k);
    return 0;
}

参考:


#include "stdio.h"

#define N 100
struct student{
    int id;
    char name[20];
    int kaoqun;
    int biaoxian;
    int zuoye;
    int biji;
    int sum;
}stud[N],t;

int main()
{
    int i,j;
    for(i=0;i<N;i++){
        printf("请输入第%d个学生信息\n",i+1);
        scanf("%d %s",&stud[i].id,&stud[i].name);
        fflush(stdin);
        scanf("%d %d %d %d",&stud[i].kaoqun,&stud[i].biaoxian,&stud[i].zuoye,&stud[i].biji);
        stud[i].sum = stud[i].kaoqun*0.3+stud[i].biaoxian*0.3+stud[i].zuoye*0.3+stud[i].biji*0.1;
    }
    
    //排序
    
    for (i = 0; i < N - 1; i++){
        for (j = 0; j < N - 1 - i; j++){ //按成绩对学生信息进行排序
            if (stud[j].sum > stud[j + 1].sum){ //整型数字的比较
                t = stud[j];
                stud[j] = stud[j + 1];
                stud[j + 1] = t;
            }
        }
    }
    //打印
    printf("学号\t姓名\t考勤\t表现\t作业\t笔记\t总分\t\n");
    for (i = 0; i < N; i++){
        printf("%d\t", stud[i].id);
        printf("%s\t", stud[i].name);
        printf("%d\t", stud[i].kaoqun);
        printf("%d\t", stud[i].biaoxian);
        printf("%d\t", stud[i].zuoye);
        printf("%d\t", stud[i].biji);
        printf("%d \n", stud[i].sum);
    }
    
    return 1;
}