智能成绩表(C语言)

题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html

题目描述

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

输入描述

第 1 行输入两个整数,学生人数 n 和科目数量 m,0<n<100,0<m < 10
第 2 行输入 m 个科目名称,彼此之间用空格隔开。

  • 科目名称只由英文字母构成,单个长度不超过 10 个字符。
  • 科目的出现顺序和后续输入的学生成绩一一对应
  • 不会出现重复的科目名称

第 3 行开始的 n 行,每行包含一个学生的姓名和该生 m 个科目的成绩 (空格隔开)。

  • 学生不会重名
  • 学生姓名只由英文字母构成,长度不超过 10 个字符
  • 成绩是 0~100 的整数,依次对应第 2 行输入的科目

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

输出描述

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

示例一

输入

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

输出

xiaohua fangfang minmin

说明

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

思路

  1. 数据输入与初始化

    • 首先读取学生人数 n 和科目数量 m
    • 接着,读取并存储 m 个科目名称到二维数组 subject 中。
    • 初始化一个大小为 n 的结构体数组 stu,用于存放每个学生的姓名、各科成绩以及排序的关键字段(key)。
    • 然后逐行读取每个学生的姓名和对应科目的成绩,并存入 stu 数组中。
  2. 确定排序依据

    • 输入要进行排名的科目名称 sub
    • 遍历科目列表,查找是否存在该科目。若存在,则将该科目的成绩作为排序依据,赋值给每个学生的 key 字段。
    • 若未找到指定科目,则计算每个学生的总分,并用总分作为排序依据。
  3. 排序

    • 使用 C 标准库中的 qsort 函数对 stu 数组中的学生按照 key 字段进行降序排列。这里定义了一个比较函数 cmp,当 key 不同时按 key 值排序,相同则按照学生姓名字典顺序升序排序。
  4. 输出结果

    • 对排序后的 stu 数组,遍历并打印出所有学生的姓名,以空格隔开。

总结来说,通过接收用户输入的学生信息和排序要求,首先完成数据结构的构建和填充,然后根据题目需求选择合适的排序依据,最后利用快速排序算法实现对学生列表的排序,并按照题目要求的格式输出排名结果。

代码

无注释

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {char name[10];int scores[10];int key; // 用于排序的依据
} Students;int cmp(const void *a, const void *b) {Students *s1 = (Students *)a;Students *s2 = (Students *)b;if (s1->key != s2->key) {return s2->key - s1->key; // 降序}return strcmp(s1->name, s2->name);
}
int main() {int n, m;scanf("%d %d", &n, &m);char subject[m][11];for (int i = 0; i < m; i++) {scanf("%s", subject[i]);}Students stu[n];for (int i = 0; i < n; i++) {scanf("%s", stu[i].name);for (int j = 0; j < m; j++) {scanf("%d", &stu[i].scores[j]);}}char sub[11];scanf("%s", sub);int found = 0;for (int k = 0; k < m; k++) {if (strcmp(subject[k], sub) == 0) {found = 1;for (int i = 0; i < n; i++) {stu[i].key = stu[i].scores[k];}break;}}if (found == 0) {for (int i = 0; i < n; i++) {stu[i].key = 0;for (int j = 0; j < m; j++) {stu[i].key += stu[i].scores[j];}}}qsort(stu, n, sizeof(Students), cmp);for (int i = 0; i < n; i++) {printf("%s ", stu[i].name);}printf("\n");return 0;
}

有注释

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义学生结构体,包含姓名、各科成绩以及用于排序的关键字段(key)
typedef struct {char name[10];  // 存储学生姓名int scores[10]; // 存储每个学生的各科成绩int key; // 用于根据指定科目成绩或总分进行排序的依据
} Students;// 定义比较函数,用于qsort排序。a和b是需要比较的两个学生结构体指针
int cmp(const void *a, const void *b) {Students *s1 = (Students *)a;Students *s2 = (Students *)b;// 比较key字段,按照降序排列if (s1->key != s2->key) {return s2->key - s1->key;}// 若key相同,则按照学生姓名字典顺序升序排列return strcmp(s1->name, s2->name);
}int main() {int n, m;               // 分别存储学生人数和科目数量scanf("%d %d", &n, &m); // 输入学生人数和科目数量// 存储科目名称的二维数组char subject[m][11];for (int i = 0; i < m; i++) {scanf("%s", subject[i]); // 读取每门科目的名称}// 初始化学生数组Students stu[n];// 读取每个学生的姓名和各科成绩for (int i = 0; i < n; i++) {scanf("%s", stu[i].name); // 读取学生姓名for (int j = 0; j < m; j++) {scanf("%d", &stu[i].scores[j]); // 读取单科成绩}}// 读取用于排名的科目名称char sub[11];scanf("%s", sub);int found = 0; // 标记是否找到用于排序的科目for (int k = 0; k < m; k++) {if (strcmp(subject[k], sub) == 0) { // 如果输入的科目存在于科目列表中found = 1;// 将对应科目的成绩作为排序依据赋值给每个学生的key字段for (int i = 0; i < n; i++) {stu[i].key = stu[i].scores[k];}break;}}// 如果未找到指定科目,则以总分为排序依据if (found == 0) {for (int i = 0; i < n; i++) {stu[i].key = 0; // 初始化总分为0// 计算每个学生的总分,并赋值给key字段for (int j = 0; j < m; j++) {stu[i].key += stu[i].scores[j];}}}// 使用qsort对整个学生数组进行排序qsort(stu, n, sizeof(Students), cmp);// 输出排序后的学生姓名列表for (int i = 0; i < n; i++) {printf("%s ", stu[i].name);}printf("\n"); // 输出换行符以结束输出return 0; // 程序正常结束
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot+vue项目部署配置开机自启动

1.前端部属 下载nginx解压&#xff0c;在nginx\conf下找到nginx.conf 添加如下代码 server {listen 8081;server_name localhost;charset utf-8;location / {root F:/1ceshi/dist; #前端打包路径try_files $uri $uri/ /index.html;index index.html index.htm;}l…

本地创建Git仓库

在 Windows 下&#xff0c;可以通过以下步骤在本地创建一个 并模拟远程Git 仓库。 1、在命令行中打开模拟远程Git 仓库目标文件夹&#xff1a; 打开命令提示符或 PowerShell。例如&#xff1a; 创建裸仓库&#xff08;模拟远程仓库&#xff09;&#xff1a;创建一个裸仓库&am…

Redis进阶篇

Redis线程模型 redis是基于内存运行的高性能k-v数据库&#xff0c;6.x之前是单线程, 对外提供的键值存储服务的主要流程 是单线程&#xff0c;也就是网络 IO 和数据读写是由单个线程来完成&#xff0c;6.x之后引入多线程而键值对读写命 令仍然是单线程处理的&#xff0c;所以 …

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机进入Offboard模式起飞悬停并在Gazebo中可视化

在Simulink中使用ROS2控制无人机进入Offboard模式起飞悬停并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模型并完成基本配置整体框架各子系统实现…

Java爬虫使用JSoup获取静态资源图片

import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.FileOutputStream;/*** 获取静态图片*/public class ImageDownloader {public static void main…

一分钟 由浅入深 学会Navigation

目录 1.官网正式概念 1.1 初认知 2.导入依赖 2.1 使用navigation 2.2 safe Args插件-> 传递数据时用 3.使用Navigation 3.1 搭建初始框架 3.2 确定action箭头的属性 3.3 为Activity添加NavHostFragment控件 3.4 NavController 管理应用导航的对象 3.5 数据传递(单…

Linux——基础IO

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、C语言IO1、写文件2、读文件3、stdin & stdout & stderr 二、系统文件I/O1、写文件…

常用显示屏学习——LCD12864(含高级驱动程序)

LCD12864液晶显示屏 屏幕介绍 ① 可显示四行字符&#xff0c;每行可显示8个汉字或者16个数字和字母&#xff1b; ②可串行通信和并行通信&#xff1b; ③ 串口接口管脚信号 通信方法 &#xff08;一&#xff09;八位并行通信方法 &#xff08;二&#xff09;串行通信方法 用…

基于springboot接口的编写

目录 1、模糊分页查询 2、批量删除 3、新增 4、编辑 此接口非彼接口。此接口是MVC的设计模式中的Controller层&#xff0c;一般我们会叫Controller层里的方法为接口。他们是负责接收前端或者其它服务的传来的请求&#xff0c;并对请求进行相应的处理&#xff0c;最终再将处…

工具方法合集-utils.js

通用 import get from lodash.get import cloneDeep from lodash.clonedeep // 深度clone export function deepClone(obj) {return obj ? cloneDeep(obj) : obj } export function lodashGet(obj, key, defaultValue ) {//这个 defaultValue 不能给默认 值 会报错&#xf…

超实用,分享PostgreSQL和mysql的几点区别

前言 今天是元宵节&#xff0c;首先祝大伙元宵快乐&#xff01;上一篇文章&#xff0c;给大家讲解了一下MySQL和PostgreSQL性能上的差别。这篇文章主要是记录一下日常应用中&#xff0c;两者常见的一些语法以及一些区别。 PostgreSQL的数据类型 数值类型 字符串类型 日期|时…

harmony 鸿蒙使用N-API开发Native模块

harmony 鸿蒙使用N-API开发Native模块&#xff0c;其实就是Node.js 官网中已经给出 N-API 接口基础能力&#xff0c;同时&#xff0c;方舟 ArkTS 运行时提供的 N-API 接口&#xff0c;封装了方舟引擎的能力&#xff0c;在功能上与 Node.js 社区保持一致。 N-API 是 Node.js Add…

Java:性能优化细节11-20

Java&#xff1a;性能优化细节11-20 11. 尽量合理的创建HashMap 当你要创建一个比较大的hashMap时&#xff0c;充分利用这个构造函数 public HashMap(int initialCapacity, float loadFactor);合理初始化HashMap的容量和负载因子是提高HashMap性能的关键因素之一。HashMap在…

Linux--shell编程中分区表常用操作 全面且详细

文章中关于分区表常用操作目录&#xff1a; 一、概念 二、​​​​​​​创建分区表语法 ​​​​​​​三、创建一个表带多个分区 四、​​​​​​​加载数据到分区表中 五、加载数据到一个多分区的表中去 ​​​​​​​六、查看分区 七、​​​​​​​添加一个分区…

ChatGPT大致运用了哪些技术

ChatGPT是一个基于OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构构建的语言模型。它的大致原理和运用的技术如下&#xff1a; Transformer架构&#xff1a;ChatGPT基于Transformer模型&#xff0c;这是一种使用自注意力机制&#xff08;self-att…

机器学习:逻辑回归原理

逻辑回归模型是一种广泛应用于分类问题的统计方法。尽管名为“回归”&#xff0c;但它实际上是一种分类算法&#xff0c;主要用于预测观察对象属于某个类别的概率。逻辑回归模型特别适用于二分类问题&#xff0c;但也可以通过一些策略扩展到多分类问题。 逻辑回归的应用与优化…

让C语言代码变抽象(二)

目录 前言&#xff1a; 代码&#xff1a; 前言&#xff1a; 在今天写代码的时候&#xff0c;我又想到一个更抽象的代码。 我在写注释的时候突然想想到条件编译的东西&#xff0c;好像也能用来注释东西。 代码&#xff1a; 我们在这直接上干货 我们知道在条件编译中有一个叫…

飞常准查航班小程序采集

仅限学习使用 <html> <head> </head> <body><script src"AesUtil.js"></script><script src"md5.js"></script><script>function test(a) { return true; }function serialize(o) {var n argumen…

【前端素材】推荐优质后台管理系统Acara平台模板(附源码)

一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段&#xff0c;帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 后台管理系统是一种用于管理和控制网站、应用程序或系…

Map集合特点、遍历方式、TreeMap排序及Collections和Arrays

目录 ​编辑 一、集合框架 二、 Map集合 特点 遍历方式 HashMap与Hashtable的区别 TreeMap Collections Arrays 一、集合框架 二、 Map集合 Map集合是一种键值对的集合&#xff0c;其中每个键对应一个值。在Java中&#xff0c;Map接口定义了一种将键映射到值的数据结…