2023秋 C理论A期末复习 6-9评委打分

本文讲述了如何使用C语言为一场新生知识竞赛设计程序,包括从评委打分中剔除最高分和最低分,计算每位选手的最终得分并进行排名,最后以指定格式打印结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

学校进行新生知识竞赛,最终n名同学进入决赛(n<=20)。为此,学生会邀请了7名德高望重的老教授与10名学生组成的大众评委一起作为评委。同时,也请学习了c语言的你帮忙编写一个程序,将评委给出的成绩,去掉一个最高分,去掉一个最低分后,计算出各位选手的最终得分,并按排名显示。
为方便提取每个学生信息,你设计了一个结构体类型Score,包含学生的编号(id)、姓名(name,不超过10个字符),并以一维数组value存储17名评委给出的成绩,同时将计算出的选手获得的最终成绩finalScore、比赛排名rank也作为成员记录到该结构体中,方便选手查询自己的名次。
定义一个一维数组grade存储20位学生成绩。
需要完成的函数功能为:

  1. GetScore(struct Score grade[], int n): 读入17个评委给出的n个学生成绩;

  2. CalcuScore(struct Score grade[], int n): 计算n个学生的最终成绩finalScore;

  3. Ranking(struct Score grade[], int n): 依据最终成绩finalScore,计算出学生当前排名,赋给结构体成员rank;

  4. PrintScore(struct Score grade[], int n): 每行按照 “第i名 编号 姓名 最终成绩”的格式打印所有选手名次。每两部分之间一个空格,最终成绩按6列保留2位小数输出

自定义结构体类型

struct Score {  //成员包括学生编号、姓名、评分、总成绩、排名

};

函数接口定义:

void GetScore( struct Score grade[], int n );
void CalcuScore(struct Score grade[], int n);
void Ranking(struct Score grade[], int n);
void PrintScore(struct Score grade[], int n);
 

其中,grade[]n都是主调函数传入的参数。grade[]是结构体数组,n是选手人数,不超过20。

裁判测试程序样例:

#include<stdio.h>
struct Score {  //成员包括学生编号、姓名、评分、总成绩、排名

};

void GetScore( struct Score grade[], int n );
void CalcuScore(struct Score grade[], int n);
void Ranking(struct Score grade[], int n);
void PrintScore(struct Score grade[], int n);

int main()
{
    int n;
    scanf("%d", &n); //确定参加的选手人数
    struct Score grade[20];
    GetScore(grade, n);
    CalcuScore(grade, n);
    Ranking(grade, n);
    PrintScore(grade, n);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

10
20001 Sandy  82  79  87  64  82  75  72  94  80  94  66  82  95  98  83  83  64
20002 Andy  95  65  83  95  93  65  72  86  66  75  84  73  85  74  84  60  68
20003 Kimmy  90  68  60  98  64  81  84  81  68  74  69 100  64  96  88  86  78
20004 Sussan  82  76  89  65  65  88  90  93  62  95  64  64  80  88  69  65  89
20005 Ryan  93  65  97  80  91  92  92  99  65  91  79  96 100  95  66  85  91
20006 Jone  74  67  68  94  84  86  91  86  63  62  71  96  92  68  74  96  63
20007 Tom   75  78  98  61 100  66  97  88  72  83  97  82  71  67  60  75  60
20008 Pokky  85  73  72  88  81  74  97  81  69  77  66  92  83  78  73  71  68
20009 Adolph  94  92  81  67  80  92  74  72  81  90  88  67  95  67  84  88  77
20010 Scolt  92  93  88  70  60  85  98  97  66  97  61  97  82  65  74  73  67

输出样例:

第1名 20005 Ryan  87.47
第2名 20009 Adolph  81.80
第3名 20001 Sandy  81.20
第4名 20010 Scolt  80.47
第5名 20003 Kimmy  79.27
第6名 20006 Jone  78.47
第7名 20007 Tom  78.00
第8名 20002 Andy  77.87
第9名 20004 Sussan  77.80
第10名 20008 Pokky  77.67

 答案:

struct Score {  //成员包括学生编号、姓名、评分、总成绩、排名
    int id,rank;
    char name[15];
    int value[20];
    float finalScore;
};


void GetScore( struct Score grade[], int n ){
    int i,j;
    for (i=0;i<n;i++){
        scanf("%d %s",&grade[i].id,&grade[i].name);
        for (j=0;j<17;j++){
            scanf("%d",&grade[i].value[j]);
        }
    }
    return 0;
}


void CalcuScore(struct Score grade[], int n){
    int i,j,max,min,sum;
    for (i=0;i<n;i++){
        max=0;
        min=100;
        sum=0;
        for (j=0;j<17;j++){
            if (grade[i].value[j]>max)
                max=grade[i].value[j];
            else if (grade[i].value[j]<min)
                min=grade[i].value[j];
            sum+=grade[i].value[j];
        }
        grade[i].finalScore=(sum-max-min)/15.0;
    }
    return 0;
}


void Ranking(struct Score grade[], int n){
    int i,j;
    struct Score k;
    for (i=0;i<n;i++){
        for (j=0;j<n-i-1;j++){
            if (grade[j].finalScore<grade[j+1].finalScore){
                k=grade[j];
                grade[j]=grade[j+1];
                grade[j+1]=k;
            }
        }
    }
    for (i=0;i<n;i++){
        grade[i].rank=i+1;
    }
    return 0;
}


void PrintScore(struct Score grade[], int n){
    int i;
    for (i=0;i<n;i++){
        printf("第%d名 %d %s %6.2f\n",grade[i].rank,grade[i].id,grade[i].name,grade[i].finalScore);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值