Galaxy


私信TA

用户名:wkx

访问量:2924

签 名:

差不多得了

等  级
排  名 2857
经  验 2126
参赛次数 0
文章发表 2
年  龄 18
在职情况 学生
学  校 幼儿园肄业
专  业

  自我简介:

解题思路:

一开始我的思路是此题结构体大小应该根据每次输入的n值来分配,但是分配内存时没有考虑到连续性,不能使用qsort来排序,需要自己编写排序函数。

于是嫌麻烦偷懒,先建立大小为1000的结构体数组,保证不会超出,然后利用qsort函数来排序。

最后又写了一个分配连续内存的结构体数组进行qsort,两全其美(参考代码2)。


注意事项:

坑1:用malloc务必保证连续性,一次分配完所需大小,否则不能qsort,得自己写排序算法。如果用指针数组循环分配单个结构体大小会吃这个亏。

坑2:样例只给了一组数据输入输出,但实际上题意是多组数据输入输出,需要while循环scanf至EOF。

坑3:题目说按成绩排序,相同再按名字,但仅仅做到这样还是WA,还得拓展思考——名字也相同,按年龄来排序。

参考代码1(不使用动态内存分配):

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
	char name[101];
	int age;
	int mark;
}stu;

int cmp(const void * e1, const void* e2)
{
	if (((stu*)e1)->mark != ((stu*)e2)->mark)//成绩不同优先判断成绩
		return ((stu*)e1)->mark - ((stu*)e2)->mark;
	if (strcmp(((stu*)e1)->name, ((stu*)e2)->name))//成绩相同,判断名字
		return strcmp(((stu*)e1)->name, ((stu*)e2)->name);
	return ((stu*)e1)->age - ((stu*)e2)->age;//名字也相同,再根据年龄判断
}

int main()
{
	int n = 0,i = 0;
	stu group[1000];
	while (scanf("%d", &n) != EOF)//注意多组输入
	{
		for (i = 0;i < n;i++)
		{
			scanf("%s %d %d", group[i].name, &group[i].age, &group[i].mark);//循环录入每组数据
		}
		qsort(group, n, sizeof(stu), cmp);//快速排序
		for (i = 0;i < n;i++)
		{
			printf("%s %d %d\n", group[i].name, group[i].age, group[i].mark);//输出排序后的结果
		}
	}
	return 0;
}

参考代码2(优化版,动态内存分配,结构体数组在内存连续以进行qsort):

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
	char name[101];
	int age;
	int mark;
}stu;


int cmp(const void * e1, const void* e2)
{
	if (((stu*)e1)->mark != ((stu*)e2)->mark)
		return ((stu*)e1)->mark - ((stu*)e2)->mark;
	if (strcmp(((stu*)e1)->name, ((stu*)e2)->name))
		return strcmp(((stu*)e1)->name, ((stu*)e2)->name);
	return ((stu*)e1)->age - ((stu*)e2)->age;
}

int main()
{

	int n = 0, i = 0;

	while (scanf("%d", &n) != EOF)
	{
		stu* p = (stu*)malloc(sizeof(stu)*n);//一次分配好空间,保证连续性
		for (i = 0;i < n;i++)
		{
			scanf("%s %d %d", (p[i].name), &(p[i].age), &(p[i].mark));
			
		}
		qsort(p, n, sizeof(stu), cmp);
		for (i = 0;i < n;i++)
		{
			printf("%s %d %d\n", (p[i].name), (p[i].age), (p[i].mark));
		}
		free(p);//每当一组输入输出结束,将p释放掉。
	}
	return 0;
}


 

0.0分

11 人评分

  评论区

第二个,思路懂了,可惜我不会代码实现
2021-04-14 20:05:59
  • «
  • 1
  • »