现在的位置: 首页 > 综合 > 正文

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

2018年05月25日 ⁄ 综合 ⁄ 共 1026字 ⁄ 字号 评论关闭

    浙大的这道考研上机真题题以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;
}

抱歉!评论已关闭.