结构体(struct)

为什么需要结构体

数组是一组具有相同类型的数据的集合。在实际的编程中还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号、年龄为整数,性别为字符,身高,成绩为小数,因为数据类型不同,不能用一个数组来存放。可以使用结构体(struct)来存放一组不同类型的数据。

什么是结构体

结构体是用户自定义的允许存储不同类型数据项的数据结构。( 数组允许存储相同类型数据项的变量)。

结构体的定义形式为

struct 结构体名{
    数据类型1  成员名1;
    数据类型2  成员名2;
    .....
};
//切记分号一定不能忘,这是一条完整的语句!!!

结构体基本用法

创建一个学生结构体

struct student{
    string name;//姓名
    char gender;//性别
    int age;//年龄
    double height;//身高
    string address;//家庭住址
};

创建结构体变量初始化赋值:

1.统一赋值:使用 { }

Student xiaoming = {"小明",'m',10, 120.5,"陕西省西安市..."};

2.分别赋值:变量名.属性名

Student xiaoming;
xiaoming.name = "小明";
xiaoming.gender = 'm';
xiaoming.age = 10;
xiaoming.height = 120.5;
xiaoming.address = "陕西省西安市...";

结构体数组

#include <bits/stdc++.h>
using namespace std;
const int N=1000;
//可以定义结构体的同时定义结构体变量 
struct student{
    string name;
    int age;
    double score;
}stu[N];
//student stu[N];
int main() {
    int n;
    cin >>n;
    for(int i=1;i<=n;i++){
        cin>>stu[i].name>>stu[i].age>>stu[i].score;
    }
    for(int i=1;i<=n; i++){
        cout<<stu[i].name<<" "<<stu[i].age<<" "<<stu[i].score<<endl;
    }
    return 0;
}

结构体排序

冒泡排序

可以对结构体变量的整体进行操作,例如swap(stu[j],stu[j+1])

#include <bits/stdc++.h>
using namespace std;
//按照学生的学号从高到低排序 
struct student{
    int no;
    double score;
}stu[101];
int main() {
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>stu[i].no>>stu[i].score;
    }
    //冒泡排序
    for(int i=1;i<=n-1;i++){
        for(int j=1;j<=n-i;j++){
            if(stu[j].score<stu[j+1].score){
                swap(stu[j],stu[j+1]);
            }
        }
    } 
    //输出
    for(int i=1;i<=n;i++){
        cout<<stu[i].no<<" "<<stu[i].score<<endl;
    }
    return 0;
}

自定义比较函数

// 按照分数从大到小排序
bool cmp(student a, student b){
    return a.score > b.score;
}
sort(stu+1,stu+n+1,cmp);

联合体(union)

定义

联合体也称为共用体,是一种数据格式,能够储存不同类型的数据,但同一时间只能储存其中的一种类型数据。

联合体的所有成员共享同一块内存区域,因此在任何时刻只能有效存储一个成员的值。改变其中一个成员的值会覆盖其他成员的值。

#include <bits/stdc++.h>
using namespace std;
union udata{
    int a;
    double b;
    char c;
};
int main() {
    udata data;
    data.a=10;
    cout<<"整型值:"<<data.a<<endl;
    data.c = 'A';
    cout<<"字符值: "<<data.c<<endl; 
    // 注意此时data.a的值已改变 
    cout<<data.a<<endl;
    return 0;
}
//输出
整型值:10
字符值: A
65

用途

  • 节省内存:当需要在几种不同类型间切换使用同一块内存时。

易错点与避免

  • 数据覆盖:由于成员共享内存,修改一个成员会影响其他成员的值。使用时务必清楚当前活跃的是哪个成员。

小结

结构体与联合体的选择

当需要存储不同类型但同时有效的数据时,选择结构体。

当需要在同一内存位置存储不同类型的数据,且一次只使用一种类型时,考虑使用联合体。

必做题单

作业

Copyright ©图灵之星 2024,转载需注明出处该文件修订时间: 2024-12-23 14:58:20

results matching ""

    No results matching ""