本文共 2067 字,大约阅读时间需要 6 分钟。
例 2.2 成绩排序 (九度教程第 2 题)
时间限制:1 秒
内存限制:32 兆 特殊判题:否
题目描述:
有 N 个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名 字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出 N 个学生排序后的信息。 输入: 测试数据有多组,每组输入第一行有一个整数 N(N<=1000),接下来的 N 行包括 N 个学生的数据。每个学生的数据包括姓名(长度不超过 100 的字符串) 、 年龄(整形数)、成绩(小于等于 100 的正数)。 输出: 将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。然后 输出学生信息,按照如下格式:姓名 年龄 成绩 样例输入: 3 abc 20 99 bcd 19 97 bed 20 97 样例输出: bcd 19 97 bed 20 97 abc 20 99 提示: 学生姓名的字母序区分字母的大小写,如 A 要比 a 的字母序靠前(因为 A 的 ASC 码比 a 的 ASC 码要小)。 来源: 2000 年清华大学计算机研究生机试真题之前做的都是纯数字排序题,这次是一组信息,按要求比较排序,王道考研机试指南用的是c语言的结构体完成的,我准备用c++的类成员实现。这道题中的比较字符串需要调用string.h中的strcmp函数,另外对于三个层次的排序要求另外写一个bool类型的函数cmp, 作为参数放在sort中。
一旦建立了 cmp 函数,该函数便可作为计算机对其进行排序的依据,所以我们依然可以使用 sort 函数对其进行快速排序,但是不要忘记,将 sort 的第三个参数设定为 cmp 函数,使 sort 函数知道该应用什么规则对其进行定序。
#include#include #include using namespace std;class Student{ public: void getInf(){ cin >> name >> age >> score;} void showInf(){ cout << name << " " << age << " " << score << endl;} char name[100]; int age; int score;};bool cmp(Student s1, Student s2){ if(s1.score != s2.score) return s1.score < s2.score; int temp = strcmp(s1.name, s2.name); //用strcmp实现字符串比较 if(temp != 0) return temp < 0; if(s1.age != s2.age) return s1.age < s2.age;}int main(){ int n; while(cin >> n) { Student stu[n]; for(int i = 0; i < n; i ++) stu[i].getInf(); sort(stu, stu + n, cmp); for(int j = 0; j < n; j ++) stu[j].showInf(); } return 0;}
#include#include using namespace std;int main(){ char *a, *b; cin >> a >> b; return 0;}
分析之后可能是因为字符指针没有分配内存空间就直接赋值,这样不行。于是改进:
#include#include #include using namespace std;int main(){ const int maxlength=100; char *a=(char *)malloc(maxlength*sizeof(char)); char *b=(char *)malloc(maxlength*sizeof(char)); cin >> a >> b; cout << a << " " << b; return 0;}
成了。