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] 元素中所有成员整体互换(而不必人为地指定一个一个成员地互换)。从这点也可以看到使用结构体类型的好处。

相关内容

热门资讯

A股有“钱”景 07 AI红利转移应用端 08 指数攀高何处登顶?
国资收入能否“跳一跳”,闵行消... “区属国资委收入已经连续两年6600万元,今年能否实现奋力一跳?”“在促进消费方面,政府能做什么?”...
央行下调再贷款利率 增加再贷款... 下调各类结构性货币政策工具利率、增加支农支小再贷款额度、设立民营企业再贷款、拓展多个结构性货币政策工...
央行副行长邹澜:继续综合施策 ... 中国网财经1月15日讯 今日,国务院新闻办公室举行新闻发布会,介绍货币金融政策支持实体经济高质量发展...
山东多城市消费上新,品质生活触... 海报新闻记者 李金珊 实习生 宋亚轩 孙晔 报道 上午十点,临沂兰山区的李女士送完孩子回家,指尖轻点...
“20cm”六连板,大牛股明日... 1月15日晚,志特新材(300986)、*ST铖昌(001270)两只停牌核查股同日宣布,即将复牌。...
原创 特... 特朗普政府试图将委内瑞拉的石油资源纳入美国巨头的囊中,但事与愿违。这场旨在促成巨额投资的白宫会议,最...
原创 谢... 谢尔盖·布林:科技巨擘的崛起与慈善之路 2026年1月12日,一个值得铭记的日子。这一天,在Alph...
马士基宣布恢复红海航线 航运业... 财联社1月16日讯(编辑 牛占林)丹麦航运巨头马士基(Maersk)当地时间周四表示,在该地区安全形...
贵金属价格上涨能否持续 回顾2025年大类资产表现,以黄金、白银、铂族金属为代表的贵金属板块价格一路狂飙,令全球投资者印象深...
手握金条无处安放?银行保管箱“... 本报(chinatimes.net.cn)记者付乐 见习记者 林佳茹 北京报道 “现在网点暂时没有空...
雷军直播再谈“反小字营销”!新... 1月15日晚,小米创办人、董事长兼CEO雷军在直播中再度聚焦“小字营销”问题,明确表达小米反对该行业...
重庆今年首只新股至信股份上市 ... 1月15日,重庆至信实业股份有限公司(以下简称“至信股份”)在上海证券交易所主板敲锣上市,成为今年A...
创历史新高!2025年我国外汇... 国家外汇管理局1月15日发布数据显示,2025年,我国外汇市场交易量达42.6万亿美元,企业外汇套期...
跨境电商运营:2026全球瑜伽... 今天分享的是:跨境电商运营:2026全球瑜伽服市场洞察报告 报告共计:41页 《2026全球瑜伽服市...
中文在线涨势“刹车”,上市以来... 来源:市场资讯 来源:国际金融报 1月15日,连续多日因“狂飙”行情被称为新“易中天”之一的中文在线...
原创 1... 写在文章前的声明:在本文之前的说明:本文中所列的投资信息,只是一个对基金资产净值进行排行的客观描述,...
湾财晚报| 商业用房首付比例降... 编辑 | 子衿 商业用房首付比例降至30% 今日,商办地产市场迎来重磅利好。 中国人民银行新闻发言人...
全年26亿!这些银行“喜提”罚... 过去一年,监管“长牙带刺、有棱有角”的态度一以贯之,驱动银行从根源上提升合规能力,强化内控管理。 企...
业绩拐点已现?金沃股份预计去年... 公司于今日晚间发布公告,2025年,公司在手订单情况良好,预计实现营业收入12.4-12.5亿元,同...