4-2 定制自己的容器:结构体和共用体
本节编程练习不计算学习进度,请电脑登录imooc.com操作

定制自己的容器:结构体和共用体

在上一小结,利用数组的知识,很方便的存储了全班 50 名同学的数学成绩。

#include <stdio.h>

int main(int argc,char **argv)
{
    int math[50];
    return 0;
}

有的同学可能会这样写:

#include <stdio.h>

int main(int argc,char **argv)
{
    int math[50];
    int english[50];
    return 0;
}

这样做是可以的,程序也是可以跑的。那么有没有可能让程序变得更好呢?

我们来思考一下。我们的这个程序里,实际上所有的成绩都是分开的,之间并没有什么关联,这样会带来一个问题,那就是当我们想集中操作某一个学生的成绩的时候,就会变得有一些麻烦。

例如,我们要计算某个学生的平均分的时候,我们实际上只能通过下标来搜索某个学生的成绩。

那么有没有办法能让这个问题得到改善呢?能让同一个学生的成绩"打包"存放。

事实上,在这个问题里,我们需要的是一种基础数据类型之外的数据类型,这种数据类型指代了一个学生,其中包含两个部分,第一个部分用来存放学生的数学成绩,第二个部分用来存放学生的英语成绩。

C++ 为我们提供了这样一种自定义数据类型的功能,叫做结构体。你可以定义一个结构体,用几种相同或者不同的基本数据类型的组合自定义这个数据类型中的内容。这样,我们就可以完成数据"打包"的目标。

在定义了一个结构体之后,我们就可以使用这个结构体了,结构体的使用和变量非常类似:

struct Student
{
    int math;
    int english;
};

int main(int argc,char **argv)
{
    struct Student stu;
    return 0;
}
````

这样申明一个结构体变量stu之后,这个 stu 中就包含两个变量,一个是 int 类型的 math,一个是 int 类型的 english。那么这个时候,这两个值其实并没有被初始化,这两个值是随机的值。我们可以用如下代码来为这两个变量进行赋值。

stu.math = 95;
stu.english = 93;

还有一种方法,可以在申明结构体变量的时候进行初始化。

struct Student stu = {95, 93};

回到我们最初的问题,记录50个学生的成绩,程序应该怎么写呢?

struct Student
{
    int math;
    int english;
}

int main(int argc,char **argv)
{
    struct Student stu[50];

    //为其中一个学生的成绩赋值
    stu[20].math = 90;
    stu[20].english = 95;

    return 0;
}

任务

  1.  
下一节