C++016-C++结构体

简介: C++016-C++结构体

C++016-C++结构体



在线练习:

http://noi.openjudge.cn/

https://www.luogu.com.cn/


结构体


参考:https://www.cnblogs.com/ybqjymy/p/16561657.html

https://blog.csdn.net/weixin_45984283/article/details/124211891


目标

1、掌握结构体的基本使用

2、学会使用sort()函数

3、学会结构体排序


结构体

结构体是一个由程序员定义的数据类型,可以容纳许多不同的数据值。在定义结构体时,系统对之不分配实际内存。只有定义结构体变量时,系统才为其分配内存。


定义结构体
struct 结构体名{
    结构体成员列表
};

如:


struct PayRoll
{
    int empNumber;
    string name;
    double hours,payRate,grossPay;
};

实例化结构体

1. 先定义结构体类型再单独进行变量定义

#include <bits/stdc++.h>
using namespace std;
struct Student
{
    int Code;
    char Name[20];
    char Sex;
    int Age;
};
int main()
{
    struct Student Stu;
    struct Student StuArray[10];
    struct Student *pStru;
    return 0;
}

2. 紧跟在结构体类型说明之后进行定义

#include <bits/stdc++.h>
using namespace std;
struct Student
{
    int Code;
    char Name[20];
    char Sex;
    int Age;
}Stu,StuArray[10],*pStu;
int main()
{
    Stu;
    StuArray[10];
    //pStru;
    return 0;
}


af6bf91bf6877330e5a5d4b878fab234_1e87822944374318b6773253245d7a50.png

fb511d16a4938863613c9fc85b8b8942_5b9fc9b78a2441d5bc5f119ebf15d5ec.png

3. 在说明一个无名结构体变量的同时直接进行定义

这种情况下,之后不能再定义其他变量。


#include <bits/stdc++.h>
using namespace std;
struct
{
    int Code;
    char Name[20];
    char Sex;
    int Age;
}Stu,Stu1[10],*pStu;
int main()
{
    return 0;
}

4. 使用typedef说明一个结构体变量之后再用新类名来定义变量

#include <bits/stdc++.h>
using namespace std;
typedef struct
{
    int Code;
    char Name[20];
    char Sex;
    int Age;
}Student;
Student Stu1,Stu[10],*pStu;
int main()
{
    return 0;
}

Student是一个具体的结构体类型,唯一标识。这里不用再加struct


5. 使用new动态创建结构体变量

使用new动态创建结构体变量时,必须是结构体指针类型。访问时,普通结构体变量使用使用成员变量访问符".“,指针类型的结构体变量使用的成员变量访问符为”->"。

注意:动态创建结构体变量使用后勿忘delete。


#include <iostream>
using namespace std;
struct Student
{
    int Code;
    char Name[20];
    char Sex;
    int Age;
}Stu,StuArray[10],*pStu;
int main(){
    Student *s = new Student();  // 或者Student *s = new Student;
    s->Code = 1;
    cout<<s->Code;
    delete s;
    return 0;
}

题目描述

【描述】统计2位同学的姓名、年龄、语文成绩、数学成绩、英语成绩,输出总分较高的同学姓名,如果总分相同,则分别输出两位同学的姓名,中间用空格隔开。

【输入】2行,两个同学的姓名、年龄、语文成绩、数学成绩、英语成绩,每个同学的信息占一行;

【输出】1行,总分较高的同学的姓名或者两位同学的姓名,中间空格隔开;

【样例输入】

zhang3 12 93 100 98

li4 17 86 100 96

【样例输出】

zhang3


#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
struct STU
{
    string name;
    int age,yu,shu,ying;
    int sum()
    {
        return yu+shu+ying;
    }
};
int main()
{
    STU a;
    STU *b = new STU();
    int suma,sumb;
    cin>>a.name>>a.age>>a.yu>>a.shu>>a.ying;
    cin>>b->name>>b->age>>b->yu>>b->shu>>b->ying;
//    suma=a.yu+a.shu+a.ying;
//    sumb=b->yu + b->shu + b->ying;
    suma=a.sum();
    sumb=b->sum();
    if(suma>sumb) cout<<a.name;
    else if(suma<sumb) cout<<b->name;
    else cout<<a.name<<" "<<b->name;
    return 0;
}

sort()函数

sort函数介绍

注意:使用sort()需要加头文件#include;如果使用了万能头则不必添加;


#include<algorithm>
#include<bits/stdc++.h>

调用形式: sort ( first_pointer , first_pointer+n , cmp )


第一个参数:数组的首地址,通常是数组名。

第二个参数:首地址+数组的长度n。

第三个参数:排序规则函数的名称(自定义函数cmp),若无此函数,sort会默认按数组升序排序(从小到大)。


题目描述

【描述】输入n和n名学生的成绩,把成绩从小到大排

序后输出。

【输入】2行。第一行是n;第二行是n名学生的成绩,

空格分隔。

【输出】排序后的学生成绩。

【样例输入】

5

5 3 4 2 1

【样例输出】

1 2 3 4 5


#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a[101];
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    return 0;
}

参数填写:sort ( first_pointer , first_pointer+n , cmp );

当cmp函数省略时,只能对数组进行排序,而且默认从小到大


结构体排序cmp

注意:结构体排序必须写cmp函数cmp函数格式:


bool cmp(类型a,类型b){
比较规则;
)

比较规则:如果返回值为1,那么a排在前面;否则b排在前面。

注意:不要把返回值写成恒为1或者0的形式。


//#include<iostream>
//#include<stdio.h>
//#include<string>
#include<bits/stdc++.h>
using namespace std;
struct STU
{
    string name;
    int age,yu,shu,ying;
    int sum()
    {
        return yu+shu+ying;
    }
} a[101];
bool cmp(STU a,STU b)
{
    //当a的总分大于b的总分返回为真,既降序
    return a.sum()>b.sum();
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<n+1;i++)
    {
        cin>>a[i].name>>a[i].yu>>a[i].shu>>a[i].ying;
    }
//    suma=a.yu+a.shu+a.ying;
//    sumb=b->yu + b->shu + b->ying;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<n+1;i++) cout<<a[i].yu<<" "<<a[i].shu<<" "<<a[i].ying<<endl;
    return 0;
}

4ba8c49d73d58883a48d4b06e820b340_c3289d915aad48adb4e6bfca9b8f4f7f.png


联合体union

联合体的对齐操作,参考:https://zhuanlan.zhihu.com/p/184956286


结构体与联合体异同点

union,中文名“联合体、共用体”,在某种程度上是类似结构体struct的一种数据结构,联合体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

两者区别如下:


结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。

联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”,即任何两个成员不会同时有效;但优点是内存使用更为精细灵活,也节省了内存空间。


当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:


联合体是一个结构体;

它的所有成员相对于基地址的偏移量都为0;

此结构空间要大到足够容纳最"宽"的成员;

其内存对齐方式要适合其中所有的成员;


#include<iostream>
using namespace std;
struct STU1
{
    int n;
    char s[11];
    double d;
} S1;
struct STU2
{
    int n;
    char s[5];
    double d;
} S2;
union U1
{
    int n;
    char s[11];
    double d;
};
union U2
{
    int n;
    char s[5];
    double d;
};
int main()
{
    cout<<sizeof(S1)<<'\t'<<sizeof(S2)<<endl;
    cout<<"S1各数据地址:\n"<<&S1<<'\t'<<&S1.d<<'\t'<<&S1.s<<'\t'<<&S1.n<<endl;
    cout<<"S2各数据地址:\n"<<&S2<<'\t'<<&S2.d<<'\t'<<&S2.s<<'\t'<<&S2.n<<endl;
    cout<<"----------------"<<endl;
    U1 u1;
    U2 u2;
    cout<<sizeof(u1)<<'\t'<<sizeof(u2)<<endl;
    cout<<"u1各数据地址:\n"<<&u1<<'\t'<<&u1.d<<'\t'<<&u1.s<<'\t'<<&u1.n<<endl;
    cout<<"u2各数据地址:\n"<<&u2<<'\t'<<&u2.d<<'\t'<<&u2.s<<'\t'<<&u2.n<<endl;
}

94ca23f13c9102024f9d3c761c9d8b09_8d029a211642417083cc1e95fa188351.png


在线练习:


http://noi.openjudge.cn/


总结


本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为C++结构体案例,包括相关案例练习。


相关文章
|
2月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
|
2月前
|
C++
C++系列十四:结构体
C++系列十四:结构体
|
2月前
|
C++
.C++中结构体数组docx
.C++中结构体数组docx
14 0
|
5月前
|
存储 算法 编译器
|
22天前
|
C++
C++结构体
C++结构体
|
29天前
|
NoSQL C++
c++中包含string成员的结构体拷贝导致的double free问题
c++中包含string成员的结构体拷贝导致的double free问题
9 0
|
2月前
|
设计模式 算法 编译器
【C++ 泛型编程 入门篇】C++ 元编程 :模板结构体的的使用教程
【C++ 泛型编程 入门篇】C++ 元编程 :模板结构体的的使用教程
59 1
|
2月前
|
存储 程序员 Shell
【C/C++ 基本语法 结构体】C++ 结构体声明(定义)以及不同写法的差异
【C/C++ 基本语法 结构体】C++ 结构体声明(定义)以及不同写法的差异
22 1
|
4月前
|
存储 移动开发 Linux
C++017-C++文件读写应用
C++017-C++文件读写应用
|
4月前
|
JSON 数据格式 C++
C++ Json和结构体或类的转换
C++ Json和结构体或类的转换
64 0