嵌入式学习第十四天!(结构体、共用体、枚举、位运算)

1. 结构体:

1. 结构体类型定义:

嵌入式学习第十三天!(const指针、函数指针和指针函数、构造数据类型)-CSDN博客

2. 结构体变量的定义:

嵌入式学习第十三天!(const指针、函数指针和指针函数、构造数据类型)-CSDN博客

3. 结构体元素的访问:

嵌入式学习第十三天!(const指针、函数指针和指针函数、构造数据类型)-CSDN博客

4. 结构体的存储:

内存对齐:

char 按照1字节对齐

short 按照2字节对齐

int 按照4字节对齐

double 按照4字节对齐

结构体整体的大小必须为最大基本类型长度的整数倍

5. 结构体作为函数参数:

cpp 复制代码
struct student stu;

GetAllStuInfo(&stu);
int GetAllStuInfo(struct student *pstu);

6. 结构体数组:

**练习:**定义一个学生的类型,封装一个函数GetStuInfo获得学生信息放入结构体中,再封装一个函数PutStuInfo打印学生信息

cpp 复制代码
#include <stdio.h>

struct student
{
	char name[100];
	char sex;
	int age;
	int score;
};

int GetAllStuInfo(struct student *pstu, int maxlen)
{
	int i = 0;
	int curlen = 0;

	printf("请输入学生个数:\n");
	scanf("%d",&curlen);	

	for(i = 0; i < curlen; i++)
	{
		scanf("%s", pstu[i].name);
		scanf(" %c", &pstu[i].sex);
		scanf("%d", &pstu[i].age);
		scanf("%d", &pstu[i].score);
	}
	return curlen;
}

int PutAllStuInfo(struct student *pstu, int len)
{
	int i = 0;
	for(i = 0; i < len; i++)
	{
		printf("姓名:%s\n", pstu[i].name);
		printf("性别:%c\n", pstu[i].sex);
		printf("年龄:%d\n", pstu[i].age);
		printf("分数:%d\n", pstu[i].score);
	}
}

int main(void)
{
	struct student s[100];
	int n = 0;

	n = GetAllStuInfo(s, 100);
	PutAllStuInfo(s, n);

	return 0;
}

2. 共用体:

cpp 复制代码
union 共用体名
{
    数据类型1 成员变量1;
    数据类型2 成员变量2;
    数据类型3 成员变量3;
    ...
};

共同体所有成员变量共享同一片空间

内存大小端:

1. 内存小端:

内存低地址存放低数据位

内存高地址存放高数据位

2. 内存大端:

内存低地址存放高数据位

内存高地址存放低数据位

举例应用:

cpp 复制代码
#include <stdio.h>

union s
{
	char a;
	int b;
};

int main(void)
{

	union s s1;
	s1.b = 1;

	if(s1.a)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

#if 0
	int num = 0x11223344;
	char *p = NULL;

	p = (char *)&num;

	if(*p == 0x11)
	{
		printf("大端\n");
	}
	else
	{
		printf("小端\n");
	}
#endif
	return 0;
}

3.枚举

cpp 复制代码
enum 枚举类型名
{
    枚举常量1,
    枚举常量2,
    枚举常量3,    

};

**1.**枚举类型一般说明将来变量的值在给定的常量中选择其一作为它的值

**2.**枚举常量的值总是前一个枚举常量的值+1,第一个默认为0值

3. 枚举常量默认为int类型,可以直接在程序中使用

4. 位运算运算符:

|------|------|---------------------|
| & | 按位与 | 与0得0 |
| | | 按位或 | 或1置1 |
| ^ | 按位异或 | 相同为0,相异为1 |
| ~ | 按位取反 | |
| >> | 右移 | 右移n位,等价于让该数 /2^n |
| << | 左移 | z左移n位,等价于让该数 *2^n |

按位异或实现数据交换:

cpp 复制代码
a = a ^ b;  
b = a ^ b;   //b = a ^ b ^ b = a ^ 0 = a;
a = a ^ b;   //a = a ^ b ^ (a ^ b ^ b) = a ^ b ^ a ^ b ^ b = a ^ b ^ a ^ 0
             //  = a ^ b ^ a = a ^ a ^ b = 0 ^ b = b

将变量的第n位置0:

cpp 复制代码
 num = num & ~(1 << n)

将变量的第n位置1:

cpp 复制代码
num = num | (1 << n)

作业:

有一个班的5个学生,有3门课程。

1、求第一门课的平均分;

2、找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均分

3、找出平均分在90分以上或全部课程成绩在85分以上的学生。

分别编写三个函数来实现以上三个要求

cpp 复制代码
#include <stdio.h>
#include <string.h>

struct student
{
	char name[32];
	int no;
	int score[3];
};

double GetAvgScore(struct student *pstu, int len)
{
	int i = 0;
	int sum = 0;
	for(i = 0; i < len; i++)
	{
		sum += pstu[i].score[0];
	}

	return sum / (len+0.0);
}

int OutputFailStuInfo(struct student *pstu, int len, int num)
{
	int i = 0;
	int j = 0;
	int k = 0;
	int cnt = 0;
	double sum = 0;
	
	printf("\n两门以上不及格学生为:\n");
	for(j = 0; j < len; j++)
	{
		for(i = 0; i < num; i++)
		{
			if(pstu[j].score[i] < 60)
			{
				cnt++;
			}
			sum += pstu[j].score[i];
		}
		if(cnt >= 2)
		{
			printf("姓名:%s\n", pstu[j].name);
			printf("学号:%d\n", pstu[j].no);
			for(k = 0; k < num; k++)
			{
				printf("第%d门分数为:%d\n", k+2, pstu[j].score[k]);
			}
			printf("平均分数为:%.2lf\n", sum/(num+0.0));
			printf("\n");
		}
		cnt = 0;
		sum = 0;
	}
	return 0;
}

int OutputBestStuInfo(struct student *pstu, int len, int num)
{
	int i = 0;
	int j = 0;
	int k = 0;
	int cnt = 0;
	int sum = 0;
	
	printf("平均分在90分以上或全部成绩在85分以上的学生为:\n");
	for(j = 0; j < len; j++)
	{
		for(i = 0; i < num; i++)
		{
			sum += pstu[j].score[i];
			if(pstu[j].score[i] > 85)
			{
				cnt++;
			}
		}
		if(cnt == 3 || sum/num > 90)
		{
			printf("%s\n", pstu[j].name);
		}
		cnt = 0;
		sum = 0;
	}
}

int main(void)
{
	struct student stu[5]={
		{"zhangsan", 202401, {78, 69, 81}},
		{"lisi", 202402, {49, 57, 73}},
		{"wangwu", 202403, {32, 53, 67}},
		{"maliu", 202404, {95, 94, 99}},
		{"zhaoqi", 202405, {87, 91, 86}}
	};
	double avg = 0;
	
	avg = GetAvgScore(stu, 5);
	printf("所有学生第一门课的平均分为: %.2lf\n", avg);
	OutputFailStuInfo(stu, 5, 3);
	OutputBestStuInfo(stu, 5, 3);
	
	return 0;
}
相关推荐
西岸行者9 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意9 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码9 天前
嵌入式学习路线
学习
毛小茛9 天前
计算机系统概论——校验码
学习
babe小鑫9 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms9 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下9 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。9 天前
2026.2.25监控学习
学习
im_AMBER9 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J9 天前
从“Hello World“ 开始 C++
c语言·c++·学习