Jim很喜欢读书,他有很多数,有时候他很难管理它们。因此,他请求你的帮助来解决这个问题。
Jim想以书名、出版年份和价格为关键字,按照排序标准把书进行排序。一本书由书名Name、出版年份Year和单价Price组成。Name是第一排序标准,Year是第二排序标准,Price是第三排序标准。如果排序标准是Year,且两本书的Year相同,那么,你就应该给它们按Name排序。如果Name还是相同,那么,就应该安Price排序。不存在两本书的三个参数都相同的情况。
解题思路:本题是三维排序问题。Name、Year和Price分别是默认是第一、第二和第三排序。但本例又很特殊,第一排序是由输入指定的,是Name、Year和Price三者之一。
当Name是排序标准,那么,三个排序顺序是Name、Year和Price;
当Year是排序标准时,三个排序顺序是Year、Name和Price;
当Price是排序标准时,三个排序顺序是Price、Name和Year。
对于这三种排序标准,我们编写三个比较函数,这样就显得比较灵活,程序实现起来也比较容易。
而书的信息,则写到一个结果体变量中,而结果体变量又作为向量的元素,最后,只要根据排序标准,在排序算法中选择相应的比较函数,就完成了书的排序了。这里选用“泛型编程”来实现。
//BookSort.cpp
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
//Book的结构体
struct Book{
string Name;
int Year;
int Price;
};
//比较函数,Name主序
bool CompName(const Book &b1,const Book &b2){
if(b1.Name != b2.Name)
return b1.Name < b2.Name;
else if(b1.Year != b2.Year)
return b1.Year < b2.Year;
else
return b1.Price < b2.Price;
}
//比较函数,Year主序
bool CompYear(const Book &b1,const Book &b2){
if(b1.Year != b2.Year)
return b1.Year < b2.Year;
else if(b1.Name != b2.Name)
return b1.Name < b2.Name;
else
return b1.Year < b2.Year;
}
//比较函数,Price主序
bool CompPrice(const Book &b1,const Book &b2){
if(b1.Price != b2.Price)
return b1.Price < b2.Price;
else if(b1.Name != b2.Name)
return b1.Name < b2.Name;
else
return b1.Year < b2.Year;
}
int main(int argc, char* argv[])
{
//ifstream cin("aaa.txt");
vector<Book> v;
Book book;
string sorting; //第一排序
int n;
int i;
int line=0;
while(cin>>n){
if(n==0) break;
line++; //案例号
v.clear(); //清空向量
//读入一个案例数据到向量中
for (i=0;i<n;i++)
{
cin>>book.Name>>book.Year>>book.Price;
v.push_back(book);
}
//读入排序标准
cin>>sorting;
//给向量排序,要根据主序来确定比较函数
if(sorting == "Name")
sort(v.begin(),v.end(),CompName);
else if(sorting == "Year")
sort(v.begin(),v.end(),CompYear);
else if(sorting == "Price")
sort(v.begin(),v.end(),CompPrice);
//输出结果
if(line != 1) cout<<endl; //不是第一行,先输出一个空行
for (i=0;i<v.size();i++)
{
cout<<v[i].Name<<" "<<v[i].Year<<" "<<v[i].Price<<endl;
}
}
return 0;
}
效果如下:
