您的位置:首页 > 其它

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

2017-06-17 11:08 1106 查看
## 结构体与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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  语言 结构 数据