C语言自定义数据类型(二)使用结构体数组
创始人
2025-05-31 21:44:22
0

一个结构体变量中可以存放一组有关联的数据(如一个学生的学号、姓名、成绩等数据)。如果有 10 个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。

目录

一、定义结构体数组

1.1举例说明

1.2定义

二、结构体数组的应用举例


一、定义结构体数组

1.1举例说明

下面举一个简单的例子来说明怎样定义和引用结构体数组。

举例:有 3 个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。

解题思路:显然,需要设一个结构体数组,数组中包含 3 个元素,每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型)。输入被选人的姓名,然后与数组元素中的 “ 姓名 ” 成员比较,如果相同,就给这个元素中的 “ 得票数 ” 成员的值加 1。最后输出所有元素的信息。

#include
#include
struct Person		//声明结构体类型
{char name[20];int count;
};int main()
{struct Person leader[3] = { "zhang",0,"wang",0,"liu",0 };	//初始化结构体变量char leader_name[20];for (int i = 0; i < 10; i++){scanf_s("%s", leader_name, 20);		//输入所选候选人姓名for (int j = 0; j < 3; j++){if (strcmp(leader_name, leader[j].name) == 0)leader[j].count++;}}printf("结果是:\n");for (int j = 0; j < 3; j++){printf("%5s:%d\n", leader[j].name, leader[j].count);}return 0;
}

运行结果:

程序分析:

定义一个全局的结构体数组 leader,它有 3 个元素,每一个元素包含两个成员 name(姓名)和 count(票数)。在定义数组时使之初始化,将 " Li " 赋给 leader[0].name,0 赋给 leader[0].count," Zhang "赋给 leader[1].name,0 赋给 leader[1].count," Sun " 赋给 leader[2].name,0 赋给 leader[2].count。这样,3 位候选人的票数全部先置零。

在主函数中定义字符数组 leader_name,用它存放被选人的姓名。在每次循环中输入一个被选人姓名,然后把它与结构体数组中 3 个候选人姓名相比,看它和哪一个候选人的名字相同。注意leader_name 是和 leader 数组第 j 个元素的 name 成员相比。若 j 为某一值时,输入的姓名与 leader[j].name 相等,就执行 “ leader[j].count++”,由于成员运算符 “.” 优先于自增运算符 “++”,因此它相当于(leader[j].count)++,使 leader[j] 成员 count 的值加 1。在输入和统计结束之后,将 3 人的名字和得票数输出。

1.2定义

(1)定义结构体数组一般形式是

struct 结构体名
{

        成员表列

} 数组名[数组长度];

先声明一个结构体类型(如 struct Person),然后再用此类型定义结构体数组:

结构体类型 数组名[数组长度];

如:

struct Person leader[3];        //leader是结构体数组名

(2)对结构体数组初始化的形式是在定义数组的后面加上:

= {初值表列};

如:

struct Person leader[3] = {"zhang", 0, "wang", 0, "liu", 0};

二、结构体数组的应用举例

举例:有 n 个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。

解题思路:用结构体数组存放 n 个学生信息,采用选择法对各元素进行排序(进行比较的是各元素中的成绩)。

#include
struct Student		//声明结构体类型
{int num;char name[20];float score;
};int main()
{const int n = 5;		//定义常变量struct Student stu[n] = { 1001,"wang",88,1002,"li",85,1003,"liu",98,1004,"zhao",95,1005,"wu",87 };for (int i = 0; i < n - 1; i++)		//选择排序{int k = i;for (int j = i + 1; j < n; j++){if (stu[j].score > stu[k].score)k = j;}if (k != i)		//stu[k]和stu[i]互换{Student temp;temp = stu[i];stu[i] = stu[k];stu[k] = temp;}}printf("排序为:\n");for (int i = 0; i < n; i++){printf("%6d %8s %6.2f\n", stu[i].num, stu[i].name, stu[i].score);}
}

运行结果: 

程序分析:

(1)程序中第 11 行定义了常变量 n,在程序运行期间它的值不能改变。如果学生数改为 30 人,只须把第 11 行改为即可。

也可以不用常变量,而用符号常量,可以取消第 11 行,同时在第 2 行前加一行:

# define N 5

(2)在定义结构体数组时进行初始化,为清晰起见,将每个学生的信息用一对花括号包起来,这样做,阅读和检查比较方便,尤其当数据量多时,这样是有好处的。

(3)在执行第 1 次外循环时i的值为0,经过比较找出 5 个成绩中最高成绩所在的元素的序号为 k,然后将 stu[k] 与 stu[i] 对换(对换时借助临时变量temp)。执行第 2 次外循环时i的值为 1,参加比较的只有 4 个成绩了,然后将这 4 个成绩中最高的所在的元素与 stu[1] 对换。其余类推。注意临时变量 temp 也应定义为 struct Student 类型,只有同类型的结构体变量才能互相赋值。程序 21 行是将 stu[k] 元素中所有成员和 stu[i] 元素中所有成员整体互换(而不必人为地指定一个一个成员地互换)。从这点也可以看到使用结构体类型的好处。

相关内容

热门资讯

走进小城看消费丨江西资溪:低碳...   夏日时节下午4点,江西省抚州市资溪县大觉山景区漂流终点依然热闹。来自南昌的游客余鑫漂流结束后没有...
【中原晨会0625】市场分析专... 来源:市场资讯 (来源:中原证券研究所) 本期重点研报目录 【中原策略】市场分析:电子半导体领涨 ...
南向资金连买4日!低费率+可月... 6月25日早盘,港股红利资产震荡整理。截至11时14分,港股红利低波ETF招商(520550)下跌0...
618成交破百万!紫荆花用一套... 一年一度的618年中大促,是消费市场的晴雨表,也是品牌间最激烈的角力场。当各大品牌在直播间里铆足了劲...
原创 黄... 2026年6月25日的国际金价已经从前期的5500美元高点跌到4200美元下方,累计跌幅超过22%,...
英伟达CEO:Vera Rub... 截至9:38,中证半导体材料设备主题指数(931743)涨2.36%创新高;权重股中,中微公司涨3....
再被催债16亿!“钢铁大王”戴... 澎湃新闻记者 贺梨萍 因“铁本事件”入狱五年的戴国芳重返钢铁行业,但他并没有完成从阶下囚再到“钢铁大...
周三原油价格下跌 随着美国和伊朗在和平谈判中取得进展,越来越多的油轮公开穿越霍尔木兹海峡,原油在战时的价格上涨已经蒸发...
这种蛋白是大脑衰老的开关 这种蛋白是大脑衰老的开关 清晨,假设一位五十岁左右的王女士发现自己常常把手机放在熟悉的抽屉里又找不到...
信通院牵头算力Token出海生... 盘面上,截至11:04,中证科创创业50指数(931643)涨1.68%,创历史新高;权重股中,芯原...
海外 774 亿营收背后:日本... 文 | 游戏价值论 6月23日,彭博社报道了腾讯正在围绕出售多家日本游戏工作室少数股权开展谈判,包...
餐饮“抢人”大战:把店开到公交... 作者 |餐饮老板内参 内参君 医院、公交站、演唱会…餐饮品牌,正在无孔不入 在北京儿童医院,肯德基...
快讯 | 外资扫货!陈翊庭:港... 港交所行政总裁陈翊庭在接受《中国证券报》专访时指出,国际资本对中国资产的看法已彻底扭转,布局中国市场...
2777.77元!A股“股王”... 25日早盘,昨天创下历史新高的A股“股王”联讯仪器,今天上午继续走强,盘中股价再度刷新历史新高。 截...
原创 今... 欧洲自己的媒体直接下结论,欧盟衰退躲不掉,内部分裂拦不住,现在就连欧洲顶尖工业巨头,都偷偷在用中国的...
黄仁勋股东大会放言:本轮AI基... 在当地时间6月24日的英伟达(NVDA.O)2026年度股东大会上,股东批准了该公司全部10名董事会...
国际油价大跌 新华社消息, 纽约原油期货主力合约价格24日盘中跌破每桶70美元,为伊朗战事爆发以来首次。 市场分析...
马云带队插秧,什么信号? 一场别开生面的“务农”,让外界看到了一个不一样的阿里巴巴。 近日,阿里巴巴合伙人、高德董事长刘振飞在...
全球最大产能,最高丰度达99.... 本文转自【科技日报】; 6月23日,高丰度硼-10同位素技术暨产业化成果发布会在山东省东营市举办,全...
黄金大跳水!金饰克价年内暴跌近... 25日,现货黄金盘中震荡,截至发稿,报3985.070美元/盎司,跌0.17%。 当地时间24日,...