题目内容:
已知main.c文件代码,请完成StudentManager.h文件中的结构体的定义(已给出),以及相关5个函数的实现。要求,最终能够按照一定的顺序输出每个学生的学号(小于等于8位的正整数)及分数(介于1与100之间的整数)(其中学生的人数n, 1 <= n <= 20),其中按照分数从高到低输出,如果分数相同,则根据学号的大小(假定学号可以重复),学号越大的排在学号小的前面输出。每个记录输出后都有一个换行。
两个结构体的定义已给出。
// strcuture’s definition here…
// id用于保存学号,score用于保存分数。
typedef struct struct_one {
int id;
int score;
} Student;
// num用于记录student的个数,data用于保存student这个结构体信息.
typedef struct struct_two {
int num;
Student * data;
} StudentManager;
请完成下面5个函数的定义:
// init the student manager.
void initStudentManager(StudentManager* studentManager);
这个函数用于初始化内存,为data开辟空间。
// deal with the input.
void dealWithInput(StudentManager* studentManager);
这个函数用于对输入的处理,将数据保存到结构体中。在mian.c中已给出,不用写。
// sort the student in some order given.
void sortStudent(StudentManager* studentManager);
这个函数对student进行排序。
// output the result after processing.
void dealWithOutput(StudentManager* studentManager);
这个函数用于输出结果。
// recycle the memory.
void recyleStudentManager(StudentManager* studentManager);
这个函数用于回收我们开辟的空间。
输入样例:
5
13331111 98
13331112 34
13331113 21
13331114 21
13331115 21
输出样例:
13331111: 98
13331112: 34
13331115: 21
13331114: 21
13331113: 21
快排,结构体,指针
#include <stdio.h>
#include <stdlib.h>
typedef struct struct_one {
int id;
int score;
} Student;
typedef struct struct_two {
int num;
Student * data;
} StudentManager;
void dealWithInput(StudentManager* studentManager) {
int i;
for (i = 0; i < studentManager->num; i++) {
scanf("%d%d", &(studentManager->data[i].id), \
&(studentManager->data[i].score));
}
}
void initStudentManager(struct struct_two* n) {
n->data = (Student*)malloc(sizeof(Student) * n->num);
}
//重点理解!!!
//data是一个数组,已经知道总共有多少个num,所以根据实际需要的num给data申请内存。
int Comp(const void *p1, const void *p2) {
struct struct_one *a = (struct struct_one*)p1;
struct struct_one *b = (struct struct_one*)p2;
if (a->score != b->score)
return a->score < b->score ? 1 : -1;
else if (a->id != b->id) {
return a->id < b->id ? 1 : -1;
}
return 0;
}
void sortStudent(StudentManager* studentManager) {
qsort(studentManager->data, studentManager->num, sizeof(studentManager->data[0]), Comp);
}
void dealWithOutput(StudentManager* studentManager) {
for (int i = 0; i < studentManager->num; i++) {
printf("%d:%d\n", studentManager->data[i].id, studentManager->data[i].score);
}
}
void recyleStudentManager(StudentManager* studentManager) {
free(studentManager->data);
}
//释放内存直接把数组释放就好。
int main(void) {
// get a studentManager object.
StudentManager studentManager;
// set the student's num.
scanf("%d", &studentManager.num);
// initialize the memory for storing the students' information.
initStudentManager(&studentManager);
// get input.
dealWithInput(&studentManager);
// sort the student in specific order.
sortStudent(&studentManager);
// output the resut after sorting.
dealWithOutput(&studentManager);
// recycle the memory we used before.
recyleStudentManager(&studentManager);
return 0;
}