解释一下这段代码void sort(STU stu[], int n) { int select,i,j; int (*cmp)(STU a,STU b); int ScoreAsc( STU a, STU b); int ScoreDsc( STU a, STU b); int NameAsc( STU a, STU b); printf("1 按总分升序排列\n"); printf("2 按总分降序排列\n"); printf("3 按姓名排序\n"); scanf("%d",&select); switch(select) { case 1: cmp=ScoreAsc; break; case 2: cmp=ScoreDsc; break; case 3: cmp=NameAsc; break; default: return ; } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if((*cmp)(stu[i],stu[j])>0) { STU temp; temp=stu[i]; stu[i]=stu[j]; stu[j]=temp; } output(stu,n); } int ScoreAsc(STU a, STU b) { if(a.total>b.total) return 1; else return -1; } int ScoreDsc(STU a, STU b) { if(a.total<b.total) return 1; else return -1; } int NameAsc(STU a, STU b) { return strcmp(a.name,b.name); }
时间: 2024-04-26 18:26:57 浏览: 9
这段代码实现了一个排序函数,可以对一个学生的结构体数组进行排序。函数的参数包括一个学生的结构体数组和数组的长度。排序的方式可以通过用户输入进行选择,包括按照总分升序排列、按照总分降序排列和按照姓名排序。具体的排序方式是通过函数指针来实现的,将排序方式对应的函数指针赋值给变量cmp,然后在排序过程中调用cmp函数指针即可实现不同的排序方式。在排序过程中,采用冒泡排序的方式,如果cmp函数指针返回值大于0,则交换两个元素的位置。最后,调用output函数输出排序后的结果。其中,函数ScoreAsc实现了按总分升序排序,ScoreDsc实现了按总分降序排序,NameAsc实现了按姓名排序,都是通过返回值来实现排序的。
相关问题
struct stu *node(int n)
函数node(int n)返回一个指向结构体类型为stu的指针。这个结构体包含了表示学生信息的各种字段,例如:“姓名”、“年龄”、“学号”等等。参数n表示要创建的节点数量。这个函数可以用于动态创建存储学生信息的节点,每一个节点都指向一个学生的信息。通过遍历这些节点,可以获取每个学生的信息。函数的返回类型是struct stu *,即指向结构体类型为stu的指针。这个指针可以用来访问和操作学生信息的节点,比如添加、删除和修改学生信息。函数的使用可以大大简化对学生信息的管理和操作,使得对学生信息的存储和处理更加高效和方便。
解释一下这段代码void load(STU stu[], int *nPtr) { FILE *fp; int i; if((fp = fopen("d:\\cyyspace\\student.dat", "r")) == NULL) { *nPtr = 0; return; } for (i = 0; fread(&stu[i], sizeof(STU), 1, fp) != 0; i++); *nPtr = i; fclose(fp); }
这段代码是一个读取二进制文件的函数,函数名为load,接受两个参数:stu和nPtr。
其中,stu是一个结构体数组,用来存储从二进制文件中读取的数据;nPtr是一个指向整数的指针,用来存储读取到的数据条数。
函数开始,首先定义一个文件指针fp和一个整数i。
接下来,使用fopen函数打开名为"student.dat"的二进制文件,如果文件打开失败,说明文件不存在,将nPtr指向的整数赋值为0,然后直接返回。
如果文件打开成功,使用for循环读取文件中的数据。循环条件是fread函数返回值不为0,也就是读取成功,将读取到的数据存储到stu[i]中,每次循环i加1。
循环结束后,将nPtr指向的整数赋值为i,也就是读取到的数据条数。最后使用fclose函数关闭文件指针。