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

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;
}
相关推荐
①个程序员11 分钟前
thinkphp 学习记录
学习
alfiy1 小时前
Elasticsearch学习笔记(四) Elasticsearch集群安全配置一
笔记·学习·elasticsearch
向上的车轮1 小时前
Django学习笔记十一:部署程序
笔记·学习·django
不灭锦鲤1 小时前
ssrf学习(ctfhub靶场)
网络·学习·安全
alfiy2 小时前
Elasticsearch学习笔记(五)Elastic stack安全配置二
笔记·学习·elasticsearch
权^2 小时前
MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
大数据·数据库·学习·mysql
冷静 包容2 小时前
C语言学习之 没有重复项数字的全排列
c语言·开发语言·学习
K3njuan2 小时前
《数据结构》学习系列
学习
结衣结衣.2 小时前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
limengshi1383924 小时前
通信工程学习:什么是RIP路由信息协议
网络·网络协议·学习·智能路由器·信息与通信