PTA - 书籍/ 学生/ 成绩/ 学生成绩 排序【sort()函数】

PTA - 书籍/ 学生/ 成绩/ 学生成绩 排序【sort()函数】

文末有知识点小结

书籍排序

题目:编写程序,从键盘输入 n (n<10)本书的名称和定价并存入结构数组中,按单价从小到大排序并输出排序后的书籍信息。
输入输出示例:括号内为说明,无需输入输出

输入样例:

3 (n=3)
Programming in C
21.5
Programming in VB
18.5
Programming in Delphi
20

输出样例:

Programming in VB 18.5
Programming in Delphi 20.0
Programming in C 21.5

#include 
#include  
#include    // sort()函数所需头文件 
#include 	   // 保留小数位所需头文件 
 
using namespace std;

// 声明结构体Book
struct Book
{
	string book_name;   // 书名
	double price;       // 定价
};

// 比较函数 
bool cmp(const Book &b1, const Book &b2)   // 引用传递(常引用)
{
	return b1.price < b2.price;    // 单价从小到大排序
}

int main()
{
	int n;
	cin >> n;
	cin.ignore();   // 用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响 
	
	struct Book b[n];   // 结构数组 
	
	for (int i = 0; i < n; i++)
	{
		getline(cin, b[i].book_name);
		cin >> b[i].price;
		cin.ignore();
	}
	
	sort(b, b + n, cmp);   // 排序 
	
	for (int i = 0; i < n; i++)
		cout << b[i].book_name << " " 
		     << fixed << setprecision(1) << b[i].price   // 保留小数后1位 
			 << endl;
	
	return 0;	
} 

学生排序

题目:编写程序,从键盘输入 n (n<10)个学生的学号(学号为4位的整数,从1000开始)、成绩并存入结构数组中,按成绩从低到高排序并输出排序后的学生信息。
输入输出示例:括号内为说明,无需输入输出

输入样例:

3 (n=3)
1000 85
1001 90
1002 75

输出样例:

1002 75
1000 85
1001 90

#include 
#include   // sort()函数所需头文件 
using namespace std;

//  声明结构体Student 
struct Student
{
	int number;   // 学号
	int score;	  // 成绩
};

// 比较函数 
bool cmp(const Student &s1, const Student &s2) // 引用传递(常引用)
{
	return s1.score < s2.score;  // 成绩从低到高排序
}

int main()
{
	int n;
	cin >> n;
	
	struct Student s[n];  // 结构数组 
	
	for (int i = 0; i < n; i++)
		cin >> s[i].number >> s[i].score;
	
	sort(s, s + n, cmp);  // 排序 
	
	for (int i = 0; i < n; i++)
		cout << s[i].number << " " << s[i].score << endl;
		
	return 0;
}

成绩排序

题目:某班有n个学生,输入该班这n个学生的姓名、某三门课的成绩,计算各自的平均成绩,存放到一个结构数组中,将平均成绩作为关键字,然后把该这些学生的名字和平均成绩按从大到小的顺序排列输出.如果有相同分数则名字字典序小的在前。

输入格式:

第一行为人数n,n为正整数.接下来的n行,每行为每个学生的名字和他的3门课程的成绩(小数点后最多有2位小数), 中间用单个空格隔开.名字只包含字母且长度不超过20.即:学生的姓名 分数 分数 分数.

输出格式:

把成绩单按平均分数从高到低的顺序进行排序并输出,每行包含名字和分数,两项之间有一个空格.如果有相同分数则名字字典序小的在前.平均分输出小数点后2位. 4舍5入.

输入样例:

在这里给出一组输入。例如:

8
Kitty 66.66 66.66 66.67
Hanmeimei 66.66 66.66 66.66
Joey 92 58 96
Tim 28 68 32
Test 56 98 78
Sdt 78 65 90
Red 45 56 89
Wed 56 89 74

输出样例:

在这里给出相应的输出。排序输出结果按照四舍五入之后的值进行排序.例如:

Joey 82.00
Sdt 77.67
Test 77.33
Wed 73.00
Hanmeimei 66.66
Kitty 66.66
Red 63.33
Tim 42.67

#include 
#include 
#include    // sort()函数所需头文件 
#include      // 保留小数位所需头文件 

using namespace std;

// 声明结构体Student 
struct Student
{
	string name;
	double score1;
	double score2;
	double score3;
	int average;
};

bool cmp(const Student &s1, const Student &s2)  // 引用传递(常引用)
{
	if (s1.average != s2.average)
		return s1.average > s2.average;   // 平均分从高到低排序 
	else 
		return s1.name < s2.name;     	  // 相同分数则名字字典序小的在前 
}

int main()
{
	int n; 
	cin >> n;
	cin.ignore();
	
	struct Student s[n];  // 结构数组 
	
	for (int i = 0; i < n; i++)
	{
		cin >> s[i].name >> s[i].score1 >> s[i].score2 >> s[i].score3;
		s[i].average = (s[i].score1 + s[i].score2 + s[i].score3) / 3;
	}
	
	sort(s, s + n, cmp);  // 排序 
	
	for (int i = 0; i < n; i++)
		cout << s[i].name << " "
			 << fixed << setprecision(2) << (s[i].score1 + s[i].score2 + s[i].score3) / 3    // 保留小数后2位 
			 << endl;
	
	return 0;
}

学生成绩排序

题目:假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型。输入n(n<50)个学生的成绩信息,按照学生的个人平均分从高到低输出他们的信息。如果平均分相同,按输入的先后顺序排列。

输入格式:

输入一个正整数n(n<50),下面n行输入n个学生的信息,包括:学号、姓名、三门课程成绩(整数)。

输出格式:

输出从高到低排序后的学生信息,包括:学号、姓名、平均分(保留两位小数)。

输入样例:

3
101 Zhang 78 87 85
102 Wang 91 88 90
103 Li 75 90 84

输出样例:

102,Wang,89.67
101,Zhang,83.33
103,Li,83.00

#include 
#include 
#include   // sort()函数必需的头文件 
#include     // 保留小数位所需头文件 
using namespace std;

// 声明结构体Student 
struct Student
{
	int number;    // 学号 
	string name;   // 姓名 
	int score[3];  // 课程成绩 
	double average;
};

// 比较函数 
bool cmp(const Student &s1, const Student &s2)    // 引用传递(常引用) 
{
	
	if (s1.average != s2.average)
		return s1.average > s2.average;  // 平均分从高到低排序 
	
	else
		return s1.number < s2.number;   //平均分相同,按输入的先后顺序排列 
}
 
int main()
{
	int n;
	cin >> n;
	 
	struct Student s[n];  // 结构数组 
	
	for (int i = 0; i < n; i++)
	{
		cin >> s[i].number 
		 	>> s[i].name 
			>> s[i].score[0] 
			>> s[i].score[1] 
			>> s[i].score[2];
		s[i].average = (s[i].score[0] + s[i].score[1] + s[i].score[2]) / 3.0;
	}
	
	sort(s, s + n, cmp);    // 排序 
	
	for (int i = 0; i < n; i++)
		cout << s[i].number << "," 
		     << s[i].name << ","
			 << fixed << setprecision(2) << s[i].average   // 保留小数后2位 
			 << endl;
	
	return 0;
}

知识点小结:

一、sort()函数:

1、头文件:

#include  

2、sort()函数三个参数解释:

sort()函数三个参数解释:
第一个参数:排序的起始点
第二个参数:排序的终止点
第三个参数:排序函数

3、sort()函数模板:sort(start, end, 排序方法);


二、函数中使用const(修饰函数的参数、返回值、定义体)

1、重点:引用参数中使用const

bool cmp(int a, int b);
bool cmp(const int &a, const int &b);
区别
int:按值传递 —— 用于函数将自动产生临时变量用于复制该参数(会 建立 一个类对象的 副本 ,然后传递过去), 效率较低
const int &:引用传递—— 仅借用一下参数的别名而已,不需要产生临时对象( 直接传递地址 ), 效率较高

:引用传递有可能改变参数,const修饰可以解决这个问题

2、 const修饰函数的返回值、定义体(不常使用)

详细可查阅 const关键字 <——点击他

你可能感兴趣的:(c++【排序】)