博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[排序]
阅读量:3732 次
发布时间:2019-05-22

本文共 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;}

遇到的问题以及解决办法

  1. Student stu[n];这句话一开始放在了主函数内while循环之外,导致结果错误。
  2. 数据成员char name[100];一开始定义为了char*,导致结果错误。但是我不知道为什么错了,于是进行了测试:
#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;}

成了。

你可能感兴趣的文章
一文搞懂Celery
查看>>
linux终端输入命令时常用的快捷键
查看>>
requests库的简单使用
查看>>
sql注入总结
查看>>
python脚本借助代理刷浏览量
查看>>
浅谈csrf和ssrf
查看>>
ubuntu提示E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)
查看>>
PHP无字母数字构造Webshell
查看>>
计算机网络知识点
查看>>
CentOS 7防火墙开放端口
查看>>
python-端口扫描
查看>>
python实现文件上传
查看>>
Metasploit Framewok的简单使用
查看>>
Bugku-Linux2
查看>>
msf-ftp
查看>>
msf-mysql弱口令爆破
查看>>
hydra的基本使用方法
查看>>
Cookie重放攻击
查看>>
php中的$$变量覆盖问题
查看>>
Ubuntu中E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它
查看>>