初级启示者
sort就是结构体排序
赵逸凡在2018-08-25 17:08:10追加了内容
const int tree_old=10000;
struct a_family
{
int son_dot,daughter_dot,father_tree,brother_line
}family[tree_old];
main函数里输入n
bool cmp(a_family a,a_family b)
{
if(a.son_dot!=b.son_dot)return a.son_dot>b.son_dot;
将son_dot元素从大到小排列,排整个结构体
}
for(int i=0;i<n;i++)cin>>family[i]. son_dot,daughter_dot,father_tree,brother_line
sort(family,family+n,cmp)//不要cmp默认是升序排列,从小到大,但要保证结构体的元素每次只有一个
赵逸凡在2018-08-25 17:10:29追加了内容
#include <algorithm>这个头文件不能忘
typedef struct example
{
int elem1;
int elem2;
}example;
/*这个comparison函数很重要.如果希望升序排序,就是"<",降序排列就是">"号,这样便于直观记忆.如果希望用elem2作为比较标准
就把elem1改为elem2,这样结构体就以elem2为比较标准排序了.*/
bool comparison(example a,example b){
return a.elem1<b.elem1;
}
int N;
fin>>N;
vector<example> array(N);
for(int i=0;i<N;i++)
{
fin>>array[i].elem1>>array[i].elem2;
}
sort(array.begin(),array.end(),comparison);
for(int i=0;i<N;i++)
{
cout<<array[i].elem1<<" "<<array[i].elem2<<endl;
}
赵逸凡在2018-08-25 17:11:30追加了内容
刚才的代码是noi赛的部分代码
新手守护
好好看着我装逼装出来的程序🆒
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int n,a[110],i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
for(i=1;i<=n;i++) cout<<a[i]<<' ';
return 0;
}
别举报,由于这个问题特殊,我才大大方方的给了你们源代码(好像并不是某一题的吧?)
高级守护
## 结构体与sort排序的完美结合 ##
在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C++语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。
C++中定义了一组表示整数、浮点数、单个字符和布尔值的算术类型(arithmetic type)。还有空类型:关键字void,不能用于普通变量的声明和普通的操作,只能用于指针型变量,函数返回值和函数参数。这些统称为预定义类型。
另一类为自定义类型:数组、结构体(struct)、联合体(union)、枚举(enum)。
一、结构类型:
“结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构即是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义一样。
二、结构的定义:
struct 名称{
数据类型 变量名1;
数据类型 变量名2;
。。。。
数据类型 变量名n; //成员表
成员函数; //可以没有
}结构体变量名;
成员表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:
类型说明符 成员名;
成员名的命名应符合标识符的书写规定。
例如:
1
2
3
4
5
6
7 struct stu
{
int num;
char name[20];
char sex;
float score;
};
在这个结构定义中,结构名为stu,该结构由4个成员组成。 第一个成员为num,整型变量;第二个成员为name,字符型数组;第三个成员为sex,字符型变量;第四个成员为score,浮点型变量。 应注意在括号后的分号是必不可少的。
值得一提的是,在C++中,struct的功能得到了强化,struct不仅可以添加成员变量,还可以添加成员函数,和class类似。
三、struct结构体的使用:
在定义了一个结构类型后,可以定义该类型的变量。
例如:
1
2
3
4
5
6
7 struct stu
{
int num;
char name[20];
char sex;
float score;
}a[100];
这样就定义了stu型的有100个存储空间的a数组
还可以:
1
2
3
4
5
6
7
8
9
10
11
struct stu
{
int num;
char name[20];
char sex;
float score;
}; //注意这里不能省略;
int main()
{
stu a[100];
}//效果如上
见下例:
struct DATA{
int a[2]; //成员为一个数组
int c;
}data_a,data_b;
或者:
struct DATA{
int a[2];
int c;
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
DATA data_a,data_b;//这种定义方式与上一种方式的效果是相同的,可放在主函数内或外;
四、结构体成员的调用:
结构体变量与各个成员之间引用的一般形式为:
结构体变量名. 成员名
对于上面定义的结构体变量,我们可以这样操作:
cin>>data_a.a[0]>>data_a.a[1]; //一般情况下不能写 cin>>data_a;
int a=data_a.a[0]+data_a.a[1]; //就像用整形变量一样用a[0]、a[1]
data_b=data_a; //结构体之间的相互赋值是合法的
data_a.c=0; //就如同给整形变量赋值
实际上结构体成员的操作与该成员类型所具有的操作是一致的。
关于结构体里的成员函数我们先忽略掉。
成员运算符“.”在存取成员数值时使用,其优先级最高,并具有左结合性。在处理包含结构体的结构体时,可记作:
strua. strub. membb
这说名结构体变量 strua 有结构体成员 strub;结构体变量 strub 有成员 membb。
课堂练习:请同学们定义一个包含:姓名,身高(厘米),体重(公斤),性别,工资(元),家庭住址的个人信息结构体,并完成输入和输出。(单人)
五、结构体操作实例:
阅读理解下例:
#include<iostream>
using namespace std;
struct DATA{
int a[2]; //成员为一个数组
int c; //用来计算总和
int max() //定义成员函数
{
return a[0]>a[1]?a[0]:a[1];
//默认该结构体变量的成员作为引用参数
}
}data_a[5]; //我们可以定义结构体数组
/*结构体的初始化,按成员定义的顺序赋值,每个成员用“,”隔开*/
DATA data_b={{15,20},35}; /*每个成员初始化和同类型变量初始化方式相同*/
int main() {
cout<<data_b.max()<<endl;
for (int i=0;i<5;++i) {
cin>>data_a[i].a[0]>>data_a[i].a[1];
data_a[i].c=data_a[i].a[0]+data_a[i].a[1];
}
for (int i=0;i<5;++i)
cout<<data_a[i].max()<<' '<<data_a[i].c<<endl;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
程序会先输出:
20
输入样例:
19 63 25 36 10 12 25 96 36 12
输出:
63 82 //最大值,和;
36 61
12 22
96 121
36 48
例1、我们来观察下怎么对结构体里的某些成员来排序:
单一成员排序:
见书194页第一题:
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
struct student
{
float score;
int id;
}a[101];
int comp(const student &a,const student &b)
{
return a.score>b.score;
}
int main()
{
int n,k;
cin>>n>>k;
for (int i=1;i<=n;++i)
cin>>a[i].id>>a[i].score;
sort(a+1,a+n+1,comp);
cout<<a[k].id<<' '<<a[k].score<<endl;
return 0;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
例2、每当考试结束,老师总要对学生的成绩进行排序,以便研究学生学习情况。老师发现学生数目庞大,所以找来了会编程的你,并且它给你了全部同学的分数,希望你能按如下规则排序:1.分数高的排在前面;2.如果分数相同,就把名字字典序低的放在前面。
【输入格式】
第一行一个整数n
接下来n行每行一个学生名字、性别、分数。
【输出格式】
每行一个名字和一个分数
【输入样例】
3
Xiaoxiao female 396
Yingmo male 405
Diyucailang male 399
【输出样例】
Yingmo 405
Diyucailang 399
Xiaoxiao 396
分析:在更多情况下,我们不仅对一个特征进行排序,而是多个特征。例如将学生的成绩进行排序,这时,我们就想到了结构体这种数据类型。当我们采用sort()函数的默认规则排序结构体时,sort()默认结构体中的第一个成员为第一关键字,第二个成员为第二关键字,……,第N个元素为第N关键字,然后从小到大排序;但自定义的数据类型一定要重载大于号,小于号等比较运算符。
例如我们要将学生的成绩从大到小排序,当成绩相同时,根据姓名字典序小的优先的规则排进行序。显然我们无法采用默认规则进行排序。
这时我们可以定义这样的comp:
int score_comp(const student & a,const student & b)
{
if (a.score>b.score) return 1;
if (a.score