c语言:成绩排名(结构体)
题目详情定义结构体struct stu,编写成绩排名函数:void sort(struct stu *ps,int n),对结构体数组按成绩排名。 程序功能为读入整数N(N<100),再读入N个学生的学号(整型)和成绩(实数)。按样例输出排名。...
·
题目详情
定义结构体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;
}
运行展示
更多推荐
已为社区贡献1条内容
所有评论(0)