题目详情

定义结构体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;
}

运行展示

 

 

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐