ACM 2021 年招新啦~ 快加入我校 ACM 招新群 : 815161393 !
本期是《ACM 入门系列》之七 : 结构体。
作者 :2020级 Rhyems. dalao的博客地址
结构体
这里参考《C primer plus 习题册》。
结构体和结构体变量
当存在复杂的数据对象时,其数据特征需要用多个简单的数据类型进行综合表述,这就需要使用 一些复杂的数据类型来提高数据的表达能力。结构体是C语言中数据类型叫结构的的成员。
结构体的定义使用关键字strcut
,当建立了结构体声明后就可以定义一个结构体变量,例如,struct book library;
;其中struct book
相当于简单数据类型声明中的数据类型(例如:int a
中的int
),library就是一个结构体变量(相当于a
)。
结构体中的成员可以使用成员运算符访问,library.title
相当于访问结构体中的title
成员。结构体的初始化可以使用花括号,指定成员的初始化可以使用点运算的符号与成员名字。
例如:
struct book
{
int title;
string name;
}; //注意这里不能省略分号
//这里是花括号的初始化
struct book library1 = {12, "高等数学"};
//这里是点运算符号初始化
struct book library2;
library2.title = 12;
library2.name = "高等数学";
结构体的应用
定义了结构体之后就可以像使用其他数据类型一样使用它,只需要使用成员运算符访问即可, 比如需要输出上述library2
中的name
成员时, 只需要printf("%s", library2.name)
即可。
在访问指针类型的变量时,只需要使用成员运算符->
代替.
即可。
例题
有以下三个需求:
- 设计一个结构体模板,用于存储一个月份名、该月份名的3前字母缩写、该月的天数、以及月份编号。
- 定义一个数组用于初始化1题中的结构体,数组中包含12个结构体,为一年中的12给月份(非闰年)。
- 输出每个的天数和月份编号。
//(1问)
struct Month {
char month_Name[10];
char month_Abbrev[4];
int days;
int number;
};
//(2问)
struct Month months[12] = {
{"January", "Jan", 31, 1},
{"February", "Feb", 28, 2},
{"March", "March", 31, 3},
{"Aprile", "Aprile", 30, 4},
{"May", "May", 31, 5},
{"June", "Jun", 30, 6},
{"July", "Jul", 31, 7},
{"August", "August", 31, 8},
{"September", "Sep", 30, 9},
{"October", "Oct", 31, 10},
{"November", "Nov", 30, 11},
{"December", "Dec", 31, 12},
}
//(3问)
for(int i = 0; i < 12; i ++)
{
printf("%d %d\n", months[i].days, month[i].number);
}
重载运算
在对结构体进行排序时,计算机并不知道我们想以结构体中的哪个关键字进行排序,所以我们需要在结构体中对 > > > 或 < < < 进行重载
格式:
//以w为关键字排序
struct Edge {
int a, b, w;
bool operator < (const Edge & W) const
{
return w < W.w;
}
}edges[N]; //N为总点数
sort(edges, edges + n); //对edges数组中的(0 ~ n - 1)(长度为n)的数组从小到大排序
如果需要重大到小排序,有两种方案
方案 1. 将 ‘ < < <’ 重载为大于号
方案 2. 排序好后执行一次reverse(edges, edges + n);