结构体的小问题
题目:
Students
实验任务
一份杂乱无序的学生名单,请你按照班级和序号升序排列。
数据输入
第一行 N,代表有几位学生。(N <= 10000)
接下来 N 行,每行为 class_number, number, name,表示学生的班级,序号,
姓名。(没有两人班级和序号均相同)
(班级和序号为 1,2,3,4..,学生姓名长度不超过 10)
数据输出
输出有序的名单,每行一条学生的信息。
班级的我排好了,我不知道如何在班级排好的情况下排序号。。。
答案要这样:输入示例
3
1 2 a
2 1 c
1 1 b
输出示例
1 1 b
1 2 a
2 1 c
------解决思路----------------------
if (a.class_number> b.class_number
------解决思路----------------------
(a.class_number==b.class_number && a.number>b.number)) {
//TODO:交换a,b
//
}
------解决思路----------------------
这位朋友,不知道你的数据结构是如何实现,就我对你描述的需求的理解,你貌似要求输出的样子是首先班级号是有序的,其次在同一个班级号中,序号是有序的。
那么小弟拙见,我觉得没必要排两次,你可以这样,把班级号和序号组合成一个数,假如班级号和序号最多都到99,那么班级号11,序号23可以组合为1123,同理,班级号3,序号17可以组合为0317(即317),然后你再对这个组合数进行排序,不是很简单而且只需要排一次。等排完了,你再把组合数拆开再去打印即可。
不过,只是基于我对于此需求的理解,如果理解错了,这个方法就没用了。
------解决思路----------------------
引用:Quote: 引用:这里肯定有个主要的参考字段,假设你将班级号当主要参考,那么只有当两组数据的班级号相同时,你才需要去比较他们的序号(按升序排),否侧就是根据班级号来升序排的!
反过来假如你将序号当主要参考,那么也是类似的!
ps:假如这里没有啥主次之分,那就需要你自己定义一个根据班级号和序号排序的算法
班级号是主要参考,排好班级以后要排班级里面同学的序号,我不知道该怎么排
给个简单示例,你参考下吧,主要就是compare_student()函数
#include
using namespace std;
struct Student
{
int ClassNumber;
int Number;
char Name[20];
};
int compare_student(Student a,Student b)//定义比较大小的函数,a>b返回1,a=b返回0,a
{
if(a.ClassNumber==b.ClassNumber)
{
return a.Number>b.Number?1:(a.Number==b.Number?0:-1);
}
else
{
return a.ClassNumber>b.ClassNumber?1:-1;
}
}
void sort_student(Student* pStudent,int num)
{
Student temp;
for(int i=0;i
{
for(int j=i;j
{
if(compare_student(pStudent[j],pStudent[j+1])==1)
{
temp=pStudent[j];
pStudent[j]=pStudent[j+1];
pStudent[j+1]=temp;
}
}
}
}
void print_student(Student* pStudent,int num)
{
for(int i=0;i
{
cout<
}
}
void main()
{
Student students[4];
for(int i=0;i<4;++i)
{
sprintf(students[i].Name,"%s%d","name",i+1);
}
students[0].ClassNumber=1;
students[0].Number=4;
students[1].ClassNumber=1;
students[1].Number=3;
students[2].ClassNumber=2;
students[2].Number=3;
students[3].ClassNumber=3;
students[3].Number=2;
sort_student(students,4);
print_student(students,4);
}