您的位置:首页 > 其它

HDOJ 1862:EXCEL排序 使用一下函数指针数组

2012-01-07 12:58 288 查看
浙大的这道考研上机真题题以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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: