首页 > 编程知识 正文

成绩排序c语言数据结构,c语言结构体成绩管理

时间:2023-05-05 18:48:19 阅读:218958 作者:3957

题目详情

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

输出格式

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

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

输入样例 5101 99102 100103 50104 80105 99 输出样例  1 102 100.002 101 99.002 105 99.004 104 80.005 103 50.00   题目分析 

怎么来分析这个题目呢?

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

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

直接说说我的思路吧。

无非就是两种情况

所以我们可以考虑使用  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; /* 记录排名 (ssdxh 定义这个变量真的太有必要了)*/ 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) /* ssdxh 我们这里还要满足人类的要求 输出最后一名时不能加换行符 */ { 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;} 运行展示

 

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。