1028. List Sorting (25)

距离PAT考试还有18天最重要的是做透每一题

 

这一题比较简单

不过也有学到的东西

 

一个是sort的第三个参数  可以是 一个函数指针也可以是一个函数对象     代码来自网络

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

 

另一个是strcmp函数  比较两个c字符串的函数当两个字符串相等时就返回0第一个较小时(比较ASCII)返回值小于0

 

思路:

用结构体存储得到的元素

并用sort函数排序重点是cmp函数的编写

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int n,c;
struct Re{
  int id;
  char name[10];
  int grade;
  
  Re(){
    id =0;
    for(int i=0;i<10;i++) name[i]='\0';
    grade=0;
  }
};
vector<Re> rv;

bool cmp1(Re r1,Re r2) {
  return r1.id<r2.id;
}
bool cmp2(Re r1,Re r2) {
  if(strcmp(r1.name,r2.name) < 0){
    return true;
  } else if(strcmp(r1.name,r2.name) == 0) {
    return r1.id < r2.id;
  }
  return false;
}
bool cmp3(Re r1,Re r2) {
  if(r1.grade == r2.grade) {
    return r1.id < r2.id;
  }
  return r1.grade<r2.grade;
}

int main() {
  scanf("%d %d",&n,&c);
  
  for(int i =0;i<n;i++) {
    Re re;
    scanf("%d",&(re.id));
    scanf("%s",&(re.name[0]));
    scanf("%d",&(re.grade));
    
    rv.push_back(re);
  }
  
  switch (c) {
  case 1:
    sort(rv.begin(),rv.end(),cmp1);
    break;
  case 2:
    sort(rv.begin(),rv.end(),cmp2);
    break;
  case 3:
    sort(rv.begin(),rv.end(),cmp3);
    break;
  }
  for(int i=0;i<rv.size();i++){
    printf("%06d %s %d\n",rv[i].id,rv[i].name,rv[i].grade);
  }
  return 0;
}

 

posted @ 2018-02-28 22:20  lan126  阅读(106)  评论(0编辑  收藏  举报