浙大的这道考研上机真题题以EXCEL排序作为背景,需要三个不同的比较器作为sort函数的第三个参数。如果用多重判断来调用不同的比较器的话,代码会冗余。于是尝试理论一下函数指针数组。
这道题的URL:http://acm.hdu.edu.cn/showproblem.php?pid=1862
我的AC代码.
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int Max = 100000 + 10;
struct Record
{
char sno[7];
char name[9];
int grade;
};
Record s[Max];
bool com0(const Record &a, const Record &b)
{
if(strcmp(a.sno, b.sno) < 0) return true;
else return false;
}
bool com1(const Record &a, const Record &b)
{
if(strcmp(a.name, b.name) < 0) return true;
else if(!strcmp(a.name, b.name)) return com0(a, b);
else return false;
}
bool com2(const Record &a, const Record &b)
{
if( a.grade < b.grade ) return true;
else if(a.grade == b.grade) return com0(a, b);
else return false;
}
int main()
{
int n, m, cases = 1;
bool (*f[3])(const Record &, const Record &);
f[0] = com0, f[1] = com1, f[2] = com2;
while(scanf("%d %d", &n, &m) && n)
{
for(int i=0; i<n; i++)
{
scanf("%s %s %d", &s[i].sno, &s[i].name, &s[i].grade);
}
sort(s, s + n, *f[m-1]);
printf("Case %d:\n", cases++);
for(int i=0; i<n; i++)
printf("%s %s %d\n", s[i].sno, s[i].name, s[i].grade);
}
system("pause");
return 0;
}