结构体操作

结构体的概念

有时候需要存储大量的数据,可以考虑使用数组来存储

但是数组只能存储一组同样数据类型的信息,如果同时记录考生的姓名、成绩等不同的信息,就需要使用结构体

struct 类型名
{
    数据类型 1  成员变量1;
    数据类型 2  成员变量2;
};

结构体定义:

struct student
{
    string name;    //学生名字
    int chinese,math,english;   //学生成绩
};

定义一个名字是student的结构体类型

我们把结构体当中的每个变量叫做成员变量

在这个例子中,一共有四个成员变量,name是字符串,chinese,math,englisth是整数类型

在使用结构体之前,必须先新建一个结构体实例,采用  结构体名称 变量

#include <iostream>
#include <string>

using namespace std;

struct student {
    string name;
    int math,english,chinese;
};

int main(){
    //新建一个student实例,名称是s1
    student s1;

}

结构体的赋值

针对变量整体赋值

在定义结构体变量时对其进行整体的初始化赋值

#include <iostream>
#include <string>

using namespace std;

struct student {
    string name;
    int math,english,chinese;
};

int main(){
    student s1 = {"zhangsan",60,70,80};
    return 0;
}

给成员变量单独赋值

在定义完结构体变量之后,对成员变量进行单独赋值

#include <iostream>
#include <string>

using namespace std;

struct student{
    string name;
    int math,english,chinese;
};

int main(){
    student s1;
    
    s1.name = "zhangshan";
    s1.math = 60;
    s1.chinese = 70;
    s1.english = 80;

    cout << s1.name << endl;
    cout << s1.chinese << endl;
    cout << s1.english << endl;
    cout << s1.math << endl;

    return 0;
}

格式:结构体变量名.成员名 = 数据值;

问题

课代表需要统计成绩及格的同学的名字,已知5个同学的成绩和姓名,编写程序输出及格同学的姓名

100 zhangming

78 liukai

56 zhoutao

98 yuanqiu

92 daiqiao

zhangming

liukai

yuanqiu

daiqiao

问题分析

1.定义一个5个大小的结构体数组,用于存储5个同学的成绩和名字

2.通过循环的方式来获得输入

3.遍历数据,一旦发现成绩有大于60的,则输出名称

#include <iostream>
#include <string>

using namespace std;

//建立结构体,题目当中只有名称和成绩
struct student{
    int score;
    string name;
};

int main(){
    student s[5];

    //利用循环进行输入操作
    for (int i = 0;i < 5;i++){
        cin >> s[i].score >> s[i].name;
    }

    //利用循环遍历,找出成绩及格的同学
    for (int i = 0 ;i < 5;i++){
        if (s[i].score >= 60)
            cout << s[i].name << endl;
    }

    return 0;
}

问题

收集了若干名同学的姓名和数学、语文的成绩,需要编程找到总成绩第n名的同学,并输出他的姓名

4 2

98 78 zhangming

78 92 yuanfeng

89 95 liuyue

100 89 lili

liuyue

排序函数

sort (排序其实地址,终止地址)

默认从小到大进行排序,终止地址不包括当前位置的元素,即只排序初始地址元素到终止地址之间的元素,

注:需要包含头文件:<algorithm>

#include <iostream>
#include <algorithm>

using namespace std;

int main(){
    int a[10] = {5,14,6,12,1,2,98,23,56,34};

    //对数组进行排序
    sort(a,a+10);

    for (int i = 0;i < 10;i++){
        cout << a[i] << " ";
    }
}

使用案例

1 2 5 6 12 14 23 34 56 98

#include <iostream>
#include <algorithm>

using namespace std;

bool cmp(student a,student b){
	return a.math > b.math;
}

如何对结构体进行排序

结构体中有很多成员变量,有的时候,我们对结构体进行排序按照一个成员变量的大小进行排序

我们需要新建一个函数,用于告诉计算机该用哪个成员变量来进行比较

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

struct student{
    int sum;
    string name;
};

bool cmp(student a,student b){
    return a.sum > b.sum;
}

int main(){
    student s[5];

    s[0].sum = 78;
    s[0].name = "liuyue";

    s[1].sum = 60;
    s[1].name = "zhangming";

    s[2].sum = 70;
    s[2].name = "huang";

    s[3].sum = 58;
    s[3].name = "hetian";

    s[4].sum = 76;
    s[4].name = "liyue";

    sort(s,s+5,cmp);

    for (int i = 0;i<5;i++){
        cout << s[i].name << "," << s[i].sum << endl;
    }

}

使用案例

liuyue,78
liyue,76
huang,70
zhangming,60
hetian,58

问题分析

1.定义一个足够大的结构体数组,用于存储同学的成绩和名字

2.获得相关的输入,包括同学数、总成绩第几名的同学、同学的成绩和姓名

3.计算总成绩,并进行排序,输出结果

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

struct student{
    int chinese,math;
    string name;
    int sum;
};

bool cmp(student a,student b){
    return a.sum > b.sum;
}

int main(){
    int k,n; //k用于存储整数,n用于存储第几个学生
    student s[30];  //最多可以存储30个学生

    cin >> k >> n;

    for (int i = 0;i < k ;i++){
        cin >> s[i].chinese >> s[i].math >> s[i].name;
        s[i].sum = s[i].chinese + s[i].math;
    }

    sort(s,s+k,cmp);    //进行排序操作

    cout << s[n - 1].name << endl;
    
}

示例代码

课后练习

问题(P2641)

为期2天的跑步比赛已经结束了,赛事的组织方收集了所有参赛选手姓名和2天的跑步里程,编写程序输出2天总里程数从低到高的参赛选手姓名

3

Hong  3000.5  3100

Jone  2998.5  3200

Anna  3110  2980.5

Anna

Hong

Jone

问题分析:

1.新建立一个结构体,用于存储数据

2.获得相应的输入,包括人数、姓名、成绩

3.使用sort()函数进行排序

4.输出结果

示例代码

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

struct stu{         //定义结构体
    string name;
    int one,two;
};

bool cmp(stu a,stu b){  //定义比较函数
    return (a.one + a.two) < (b.two + b.one);
}

int main(){
    stu s[30];
    int n;

    //获得相应的输入
    cin >> n;

    for (int i = 0;i < n;i++){
        cin >> s[i].name >> s[i].one >> s[i].two;
    }

    //对结构体数组进行排序
    sort(s,s + n,cmp);

    //排序后输出结果
    for (int i = 0;i < n; i++){
        cout << s[i].name << endl;
    }

    return 0;
}

问题(P2642)

考试后班主任拿到了信息学科考试的成绩单,成绩单包括学号、姓名和成绩。编写程序,输出后3名同学的信息,如果存在成绩相同者,属于位次相同,一并输出

5

1001 haha 98.5

1002 liulan 78

1003 haoli 89.5

1004 dadu 77.5

1005 pingan 82

1004 dadu 77.5

1002 liulan 78

1005 pingan 82

问题分析:

1.新建立一个结构体,用于存储数据

2.获得相应的输入,包括人数、学号,姓名,成绩

3.使用sort()函数进行排序,从小到大

4.输出前面3个的结果

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

struct stu{         //定义结构体
    int number;
    string name;
    float score;
};

bool cmp(stu a,stu b){  //定义比较函数
    return a.score < b.score;
}

int main(){
    stu s[30];
    int n;

    //获得相应的输入
    cin >> n;

    for (int i = 0;i < n;i++){
        cin >> s[i].number >> s[i].name >> s[i].score;
    }

    //对结构体数组进行排序
    sort(s,s + n,cmp);

    //排序后输出结果
    cout << "result:" << endl;
    for (int i = 0;i < 3; i++){
        cout << s[i].number << " "  <<  s[i].name <<  " " << s[i].score << endl;
    }

    return 0;
}

示例代码

Made with Slides.com