​结构体数组

news/2024/7/8 0:44:15

 

1. 结构体的声明

1.1 结构体的基础知识

结构是一些值的集合,这些值被称为成员变量。结构的每个成员可以是不同类型的变量。

1.2 结构的声明

struct tag
{
	member - list;
}variable-list;

例:描述一个人的信息:名字+电话+性别+身高

//声明的结构体类型struct peo
struct peo
{
	char name[20];//名字
	char tela[12];//电话
	char sex[5];//性别
	int high;//学号
}p1, p2;//分号不能丢

其中p1和p2是使用struct peo结构类型创建的两个变量,可以也就是p1和p2分别可以放一个人的信息。 但是因为p1和p2放在大括号的外面,所以p1和p2是两个全局的结构体变量。要想使其成为局部变量,我们可以使用下面这种方法创建结构体变量。

struct peo
{
	char name[20];//名字
	char tela[12];//电话
	char sex[5];//性别
	int high;//学号
};//分号不能丢​
int main()
{
	struct peo p1 = { 0 };//结构体变量的创建
	return 0;
}

1.3 结构体成员的类型

结构的成员可以是标量、数组、指针,甚至是其他的结构体。

struct peo
{
	char name[20];//数组

};

struct st
{
	struct peo p;//其他结构体
	int num;//标量
	float* f = num;//指针
};

1.4 结构体变量的定义和初始化

根据上面那个例题,我们可以如下初始化:

#define<stdio.h>
struct peo
{
	char name[20];//名字
	char tela[12];//电话
	char sex[5];//性别
	int high;//学号
};//分号不能丢​
int main()
{
	struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建

	return 0;
}

结构体成员包含结构体的结构体变量初始化:

我们需要再用一个{ }将结构体中包含的结构体初始化。

操作如下: 

#define<stdio.h>
struct peo
{
	char name[20];//名字
	char tela[12];//年龄
	char sex[5];//性别
	int high;//学号
};//分号不能丢​
struct st
{
	struct peo p;
	int num;
};
int main()
{
	struct st s = { {"暴龙战士","88888888888","男",250},66 };

	return 0;
}

初始化后我们可以按照以下的方法将其打印出来:

#define<stdio.h>
struct peo
{
	char name[20];//名字
	char tela[12];//年龄
	char sex[5];//性别
	int high;//学号
};//分号不能丢​
struct st
{
	struct peo p;
	int num;
};
int main()
{
	struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建
	struct st s = { {"暴龙战士","88888888888","男",250},66 };
	printf("%s %s %s %d \n",p1.name,p1.tela,p1.sex,p1.high );
	printf("%s %s %s %d %d\n", s.p.name, s.p.tela, s.p.sex, s.p.high, s.num);
	return 0;
}

也就是:结构体变量+.+成员变量。 

 

2.结构体成员的访问

如果是结构体指针访问指向对象的成员:就用  结构体指针 -> 成员变量  的形式打印

如果是结构体变量访问成员:就用  结构体变量 . 成员变量  的形式打印

具体操作如下:

#define<stdio.h>
struct st
{
	struct peo p;
	int num;
};
void print1(struct peo* sp)
{
	printf("%s %s %s %d \n", sp->name, sp->tela, sp->sex, sp->high);
    //结构体指针 -> 成员变量
}
void print2(struct peo p)
{
	printf("%s %s %s %d \n", p.name, p.tela, p.sex, p.high);
    //结构体变量 . 成员变量
}
int main()
{
	struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建
	struct st s = { {"暴龙战士","88888888888","男",250},66 };
	
	print1(&p1);
	print2(p1);
	return 0;
}

3.结构体传参

我们知道形参是实参的临时拷贝,如果使用结构体变量访问成员时形参就会将实参拷贝一份,这样就需要多开辟一块空间,就会结构体过大,参数压栈的系统开销比较大,从而导致性能的下降。

而使用结构体指针访问指向变量的成员时(如上述代码),我们只是将&p1(4个或8个字节)的地址传给sp而已。

结论:结构体传参的时候,要传结构体的地址。

4.结构体数组  

使用结构体变量建立数据类型后,我们就可以利用这个数据类型创建数组,就比如创建整形数组就可以写为 int arr[ ],那么创建一个自己建立的数据类型的数组就可以写为:

声明的结构体类型名 + 数组名。

例如我们声明一个结构体类型struct my后,就可以在主函数写一个struct my类型的数组。如下:

struct my
{
int a;
char b;
int arr[5];
};
int main()
{
struct my brr[5];
}

     例题1:

(1)定义一个结构体变量Birthday用来存放一个人的出生日期(年、月、日)。

(2)定义一个结构体变量Student 用来存放学生个人信息,包括姓名(10个字符),学号(长整型)、出生日期、身高、体重)

(3)定义一个结构体数组MyClass用来存放5个学生的信息

编写程序实现要求从键盘输入5个同学的信息,然后输出5个同学的信息。

#define<stdio.h>
struct Birthday
{
	int year;
	int	month;
	int day;
};
struct Student
{
	char name[10];//名字
	long int num;//学号
	struct Birthday p;//出生日期
	int hight;//身高
	int weight;//体重
};

int main()
{
	struct Student MyClass[5];
	for (int i = 0; i < 5; i++)
	{
		printf("输入第%d个学生的信息:\n ", i + 1);
		printf("名字:");
		scanf("%s", &MyClass[i].name);
		printf("学号:");
		scanf("%ld", &MyClass[i].num);
		printf("生日日期(年 月 日):");
		scanf("%d %d %d", &MyClass[i].p.year, &MyClass[i].p.month, &MyClass[i].p.day);
		printf("身高:");
		scanf("%d", &MyClass[i].hight);
		printf("体重:");
		scanf("%d", &MyClass[i].weight);
	}
	printf("\n");
	for (int j = 0; j < 5; j++)
	{
		printf("输出第%d个学生的信息:\n", j + 1);
		printf("名字:");
		printf("%s\n", MyClass[j].name);
		printf("学号:");
		printf("%ld\n", MyClass[j].num);
		printf("生日日期(年 月 日):");
		printf("%d %d %d\n", MyClass[j].p.year, MyClass[j].p.month, MyClass[j].p.day);
		printf("身高:");
		printf("%d\n", MyClass[j].hight);
		printf("体重:");
		printf("%d\n", MyClass[j].weight);
	}
	return 0;
}

例题2:

 有5个学生,每个学生的数据包括学号、姓名、3门课的成绩。从键盘输入5个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程的成绩、平均分数)。 要求用一个input函数输入5个学生数据,用一个 average 函数求总平均分,用 max 函数找出最高分学生数据。总平均分和最高分的学生的数据都在主函数中输出。

#define<stdio.h>
#define n 5
struct stu
{
	long int num;//学号
	char name[10];//名字
	int a;//科目一
	int b;//科目二
	int c;//科目三
};
void input(struct stu arr[n])
{
	for (int i = 0; i < n; i++)
	{
		printf("输入第%d个学生的数据:\n", i + 1);
		printf("输入学号:");
		scanf("%ld", &arr[i].num);
		printf("输入名字:");
		scanf("%s", &arr[i].name);
		printf("输入科目一:");
		scanf("%d", &arr[i].a);
		printf("输入科目二:");
		scanf("%d", &arr[i].b);
		printf("输入科目三:");
		scanf("%d", &arr[i].c);
	}
}
double average(struct stu arr[n])
{
	double x = 0;
	for (int i = 0; i < n; i++)
	{
		x += arr[i].a + arr[i].b + arr[i].c;
	}
	return x / (n * 3);
}
int max(struct stu arr[n])
{
	int x = arr[0].a + arr[0].b + arr[0].c;
	int y = 0;
	for (int i = 1; i < n; i++)
	{
		if (x < arr[i].a + arr[i].b + arr[i].c)
		{
			x = arr[i].a + arr[i].b + arr[i].c;
			y = i;
		}
	}
	return y;
}
int main()
{
	struct stu arr[n];
	input(arr);
	double avera = average(arr);
	printf("总平均分:");
	printf("%lf\n", avera);
	int ma = max(arr);
	printf("最高分的学生的数据:\n");
	printf("学号:");
	printf("%d\n", arr[ma].num);
	printf("名字:");
	printf("%s\n", arr[ma].name);
	printf("科目一:");
	printf("%d\n", arr[ma].a);
	printf("科目二:");
	printf("%d\n", arr[ma].b);
	printf("科目三:");
	printf("%d\n", arr[ma].c);
	return 0;
}

 

以上就是c语言(初阶)的全部内容了,如上述内容对你有帮助的话,不要忘记点上一个小小的关注呦~~ 


http://lihuaxi.xjx100.cn/news/1940355.html

相关文章

Vue入门一(前端发展史|Vue介绍|Vue插值语法|Vue指令|style与class使用|条件渲染)

文章目录 一、前端的发展史二、Vue介绍 和 基本使用1) Vue介绍2) Vue特点3) M-V-VM思想1.MVVM介绍2.MVVM的特性3.MVVM逻辑 4) 组件化开发、单页面开发组件化开发单页面开发 5) 引入方式6) 补充解释型的语言是需要解释器的 nodejs&#xff1a;一门后端语言7) 快速使用 三、Vue之…

字节填充与0比特填充以及数据链路的基本问题

目录 字节填充&#xff1a; 比特填充&#xff1a; 数据链路有三个基本问题 1.封装成帧 2.透明传输 3.差错检测 首先介绍一下PPP的帧结构&#xff1a; 首部的第一个字段和尾部的第二个字段都是标志字段F(Flag)&#xff0c;规定为0x7E (符号“0x”表示它后面的字符是用十六…

2024最新Java基础面试题大全(一)

1、String可以被继承&#xff1f; 不能被继承&#xff0c;因为String类有final修饰符&#xff0c;而final修饰的类是不能被继承的。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {// 省略...  }2、常见集合类 Java…

音量控制软件sound control mac功能亮点

sound control mac可以帮助用户控制某个独立应用程序的音量&#xff0c;通过每应用音量&#xff0c;均衡器&#xff0c;平衡和音频路由独立控制每个应用的音频&#xff0c;还有整个系统的音量。 sound control mac功能亮点 每个应用程序的音量控制 独立控制应用的数量。 键盘音…

nginx下日志配置和排查错误

目录 一&#xff1a;配置 二&#xff1a;排查日志 一&#xff1a;配置 在Nginx中&#xff0c;日志配置是记录服务器活动和排查问题的重要环节。以下是一些常见的Nginx日志配置选项&#xff1a; 日志级别&#xff1a;通过设置日志级别&#xff0c;可以控制日志的详细程度。常…

Pandas之从sql库中导入数据的几种方法分析

1.使用mysql-connector-python库将SQL文件导入到Python中&#xff0c;并查询数据库中的表 确保已经安装mysql-connector-python库 #导入模块 import mysql.connector# 建立与MySQL数据库的连接 conn mysql.connector.connect(host"localhost",user"username&…

【负载均衡oj】(七)ojserver

一.目的 负责负载均衡&#xff0c;获取网站首页&#xff0c;通过网络罗调用编译并运行并提供结果给用户。根据用户的操作提供不同的功能。采用mvc结构。使用 ctemplate文字模板做数据渲染 m在这里指的是和数据的交互&#xff0c;可以用文件或者sql交互。在使用文件的情况下&a…

读算法霸权笔记12_数据科学

1. 公平与公正 1.1. 公平大多数时候只是副产品 1.2. 由贪婪或偏见导致的不公正一直发生在我们身边 1.2.1. 如果承认法律面前人人平等&#xff0c;或者作为选民的大众应该被平等对待&#xff0c;我们就不能允许模型把我们分为不同的群体进行区别对待 1.3. 对于数学模型来说&…