C++U3-第4课-结构体应用

发布时间 2023-12-11 14:05:26作者: 小虾同学

上节课作业分析讲解:

链接:https://pan.baidu.com/s/15b4fJq1Xxd2X6uB9CJuVXw?pwd=r9nt
提取码:r9nt

结构体应用

 sort排序函数回顾

 结构体排序

结构体排序,排序的时候给cmp函数传递的是新创建的结构体类型,所以函数里形参类型就是结构体的类型

 例题1

#include<iostream>
#include<algorithm>
using namespace std;

// 定义学生结构体
struct student{
    string name; // 学生姓名
    int id;      // 学生学号
    double sum;  // 学生总分
} x[110];       // 存放学生的数组,最多存放110个学生

// 比较函数,用于排序学生数组
bool cmp(student x, student y){
    return x.sum > y.sum; // 根据学生总分降序排序
}

int main(){
    int n;
    cin >> n; // 输入学生数量
    for(int i = 1; i <= n; i++) {
        cin >> x[i].name >> x[i].id >> x[i].sum; // 输入每个学生的姓名、学号和总分
    }
    sort(x + 1, x + 1 + n, cmp); // 对学生数组进行排序
    for(int i = 1; i <= n; i++) {
        cout<<x[i].name<<" "<<x[i].id<<" "<<x[i].sum<<endl; // 输出排序后的学生信息
    }
    return 0;
}
View Code

 

例题2

 cmp函数内部编写排序逻辑

定义一个结构体,成员有六个,分别为字符串类型存储姓名、整数类型存储学号、浮点数类型存储语、数、英成绩,总分。定义一个结构体数组,然后输入每个人信息,先按总分从高到低排序,如果总分相同,就按语文成绩从高到低排序,如果语文成绩也相同那么就按学号从小到大排序。

1、定义变量,声明结构体类型,包含姓名,语数英成绩,总分,学号

2、输入变量 n 和 n 个学生的信息

3、排序

​ 3.1、总分从高到低排序

​ 3.2、总分相同,就按语文成绩从高到低排序

​ 3.3、总分和语文成绩都相同,学号从小到大排序

4、输出

【参考代码】
#include<iostream>
#include<algorithm>
using namespace std;
struct stu
{
    string name;  //姓名
    int id;    //学号
    double chinese , math , english , sum;    //语文成绩 数学成绩 英语成绩 总分
} x[110];
bool cmp(stu a , stu b)
{
    if(a.sum != b.sum)
        return a.sum > b.sum;
    else if(a.chinese != b.chinese)
        return a.chinese > b.chinese;
    else
        return a.id < b.id;
}
int main()
{
    //1、定义变量,声明结构体类型,包含姓名,语数英成绩,总分,学号 
    int n;
    //2、输入变量 n 和 n 个学生的信息 
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> x[i].name >> x[i].chinese >> x[i].math >> x[i].english;
        x[i].id = i;
        x[i].sum = x[i].chinese + x[i].math + x[i].english;
    }
    //3、排序 
    sort(x + 1 , x + 1 + n , cmp);
    //4、输出 
    cout << x[1].name << " " << x[1].sum << endl;
    cout << x[2].name << " " << x[2].sum << endl;
    return 0;
}
View Code

 

 pair

 

 例题3:

 

【思路分析】
定义一个结构体,成员有两个,分别为字符串类型存储姓名、整数类型存储效率。然后定义一个结构体数组,然后输入每个人信息,然后按照效率进行降序排序。最后按照格式进行输出。

1、定义变量,声明结构体类型,包含两个属性,分别为姓名和效率

2、输入 n 和 n 个人的信息

3、排序

4、输出

【参考代码】
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 19;
struct people
{
    string name;
    int w;
} a[maxn];
bool cmp(people x, people y)
{
    return x.w > y.w;
}
int main()
{
    //1、定义变量,声明结构体类型,包含两个属性,分别为姓名和效率 
    int n;
    //2、输入 n 和 n 个人的信息 
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i].name >> a[i].w;
    //3、排序 
    sort(a, a + n, cmp);
    //4、输出 
    for (int i = 0; i < n; i++)
        cout << a[i].name << " " << a[i].w << '\n';
    return 0;
}
View Code

例题3  生日

【题意分析】
输入 n 和 n 个人的信息,按照年龄从大到小排序,年龄一样,后输入的先输出。

【思路分析】
定义一个结构体,成员有四个,分别为字符串类型存储姓名、四个整数类型存储生日的年、月、日以及下标。然后定义一个结构体数组,然后输入每个人信息,然后按照年龄从大到小进行排序,注意题目要求如果有多个生日一样,则后面的先输出。最后按照格式进行输出。

1、定义变量,声明结构体类型,包含五个属性,姓名,年月日,输入顺序

2、输入 n 和 n 个人的信息

3、结构体排序

​ 3.1、年份不同,年份从小到大排序

​ 3.2、年份相同,月份不同,月份从小到大排序

​ 3.3、年份相同,月份相同,日子不同,日期从小到大排序

​ 3.4、年月日相同,输入顺序从大到小排序

4、输出

【参考代码】
#include <iostream>
#include<algorithm>
using namespace std;

const int maxn = 109;
struct people
{
    string name;
    int year,month,day,id;
} a[maxn];
bool cmp(people x, people y)
{
    if (x.year != y.year)
    {
        return x.year < y.year;
    }
    if (x.month != y.month)
    {
        return x.month < y.month;
    }
    if (x.day != y.day)
    {
        return x.day < y.day;
    }
    return x.id > y.id;
}
int main()
{
    //1、定义变量,声明结构体类型,包含五个属性,姓名,年月日,输入顺序 
    int n;
    //2、输入 n 和 n 个人的信息 
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i].name >> a[i].year >> a[i].month >> a[i].day;
        a[i].id = i;
    }
    //3、结构体排序
    //3.1、年份不同,年份从小到大排序
    //3.2、年份相同,月份不同,月份从小到大排序
    //3.3、年份相同,月份相同,日子不同,日期从小到大排序
    //3.4、年月日相同,输入顺序从大到小排序 
    sort(a, a + n, cmp);
    //4、输出 
    for (int i = 0; i < n; i++)
        cout << a[i].name << '\n';
    return 0;
}
View Code

 

 

本节课作业讲解:

链接:https://pan.baidu.com/s/1ixdm3IlY6oFCqIROOYP0zw?pwd=enrc
提取码:enrc