C语言自定义数据类型(二)使用结构体数组

C语言自定义数据类型系列文章:

C语言自定义数据类型(一)定义和使用结构体变量

C语言自定义数据类型(二)使用结构体数组

C语言自定义数据类型(三)结构体指针

C语言自定义数据类型(四)用指针处理链表

C语言自定义数据类型(五)共用体类型

C语言自定义数据类型(六)使用枚举类型

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

目录

一、定义结构体数组

1.1举例说明

1.2定义

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


一、定义结构体数组

1.1举例说明

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

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

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

#include<stdio.h>
#include<string.h>
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<stdio.h>
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
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 是的,C语言结构体可以包含数组成员。例如: ``` struct Student { char name[20]; int age; int scores[3]; }; ``` 在这个例子中,结构体`Student`包含了名字、年龄和分数三个成员,其中分数又是一个长度为3的数组。 ### 回答2: 可以,C语言结构体可以作为数组的成员。结构体是一种用户自定义数据类型,可以包含多个不同类型的成员变量。而数组是一种包含多个相同类型的元素的集合。在C语言中,可以将结构体类型作为数组的元素类型,这样就可以创建一个包含多个结构体对象的数组。 例如,我们可以定义一个表示学生信息的结构体类型: ```c struct Student { char name[20]; int age; double score; }; ``` 然后,我们可以使用这个结构体类型创建一个学生数组: ```c struct Student students[5]; // 创建一个包含5个学生的数组 ``` 这样,我们就可以通过下标访问数组中的每个学生,例如: ```c students[0].age = 18; // 为第一个学生设置年龄为18 ``` 可以通过循环遍历整个数组来进行操作: ```c for (int i = 0; i < 5; i++) { printf("学生%d的年龄:%d\n", i + 1, students[i].age); } ``` 总结:C语言结构体可以作为数组的成员,这样可以实现更复杂的数据组织和管理。 ### 回答3: 是的,C语言结构体可以作为数组的成员。 在C语言中,可以在结构体中定义数组作为一个成员变量。这样可以将多个相关的数据项组织在一起,形成一个更为复杂的数据结构。例如,我们可以定义一个表示学生信息的结构体,其中包括学生的姓名、学号和考试成绩的数组: ```c struct Student { char name[20]; int studentID; int scores[5]; }; ``` 在这个例子中,结构体`Student`中包含了一个字符数组`name`、一个整型变量`studentID`和一个整型数组`scores`。可以通过声明一个结构体数组,用来存储多个学生的信息: ```c struct StudentClass { struct Student students[30]; }; ``` 在这个例子中,结构体`StudentClass`中包含了一个结构体数组`students`,用来存储30个不同的学生。 当访问结构体数组成员时,可以使用`.`运算符来访问结构体成员,又可以使用`[]`运算符来访问数组元素。例如,我们可以通过以下方式来访问某个学生的姓名和第一个考试成绩: ```c struct StudentClass myClass; // ... printf("%s\n", myClass.students[0].name); printf("%d\n", myClass.students[0].scores[0]); ``` 因此,C语言的结构体可以作为数组的成员,这在一些需要组合多个数据项的时候非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

juechen333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值