C语言结构体数组,结构体数组的定义,结构体数组的输出,结构体的应用

结构体数组

结构体数组的定义:

结构体数组格式:声明变量类型 数组名称[数组长度]

//定义一个结构体数组名为a,它里面包含有5个元素,每一个元素都是一个结构体变量
Wor a[5]={};
#include<stdio.h> 
typedef struct worker{
	char id[10];
	char name[10];
	char sex[10];
	int pay;
}WOR;
void main(){
	WOR a[3]=
	{
		{"0001","陈文杰","男",1200},
		{"0001","张三丰","女",500},
		{"0001","张四丰","女",1200}
	}
}

对比记忆
在这里插入图片描述

结构体数组的输出
#include<stdio.h> 
typedef struct worker{
	char id[10];
	char name[10];
	char sex[10];
	int pay;
}WOR;
void main(){
	WOR a[6]={
		{"0001","陈文杰","男",1200},
		{"0002","张三丰","女",5000},
		{"0003","张四丰","女",1200}, 
		{"0004","张五丰","男",2200},
		{"0005","张六丰","男",5200},
		{"0006","张七丰","男",6200} 
	};
	int i;
	for(i=0;i<6;i++){
		printf("%s,%s,%s,%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
	}
}	

在这里插入图片描述
结构体对象中的a[i]就代表一个对象,它已经不再是一个值了
所以我们应该用a[ii].成员名

改进以上程序

#include<stdio.h> 
typedef struct worker{
	char id[10];
	char name[10];
	char sex[10];
	int pay;
}WOR;
void output(WOR a[],int n){//次函数是用来输出长度为n的工人数组的信息 
	int i;
	printf("工号\t姓名\t性别\t年龄\n"); 
	for(i=0;i<6;i++){
		printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
	}
}
void main(){
	WOR a[6]={
		{"0001","陈文杰","男",1200},
		{"0002","张三丰","女",5000},
		{"0003","张四丰","女",1200}, 
		{"0004","张五丰","男",2200},
		{"0005","张六丰","男",5200},
		{"0006","张七丰","男",6200} 
	};
	output(a,6);
}

在这里插入图片描述

结构体的应用
案例一、

1、编写一个函数,它的目的是为了输出所有性别为男的的职工信息
算法分析:
1)这个函数它不用返回值因为该函数是为了完成输出
2)该函数要处理很多职工,就需要一个数组,数组的类型为职工类型
注意:在C语言当中字符串不能直接比较是否相同,要通过strcmp这个函数来比较其两个字符串是否相同

#include<stdio.h>
#include<string.h> 
typedef struct worker{
	char id[10];
	char name[10];
	char sex[10];
	int pay;
}WOR;
void QueryWorker(WOR a[],int n){//次函数是用来输出长度为n的工人数组的信息 
	int i;
	printf("全部员工:\n"); 
	printf("工号\t姓名\t性别\t年龄\n"); 
	for(i=0;i<6;i++){
		printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
	}
	printf("所有男员工:\n"); 
	printf("工号\t姓名\t性别\t年龄\n"); 
	for(i=0;i<6;i++){
		if(strcmp(a[i].sex,"男")==0){ 
			printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
		} 
	}
	printf("所有女员工:\n"); 
	printf("工号\t姓名\t性别\t年龄\n"); 
	for(i=0;i<6;i++){
		if(strcmp(a[i].sex,"女")==0){ 
			printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
		} 
	}
}
void main(){
	WOR a[6]={ 
		{"0001","陈文杰","男",1200},
		{"0002","张三丰","女",5000},
		{"0003","张四丰","女",1200}, 
		{"0004","张五丰","男",2200},
		{"0005","张六丰","男",5200},
		{"0006","张七丰","男",6200} 
	};
	QueryWorker(a,6);
}

在这里插入图片描述
2、能够输出指定性别的职工

#include<stdio.h> 
typedef struct worker{
	char id[10];
	char name[10];
	char sex[10];
	int pay;
}WOR;
void QueryBySex(WOR a[],int n,char b[]){//次函数是用来输出长度为n的工人数组的信息 
	int i;
	
	printf("工号\t姓名\t性别\t年龄\n");  
	for(i=0;i<6;i++){
		if(strcmp(a[i].sex,b)==0){ 
			printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
		} 
	}
	
}
void main(){
	WOR a[6]={ 
		{"0001","陈文杰","男",1200},
		{"0002","张三丰","女",5000},
		{"0003","张四丰","女",1200}, 
		{"0004","张五丰","男",2200},
		{"0005","张六丰","男",5200},
		{"0006","张七丰","男",6200} 
	};
	char b[10];
	printf("请输入您要查询的性别 :\n");
	scanf("%s",b);
	QueryBySex(a,6,b);
}
案例二、

让用户输入一个工号,然后在一个结构体数组当中去查找有没有这个工人,如果有则输出这个工人的信息,如果没有则找不到此人

#include<stdio.h> 
typedef struct worker{
	char id[10];
	char name[10];
	char sex[10];
	int pay;
}WOR;

void FindById(WOR a[],int n,char id[]){
	//我们要访问数组里面每一个工人,如果发现了一个工人,就退出循环。如果找不到就输出找不到此人
	int i;
	for(i=0;i<n;i++){
		if(strcmp(a[i].id,id)==0){//说明第i个工人就是我们要找的职工 
			break;//强制终止循环 
		}
	} 
	
	//在退出循环之后,再来检查i与n的关系
	if(i<n){//说明循环在中途就break,发现了职工 
		printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
	} 
	else//找不到职工 
	{
		printf("找不到此人");
	}
}

void main(){
	WOR a[6]={ 
		{"0001","陈文杰","男",1200},
		{"0002","张三丰","女",5000},
		{"0003","张四丰","女",1200},
		{"0004","张五丰","男",2200},
		{"0005","张六丰","男",5200},
		{"0006","张七丰","男",6200} 
	};
	char b[10];
	printf("请输入您要查询的id :\n");
	gets(b);
	FindById(a,6,b);
}

在这里插入图片描述

案例三、

求出所有职工中最高工资那个职工的信息
注意:这里有一个知识点:成员比较整体赋值

#include<stdio.h> 
#include<string.h>
typedef struct worker{
	char id[10];
	char name[10];
	char sex[10];
	int pay;
}WOR;
void max(WOR a[],int n){
	WOR m=a[0];
	int i;
	for(i=0;i<n;i++){
		if(m.pay<a[i].pay){//如果m的工资小于a[i]的工资,就把m赋值给a[i]
			m=a[i];
		}
	}
	printf("%s\t%s\t%s\t%d\n",m.id,m.name,m.sex,m.pay);
	//假设第一个工人是最高工资的那个工人	 
} 
void main(){
	WOR a[6]={ 
		{"0001","陈文杰","男",1200},
		{"0002","张三丰","女",7000},
		{"0003","张四丰","女",1200},
		{"0004","张五丰","男",2200},
		{"0005","张六丰","男",5200},
		{"0006","张七丰","男",6200} 
	};
	max(a,6);
}

在这里插入图片描述
上方程序改进
输出所有工资大于平均工资的职工
1、必须要先求出平均
2、在访问每一个职工,如果发现这个职工的工资要小于平均工资的话,就输出这个职工的信息。

#include<stdio.h> 
#include<string.h>
typedef struct worker{
	char id[10];
	char name[10];
	char sex[10];
	int pay;
}WOR;
void QueryByAver(WOR a[],int n){
	int i;
	float aver; 
	int sum = 0; 
	//求出总工资 
	for(i=0;i<n;i++){
		sum+=a[i].pay;
	}
	//求出平均工资aver 
	aver =(float)sum/n;
	printf("平均工资为%f\n",aver);
	printf("大于平均工资为:\n");
	//访问每一个职工 
	for(i=0;i<n;i++){
		if(a[i].pay>=aver){//如果发现职工的工资大于等于平局工资,就输出对应职工的信息 
			printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
		}
	}	
}
void main(){
	WOR a[6]={ 
		{"0001","陈文杰","男",3200},
		{"0002","张三丰","女",7000},
		{"0003","张四丰","女",1200},
		{"0004","张五丰","男",2200},
		{"0005","张六丰","男",5200},
		{"0006","张七丰","男",6200} 
	};
	QueryByAver(a,6);
}

在这里插入图片描述
算法变换

#include<stdio.h> 
#include<string.h> 
typedef struct stud{//定义了一个结构体  
	char Id[10];//学号 
	char Name[10];//姓名 
	int China;//语文成绩
	int Math;//数学成绩
	int English;//英语成绩	 
}STU;
//编写一个函数,它的目的是为了输出所有学生的总分与平均分
void fun(STU a[],int n){
	int sum=0,i;
	printf("学号\t姓名\t语文\t数学\t英语\t总分\t平局分\n"); 
	//要访问里面的每一个学生 
	for(i=0;i<n;i++){
		//对于一个学生a[i]而言我们要来输出它的信息
		printf("%s\t%s\t%d\t%d\t%d\t%d\t%.1f\n",
		a[i].Id,a[i].Name,a[i].China,a[i].Math,a[i].English,
		a[i].China+a[i].Math+a[i].English,
		(a[i].China+a[i].Math+a[i].English)/3.0); 
		sum = a[i].China+a[i].Math+a[i].English;
	}
} 
void main(){
	STU a[8]={
	{"S1","张一军",127,150,100}, 
	{"S2","张二军",75,85,89}, 
	{"S3","张三军",67,58,86}, 
	{"S4","张四军",120,101,87}, 
	{"S5","张五军",136,100,82}, 
	{"S6","张六军",141,52,83}, 
	{"S7","张七军",125,85,81},  
	{"S8","张八军",136,65,79}
	};
	fun(a,8);
}

在这里插入图片描述
案例变换:
注意字符串也不能够直接赋值,要通过一个函数来对字符串进行赋值
strcpy:通过这个函数才可以给字符串进行赋值

#include<stdio.h> 
#include<string.h> 
typedef struct stud{//定义了一个结构体  
	char Id[10];//学号 
	char Name[10];//姓名 
	int China;//语文成绩
	int Math;//数学成绩
	int English;//英语成绩	 
}STU;
//编写一个函数,求出每一个学生的优秀科目,目的不是输出分数,而是要输出对应科目的名称
void Perferct(STU a[],int n){
	int sum=0,i;
	char per[20];
	int maxscore;//用来确保最优科目的分数 
	//要输出标题 
	printf("学号\t姓名\t语文\t数学\t英语\t最优秀科目\n"); 
	//要访问里面的每一个学生,对于第i学生要确认它的最优科目名称(语文,数学,英语) 
	//科目名称是字符串,所以要先定义一个字符串来确保保存最优科目名称
	for(i=0;i<n;i++){
		maxscore=a[i].China;//认为第i个学生的语文是最优秀的 
		strcpy(per,"语文");
		if(maxscore<a[i].Math){
			maxscore = a[i].Math;
			strcpy(per,"数学");
		} 
		if(maxscore<a[i].English){
			maxscore = a[i].Math;
			strcpy(per,"英语");
		} 
		printf("%s\t%s\t%d\t%d\t%d\t%s\n",
		a[i].Id,a[i].Name,a[i].China,a[i].Math,a[i].English,per); 
	} 
} 

void main(){
	STU a[8]={
	{"S1","张一军",127,150,100}, 
	{"S2","张二军",75,85,89}, 
	{"S3","张三军",67,58,86}, 
	{"S4","张四军",120,101,87}, 
	{"S5","张五军",136,100,82}, 
	{"S6","张六军",141,52,83}, 
	{"S7","张七军",125,85,81},  
	{"S8","张八军",136,65,79}
	};
	Perferct(a,8);
}

在这里插入图片描述

  • 202
    点赞
  • 1030
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答1: 要动态创建二维结构体数组,可以使用以下步骤: 1. 定义结构体类型。 2. 使用动态内存分配分配二维数组的空间。 3. 访问和操作数组元素。 4. 释放内存。 以下是一个示例代码,其中包括创建和释放二维结构体数组的完整过程: ``` #include <stdio.h> #include <stdlib.h> // 定义结构体类型 struct myStruct { int a; char b; }; int main() { int rows = 2; int cols = 3; // 使用动态内存分配分配二维数组的空间 struct myStruct **arr = malloc(rows * sizeof(struct myStruct *)); for (int i = 0; i < rows; i++) { arr[i] = malloc(cols * sizeof(struct myStruct)); } // 访问和操作数组元素 arr[0][0].a = 1; arr[0][0].b = 'a'; arr[1][2].a = 2; arr[1][2].b = 'b'; // 打印数组元素 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("arr[%d][%d].a = %d, arr[%d][%d].b = %c\n", i, j, arr[i][j].a, i, j, arr[i][j].b); } } // 释放内存 for (int i = 0; i < rows; i++) { free(arr[i]); } free(arr); return 0; } ``` 在这个例子中,我们首先定义了一个结构体类型 `myStruct`。然后,我们使用动态内存分配分配二维数组的空间,并访问和操作数组元素。最后,我们释放数组所占用的内存。 ### 回答2: 在C语言中,我们可以通过动态创建二维结构体数组来满足特定需求。首先,我们需要先定义结构体的类型及其成员变量。例如,假设我们有一个表示学生信息的结构体类型student,包含学生姓名 name 和学生年龄 age。 然后,我们可以使用malloc函数动态分配内存来创建二维结构体数组。以创建一个有row行、col列的二维结构体数组为例,我们可以使用以下代码来实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct student{ char name[20]; int age; } Student; int main() { int row, col; printf("请输入要创建的二维结构体数组的行数和列数:"); scanf("%d%d", &row, &col); // 动态分配内存 Student **students = (Student **)malloc(row * sizeof(Student *)); for (int i = 0; i < row; ++i) { students[i] = (Student *)malloc(col * sizeof(Student)); } // 初始化结构体数组 for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { printf("请输入第%d行第%d列学生的姓名和年龄:", i + 1, j + 1); scanf("%s%d", students[i][j].name, &(students[i][j].age)); } } // 输出结果 for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { printf("第%d行第%d列学生的姓名:%s,年龄:%d\n", i + 1, j + 1, students[i][j].name, students[i][j].age); } } // 释放内存 for (int i = 0; i < row; ++i) { free(students[i]); } free(students); return 0; } ``` 以上代码首先根据输入的行数和列数动态分配内存来创建二维结构体数组。然后,通过嵌套的for循环来初始化每个结构体的成员变量,并输出结果。最后,需要记得释放通过malloc函数分配的内存,以防止内存泄漏。 ### 回答3: 在C语言中,动态创建二维结构体数组可以通过以下步骤进行: 1. 首先,需要定义一个结构体,包含二维数组所需的属性。例如,假设我们要创建一个名为Student的结构体,包含两个属性,分别是姓名和年龄,可以定义如下: ``` typedef struct { char name[100]; int age; } Student; ``` 2. 然后,需要确定需要创建的二维数组的行数和列数。例如,假设要创建一个3行2列的二维结构体数组,可以定义如下: ``` int rows = 3; int cols = 2; ``` 3. 接下来,可以使用动态内存分配函数malloc来为二维结构体数组分配内存空间。需要计算总的元素数量,并根据结构体的大小动态分配内存。例如,可以使用如下代码分配内存: ``` Student** students = malloc(rows * sizeof(Student*)); for (int i = 0; i < rows; i++) { students[i] = malloc(cols * sizeof(Student)); } ``` 4. 现在,我们可以通过访问二维结构体数组的元素来操作数据。例如,可以使用下标访问和修改数组中的元素,如下所示: ``` strcpy(students[0][0].name, "张三"); students[0][0].age = 20; strcpy(students[1][0].name, "李四"); students[1][0].age = 22; strcpy(students[2][0].name, "王五"); students[2][0].age = 25; ``` 5. 最后,使用完二维结构体数组后,需要释放之前分配的内存空间,以免造成内存泄漏。可以使用free函数释放内存,如下所示: ``` for (int i = 0; i < rows; i++) { free(students[i]); } free(students); ``` 通过以上步骤,我们可以动态创建二维结构体数组,并进行操作和释放内存。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员猫爪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值