题目详情

定义结构体struct stu,编写成绩排名函数:void sort(struct stu *ps,int n),对结构体数组按成绩排名。 程序功能为读入整数N(N<100),再读入N个学生的学号(整型)和成绩(实数)。按样例输出排名。

输出格式

第一列是名次,注意并列情况;

第二列是学号,第三列是成绩(2位小数)。

输入样例

5
101 99
102 100
103 50
104 80
105 99

输出样例

1 102 100.00
2 101 99.00
2 105 99.00
4 104 80.00
5 103 50.00

题目分析

怎么来分析这个题目呢?

我觉得这道题难得不是排序,难顶的是这该死的并列排名还有一些细节!细节!细节!

先说说这个并列排名吧  我是真真的在这磕了好久 提交了好多次 就是不能够通过测试点1 就是不能完全对... 那种感觉真的是太难受了。(最后是一个好朋友救了我)

直接说说我的思路吧。

无非就是两种情况

所以我们可以考虑使用  if (s[i].score == s[i-1].score)  具体代码可以看下面

第一种就是该学生的成绩与前面一个的学生不相同 这个时候我们就可以直接用 i+1 来表示排名就可以了 最关键的一步就是我们要将这个名次用一个变量存储起来 (至于为什么呢 看了第2种情况就悟了)。

第二种就是成绩并列的情况了 这个时候的名次就和前一个的是一样的了  这个时候我们就可以直接用上边的那个存储名次的变量了。

大致就是这样了。

代码展示

静态构建结构体数组

# include <stdio.h>struct stu
{int num;//学号 float score;//成绩
};void sort(struct stu * ps, int n)
{int i, j;struct stu t;/* 定义中间变量 *//* 冒泡排序法 这里就不具体解释了*/for (i=0; i<n; i++){for (j=0; j<n-1-i; j++){if (ps[j].score < ps[j+1].score){t = ps[j];ps[j] = ps[j+1];ps[j+1] = t;}}}}int main(void)
{struct stu s[100]; int N, i;int k = 0; /* 记录排名 (呜呜呜 定义这个变量真的太有必要了)*/   scanf("%d", &N); /* 输入N个学生个数 */for (i=0; i<N; i++)/* 逐个输入学生的信息 */ {scanf("%d%f", &s[i].num, &s[i].score);}sort(s, N);/* 将学生信息排列 */for (i=0; i<N; i++)/* 遍历所有学生 逐个输出 */{/* 与前一个学生成绩进行比较 在这里是与前一个学生的信息进行对比 具体分析可以参考题目分析里的 */if (s[i].score == s[i-1].score){     printf("%d %d %.2f", k, s[i].num, s[i].score); /* 注意题目要求成绩要保留两位小数 */}else {   /* 如果与前面的成绩不相等的话 就直接用i+1来表示排名再好不过了 */printf("%d %d %.2f", i+1, s[i].num, s[i].score);k = i+1;/* 把这个排名保存在K中 如果后面的成绩与这个成绩相同 排名就相同 直接就用K来表示了 */ }if (i < N-1) /* 呜呜呜 我们这里还要满足人类的要求 输出最后一名时不能加换行符  */{printf("\n");}   }   return 0;
}

动态构建结构体数组

思路都一样就不注释了

# include <stdio.h>
# include <stdlib.h>
# define LEN sizeof(struct stu)struct stu
{int num;float score;
};void sort(struct stu * ps, int n)
{int i, j;struct stu t;for (i=0; i<n; i++){for (j=0; j<n-1-i; j++){if (ps[j].score < ps[j+1].score){t = ps[j];ps[j] = ps[j+1];ps[j+1] = t;}}}}int main(void)
{struct stu * s; int N, i;scanf("%d", &N);s = (struct stu *)malloc(N*LEN);for (i=0; i<N; i++){scanf("%d%f", &s[i].num, &s[i].score);}sort(s, N);int t; for (i=0; i<N; i++){if (s[i].score == s[i-1].score){printf("%d %d %.2f", t, s[i].num, s[i].score);}else {printf("%d %d %.2f", i+1, s[i].num, s[i].score);t = i+1;}if (i < N-1){printf("\n");}      }return 0;
}

运行展示

c语言:成绩排名(结构体)相关推荐

  1. 6-2 综合成绩排名-结构体二 (100分)

    6-2 综合成绩排名-结构体二 (100分) 众所周知,计算机院要对申请转入计算机大类的学生进行考核,考核方式包括机试和面试.学生综合成绩采取百分制,其中50%由机试成绩核算,另50%由学生已获得的加 ...

  2. C语言编程题—结构体—设计程序,已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数 fun:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分

    4 C语言编程题--结构体 **设计程序,已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中.请编写函数 fun,函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有 ...

  3. C 语言实例 - 使用结构体(struct)

    C 语言实例 - 使用结构体(struct)C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...

  4. c语言 结构体ppt,C语言知识学习结构体.ppt

    C语言知识学习结构体.ppt Chap 9 结构,9.1 输出平均分最高的学生信息 9.2 学生成绩排序 9.3 修改学生成绩,本章要点,什么是结构结构与数组有什么差别 有几种结构的定义形式,它们之间 ...

  5. Go语言学习、结构体

    最近疫情比较严重,过年也不能出门,闲来无事,继续更新博客吧. 武汉加油! 我们来继续说下go语言中的结构体 比如我们现在想存储一个学生信息,如:学号.姓名.年龄.性别,等信息,按照我们以前的存储习惯, ...

  6. C语言中的结构体定义和使用例子

    C语言中的结构体定义和使用例子 一.结构体定义的三种方式 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对 问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,共 ...

  7. Go语言基础之结构体

    转载地址:https://www.liwenzhou.com/posts/Go/10_struct/ Go语言中没有"类"的概念,也不支持"类"的继承等面向对象 ...

  8. C语言小记:结构体及其在内存中的储存形式

    C语言小记:结构体及其在内存中的储存形式 1.结构体 结构体的作用:自定义一个包含多种不同数据类型的变量. 语法: struct 结构体名称 {结构体成员1:结构体成员2:结构体成员3:... } 定 ...

  9. C语言中的结构体,结构体中数组初始化与赋值

    最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论: 1.结构体的 ...

  10. Linux结构体变量报错,C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

最新文章

  1. Redis 笔记(15)— 管道 pipeline(客户端将批量命令打包发送用来节省网络开销)
  2. hdu3870 基于最短路的最小割
  3. 【区块链:超级账本】Win10 Hyperledger环境搭建
  4. TCPDUMP/LIBPCAP 3-PCAP's MAN手册(1)
  5. 依赖注入模式中,为什么用对象而不是用数组传递?
  6. ThinkPHP6项目基操(17.实战部分 Filesystem文件上传)
  7. mysql数据库information_schema库中的表说明
  8. webpack打包后的文件夹是空的_webpack打包Vue工程
  9. 从后台获取的数据渲染到页面中的dom操作
  10. Hadoop的eclipse1.1.2插件的安装和配置
  11. erc20钱包下载_【重要公告】VNT Chain主网钱包使用指南
  12. python语音地图定位_python 利用高德地图定位小区名字
  13. 谷歌学术Google Scholar超实用干货(拒绝翻墙/插件)
  14. mysql中使用order by 排序时使用if()函数应用场景。
  15. 人工智能学习-传教士-15数码-拟合-逻辑推理
  16. [转]仙剑4破解方法详解[图]
  17. 在3D城市模型中添加不同的纹理
  18. 零基础Matlab Note9--离散数据绘图set(gca, )
  19. win10下卸载office2010(测试多种方法后,成功实现)
  20. c语言中最大公约数的编程,C语言中最大公约数求法

热门文章

  1. mysql字段attributes_mysql8 参考手册-INFORMATION_SCHEMA USER_ATTRIBUTES表
  2. 为什么纳斯达克和雅加达期货等传统交易所在转向区块链?
  3. Android自动化测试第二季(提高篇)-金阳光-专题视频课程
  4. 供应商管理的流程和策略
  5. 简易新年倒计时的js部分
  6. oracle使用(四)ORA-00942: 表或视图不存在
  7. 分布式数据存储原理简介
  8. Unity核心9——3D动画
  9. Delphi 两种获取文件大小的方法 (支持大文件)
  10. PHP根据经纬度得到城市