C语言-学生学号成绩读入程序(输出了学生总分、平均分、名次以及学生信息的查询)

任务描述

成绩排名次
某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。考试后要求:
(1) 计算每个学生的总分和平均分;
(2) 按总分成绩由高到低排出成绩的名次;
(3) 输出名次表,表格内包括学生编号、各科分数、总分和平均分;
(4) 任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
提示:用二维数组score存放每个学生各门课程的成绩,用一维数组num存放每个学生的学号,用一维数组sum存放每个学生的总分,用一维数组aver存放每个学生的平均分。

测试说明

测试数据:

20183001 98 99 97
20183002 89 85 90
20183003 77 67 88
20183004 88 82 95
20183005 56 76 80
20183006 66 65 74
20183007 99 99 91
20183008 56 63 60
20183009 45 56 63
20183010 90 88 87


输入学生信息的格式为:

按总分排名,按名次输出名次表,输出内容为:


任意输入一个学号,查找并输出该学生信息,输出内容为:

找不到时输出为:

注:找不到时格式字符串为:

1.Please enter searching number:20183006

2.position: NO | MT EN PH SUM AVER

3.8 20183006 | 66 65 74 205 68

printf("position: %8s\t|%6s%6s%6s%7s%8s\n"," NO ","MT","EN","PH","SUM","AVER"); 

 

#include  <stdio.h>  
#define STU 30  
#define COURSE 3  
void Input(long num[], int score[][COURSE], int n);
void GetSumAver(int score[][COURSE], int n, int sum[], float aver[]);
void Sort(long num[], int score[][COURSE], int n, int sum[], float aver[]);
void Print(long num[], int score[][COURSE], int n, int sum[], float aver[]);
int Search(long num[], int n, long x);

int main(void)  
{  
    int n, score[STU][COURSE],sum[STU],pos;  
    long num[STU],x;  
    float aver[STU];  
    printf("Please enter the total number of the students(n<=30):");  
    scanf("%d", &n);                    //输入参加考试的学生人数  
    printf("Enter No. and score as: MT  EN  PH\n");  
    Input(num, score, n);                //输入学生成绩
    GetSumAver(score, n, sum, aver);    //计算总分和平均分  
    printf("Before sort:\n");  
    Print(num, score, n, sum, aver);  
    Sort(num, score, n, sum, aver);        //排名次  
    printf("After sort:\n");  
    Print(num, score, n, sum, aver);
    printf("Please enter searching number:\n");
    scanf("%ld", &x);//以长整型的格式输入待查找学生的学号
    pos = Search(num, n, x); //名次查询
    if(pos != -1)
    {
        printf("position:   %8s\t|%6s%6s%6s%7s%8s\n","  NO    ","MT","EN","PH","SUM","AVER"); 
        printf("%8d    %4ld\t|%6d%6d%6d%7d%8.0f\n",
               pos+1, num[pos], score[pos][0], score[pos][1], score[pos][2], sum[pos], aver[pos]);

    }
    else
    {
        printf("Not found!\n");
    }
    return 0;  
}  

// 函数功能:输入某班学生期末考试三门课程成绩  
void Input(long num[], int score[][COURSE], int n)  
{  
    int  i, j;  
    for (i=0; i<n; i++)  
    {  
        scanf("%ld", &num[i]);  
        for (j=0; j<COURSE; j++)  
        {  
                scanf("%d", &score[i][j]);  
        }  
    }  
}

// 函数功能:计算每个学生的总分和平均分,结果存入对应的sum数组和aver数组  
void GetSumAver(int score[][COURSE], int n, int sum[], float aver[])
{
    int i, j;
    for(i=0; i<n; i++)
    {
        sum[i] = 0;
        for(j=0; j<COURSE; j++)
        {
            sum[i] = sum[i] + score[i][j];
        }
        aver[i] = (float)sum[i] / COURSE;
    }
}

// 函数功能:按总分成绩由高到低排出成绩的名次。注意,对应的学号、成绩、总分和平均分都需要保持一致
void Sort(long num[], int score[][COURSE], int n, int sum[], float aver[])
{
    int i, j, k, m;
    int temp1;
    long temp2;
    float temp3;
    for(i=0; i<n-1; i++)
    {
        k = i;
        for(j=i+1; j<n; j++)
        {
            if(sum[j] > sum[k])
            {
                k =j;
            }
        }
        if(k != i)
        {
            temp1 = sum[k]; sum[k] = sum[i]; sum[i] = temp1;
            temp2 = num[k]; num[k] = num[i]; num[i] = temp2;
            temp3 = aver[k]; aver[k] = aver[i]; aver[i] = temp3;
            for(m=0; m<COURSE; m++)
            {
                temp1 = score[k][m];
                score[k][m] = score[i][m];
                score[i][m] = temp1;
            }
        }
    }
}

// 函数功能:输出名次表,表格内包括学生编号、各科分数、总分和平均分  
void Print(long num[], int score[][COURSE], int n,  
            int sum[], float aver[])  
{  
    int  i, j;
    printf("%8s\t|%6s%6s%6s%7s%8s\n","  NO    ","MT","EN","PH","SUM","AVER");  
    printf("---------------------------------------------------\n");
    for (i=0; i<n; i++)  
    {  
        printf("%ld\t|", num[i]);  
        for (j=0; j<COURSE; j++)  
        {  
                printf("%6d", score[i][j]);  
        }  
        printf("%7d%8.0f\n", sum[i], aver[i]);  
    }  
}

//函数功能:在学号数组中顺序查找学生学号
//              找到时,返回学生学号在学号数组中的小标位置,否则返回值-1
int Search(long num[], int n, long x)
{
    int i;
    for(i=0; i<n; i++)
    {
        if(num[i] == x)
        {
            return i;
        }
    }
    return -1;
}

 

  • 0
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Color20

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值