#975. [笔记]结构体I

[笔记]结构体I

No testdata at current.

No submission language available for this problem.

结构体 I

类型具有多样性,世事万物不太可能只用几个基础类型就进行描述。若是相对复杂对的数据,可以使用结构体(或类 class)创建一种新的类型,进行管理数据。

结构体,又名结构布局,是编程方式从面向过程编程面向对象编程的一个关键知识点。C++ 中的结构体,是后续进阶结构的 "阉割" 版。


创建一个类型

/* 
创建一个名为 Student 的类型,该类型包含成员:
int age;// 整数,年龄
double score; // 浮点,分数
string name; // 字符串,名字
char favorite[20]; // 字符串,喜好
bool gender; // 布尔,性别,女:false,男:true
*/
struct Student {
    int age;
    double score;
    string name;
    char favorite[20];
    bool gender;
};

定义一个存储结构

上述代码便创建了一个 Student 类型,该类型可以类似其它基础类型一样去定义变量,数组。

/*
完整写法应当 struct Student 表示结构布局类型,但 C++ 中将其简化,可直接使用 Student 名称作为类型。
*/
/* 
定义一个 Student 类型的变量,名称为 a
变量 a 中包含成员:
a.age
a.score
a.name
a.favorite
a.gender
内部成员的引用,用 . 引用(点引用)
*/
Student a;

/*
定义一个 Student 类型,共 4 个元素的数组,名称为 b。
相当于定义了 4 个学生,分别是:
b[0]
b[1]
b[2]
b[3]

第 i 个学生,是 b[i],其包含的成员为:
b[i].age
b[i].score
b[i].name
b[i].favorite
b[i].gender
*/
Student b[4];

结构体存储结构的初始化

初始化的内容顺序,与创建,定义时有关,要一一对应。

/*
Student 内部成员定义顺序为:age, score, name, favorite, gender 
*/
Student a = {11, 95.5, "Lily", "睡觉", false};
printf("年龄:%d\n", a.age);
printf("成绩:%.2lf\n", a.score);
printf("姓名: %s\n", a.name.c_str());
printf("喜好:%s\n", a.favorite);
printf("性别:%s\n", a.gender ? "男" : "女");

Student b[3] = {
  {11, 95.5, "Lily", "睡觉", false}, // b[0]
  {15, 90.5, "Luly", "吃饭", false}, // b[1]
  {10, 85.5, "Kyle", "打豆豆", true} // b[2]
}; // 第一个大括号是数组

针对存储结构的输入与输出

由于结构体是自定义的,因此不具备直接输入的办法(除非做输入重载,属于语法高阶内容,这里不谈),只有老老实实地引用成员,对成员进行操作。

Student a;
string gender;

cin >> a.age >> a.score >> a.name >> a.favorite >> gender;
if (gender == "男") {
    a.gender = true;
} else {
    a.gender = false;
}

// 用 cout 也可以,这里主要是格式化输出,printf 相对方便
printf("年龄:%d\n", a.age);
printf("成绩:%.2lf\n", a.score);
printf("姓名: %s\n", a.name.c_str());
printf("喜好:%s\n", a.favorite);
printf("性别:%s\n", a.gender ? "男" : "女");