歌唱比赛评分

有十个选手参加歌唱比赛,十个裁判对每个选手的演唱进行打分,去掉一个最高分,去掉一个最低分,剩下分数的平均值作为每位选手最后的成绩。
要求:
1、采用结构体定义每个选手的参赛编号,姓名以及十个裁判打出的分数;
2、从键盘输入每个选手的相关信息:参赛编号,姓名和十个得分;
3、计算每位选手的最后得分,并按分数由高到低排序;
4、查询功能:输入参赛选手的编号或姓名(两个条件都能实现),便可输出该选手的得分以及排名;

C语言代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
#define A 10;
struct singer
{
    char num[20];
    char name[20];
    double mark[N];
    double avg;
    int grade;
};
struct singer average(struct singer students[N])
{
    int i , j;
    double sum = 0;
    double max , min;
    int m = 0, n = 0;
    for(i = 0; i < N; i ++)
    {
        max = 0 ;
        min = 100;
        for(j = 0; j < N; j ++)                           //查看每一名选手的最高成绩和最低成绩,用m和n做标记
        {
            n = 0;
            if(students[i].mark[j] < min)
            {
                min = students[i].mark[j];
                n = j;
            }
            m = 0;
            if(students[i].mark[j] > max)
            {
                max = students[i].mark[j];
                m = j;
            }
        }
        students[i].mark[n] = 0;       //循环接收后将最高成绩和最低成绩清除为0
        students[i].mark[m] = 0;
    }
    for(i = 0; i < N; i ++)
    {
        for(j = 0; j < N; j ++)
        {
            sum = sum + students[i].mark[j];          //分数依次相加
        }
        sum = sum / (A-2);                                //宏定义A为10,是指有10个裁判打分
        students[i].avg = sum;
        sum = 0;
    }
};
struct singer sort(struct singer students[N])
{
    struct singer Temp;
    int i , j;
    for(i = 0; i < N - 1; i ++)                     //利用两层循环进行平均分排序
    {
        for(j = i + 1; j < N ; j ++)
        {
            if(students[i].avg < students[j].avg)
            {
                Temp = students[i];
                students[i] = students[j];
                students[j] = Temp;
            }
        }
    }
    for(i = 0, j = 1; i < N; i ++)              //利用循环计算排名
    {
        if(students[i].avg == students[i-1].avg)     //如果当前成绩与上一名选手成绩相同,则当前选手排名与上一名选手相同
        {
            students[i].grade = students[i-1].grade;
        }
        else
        {
            students[i].grade = j;
        }
        j++;
    }
};
struct singer search(char flag[20], struct singer students[N])
{
    int i;
    for(i = 0; i < N; i ++)
    {   //用stecmp函数分别将students[i].num、strcmp(students[i].name与flag相比较,若返回值相等,则说明两个字符串相同
        if(strcmp(students[i].num,flag)==0||strcmp(students[i].name,flag)==0)
        {
            printf("成绩:%.2lf 排名:%d\n",students[i].avg,students[i].grade);    //输出成绩和排名
        }
    }
}
int main()
{
    struct singer students[N];
    int i, j;
    char flag[20];
    printf("请依次输入每名选手的参赛编号、姓名以及十个裁判打出的分数,中间以空格分隔:\n");
    for(i = 0; i < N; i ++)
    {
        scanf("%s%s", students[i].num, students[i].name);        //输入学号和姓名
        for(j = 0; j < N; j ++)
        {
            scanf("%lf", &students[i].mark[j]);                //循环输入得分
        }
    }
    printf("请输入待查询参赛选手的编号或姓名:");
    scanf("%s",flag);                   //输入待查找选手的信息
    average(students);                  //求平均分,并存入students.avg中
    sort(students);                     //计算成绩排名,结果存入students.grade中
    search(flag,students);
    return 0;
}
  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值