华为od机试真题:智能成绩表(C语言)

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试
在这里插入图片描述

题目描述

小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?

输入描述

第1行输入两个整数,学生人数n和科目数量m。0<n<100,0<m<10

第2行输入m个科目名称,彼此之间用空格隔开。科目名称只由英文字母构成,单个长度不超过10个字符。科目的出现顺序和后续输入的学生成绩一一对应。不会出现重复的科目名称。

第3行开始的n行,每行包含一个学生的姓名和该生m个科目的成绩(空格隔开),学生不会重名。学生姓名只由英文字母构成,长度不超过10个字符。成绩是0~100的整数,依次对应第2行中输入的科目。

第n+2行,输入用作排名的科目名称。若科目不存在,则按总分进行排序。

输出描述

输出一行,按成绩排序后的学生名字,空格隔开。成绩相同的按照学生姓名字典顺序排序。

示例1

输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 100 82
shuxue

输出:
xiaohua fangfang minmin

说明:
按shuxue成绩排名,依次是xiaohua、fangfang、minmin

示例2

输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen

输出:
fangfang minmin xiaohua

说明:
排序科目不存在,按总分排序,fangfang和minmin总分相同,按姓名的字典顺序,fangfang排在前面

题解

题目类型

该题目属于排序算法题,考察学生成绩排序,结合字符串和数字的处理。

解题思路

  1. 输入数据处理:读取学生人数和科目数量,接着读取科目名称,随后读取每个学生的姓名和对应的成绩。
  2. 总分计算:在读取学生成绩的同时计算每个学生的总分。
  3. 排序关键字确定:读取要进行排序的科目名称,确定排序是按某个具体科目还是按总分。
  4. 排序:利用快速排序 qsort,根据排序的科目或总分进行排序。如果成绩相同,按照学生姓名的字典顺序排序。
  5. 输出结果:按照排序后的顺序输出学生的名字。

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义学生人数和科目数量
int n, m;
int sortIndex = -1; // 排序索引,默认-1表示按总分排序

typedef struct {
    char name[20];   // 学生姓名
    int scores[100]; // 学生成绩数组
    int totalScore;  // 学生总分
} Student;

// 比较函数,用于qsort排序
int cmp(const void* a, const void* b) {
    const Student* stu1 = (const Student*)a;
    const Student* stu2 = (const Student*)b;

    // 如果按某个科目排序
    if (sortIndex != -1) {
        if (stu1->scores[sortIndex] != stu2->scores[sortIndex]) {
            return stu2->scores[sortIndex] - stu1->scores[sortIndex];
        }
    } else { // 否则按总分排序
        if (stu1->totalScore != stu2->totalScore) {
            return stu2->totalScore - stu1->totalScore;
        }
    }

    // 如果成绩相同,按姓名字典顺序排序
    return strcmp(stu1->name, stu2->name);
}

int main() {
    // 输入学生人数和科目数量
    scanf("%d %d", &n, &m);
    char courses[20][20];
    
    // 输入科目名称
    for (int i = 0; i < m; i++) scanf("%s", courses[i]);

    Student students[100];

    // 输入每个学生的姓名和成绩,并计算总分
    for (int i = 0; i < n; i++) {
        scanf("%s", students[i].name);
        int totalScore = 0;
        for (int j = 0; j < m; j++) {
            scanf("%d", &students[i].scores[j]);
            totalScore += students[i].scores[j];
        }
        students[i].totalScore = totalScore;
    }

    // 输入排序的科目名称
    char course[20];
    scanf("%s", course);

    // 确定排序索引
    for (int i = 0; i < m; i++) {
        if (strcmp(courses[i], course) == 0) {
            sortIndex = i;
            break;
        }
    }

    // 对学生数组进行排序
    qsort(students, n, sizeof(Student), cmp);

    // 输出排序后的学生姓名
    for (int i = 0; i < n; i++) {
        if (i + 1 == n) {
            printf("%s\n", students[i].name);
        } else {
            printf("%s ", students[i].name);
        }
    }

    return 0;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

什码情况

你的鼓励就是我最大的动力。

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

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

打赏作者

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

抵扣说明:

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

余额充值