SWPU :ACM入门之<7> - 结构体 struct

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)即可。

在访问指针类型的变量时,只需要使用成员运算符->代替.即可。

例题

有以下三个需求:

  1. 设计一个结构体模板,用于存储一个月份名、该月份名的3前字母缩写、该月的天数、以及月份编号。
  2. 定义一个数组用于初始化1题中的结构体,数组中包含12个结构体,为一年中的12给月份(非闰年)。
  3. 输出每个的天数和月份编号。
//(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);

上一篇:杭电ACM 3790:最短路径问题C++解法的代码


下一篇:实验3 转移指令跳转原理及其简单应用编程