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

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;
}
相关推荐
HC182580858323 分钟前
“倒时差”用英语怎么说?生活英语口语学习柯桥外语培训
学习·生活
学习路上_write8 分钟前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程
非概念13 分钟前
stm32学习笔记----51单片机和stm32单片机的区别
笔记·stm32·单片机·学习·51单片机
无敌最俊朗@2 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
EterNity_TiMe_2 小时前
【论文复现】STM32设计的物联网智能鱼缸
stm32·单片机·嵌入式硬件·物联网·学习·性能优化
L_cl2 小时前
Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程
学习
前端SkyRain3 小时前
后端Node学习项目-用户管理-增删改查
后端·学习·node.js
提笔惊蚂蚁3 小时前
结构化(经典)软件开发方法: 需求分析阶段+设计阶段
后端·学习·需求分析
DDDiccc3 小时前
JAVA学习日记(十五) 数据结构
数据结构·学习
腾科张老师4 小时前
为什么要使用Ansible实现Linux管理自动化?
linux·网络·学习·自动化·ansible