【结构体与sort排序的完美结合】

来源:互联网 发布:由mac地址计算pin码 编辑:程序博客网 时间:2024/05/18 00:59

## 结构体与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;                      };

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;      }

   程序会先输出:
   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;

例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

原创粉丝点击