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

1. 结构体:

    1. 结构体类型定义:

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

    2. 结构体变量的定义:

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

    3. 结构体元素的访问:

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

    4. 结构体的存储:

        内存对齐:

            char      按照1字节对齐

            short     按照2字节对齐

            int         按照4字节对齐

            double  按照4字节对齐

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

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

struct student stu;

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

    6. 结构体数组:

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

#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. 共用体:

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

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

    内存大小端:

        1. 内存小端:

            内存低地址存放低数据位

            内存高地址存放高数据位

        2. 内存大端:

            内存低地址存放高数据位

            内存高地址存放低数据位

        举例应用:

#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.枚举

enum 枚举类型名
{
    枚举常量1,
    枚举常量2,
    枚举常量3,    

};

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

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

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

4. 位运算运算符:

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

    按位异或实现数据交换:

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:

 num = num & ~(1 << n)

    将变量的第n位置1:

num = num | (1 << n)

作业:

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

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

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

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

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

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/361648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐一个好用的旧版本软件安装包下载地址

最近要下载旧版本的mysql和postman&#xff0c;发现官网和其他博客里边提供的地址&#xff0c;要不都非常难找到相应的下载链接&#xff0c;要不就是提供的从别的地方复制过来的垃圾教程&#xff0c;甚至有的下载还要积分&#xff0c;反正是最后都没下载成功&#xff0c;偶然发…

安全通道堵塞识别摄像机

当建筑物的安全通道发生堵塞时&#xff0c;可能会给人员疏散和救援带来重大隐患。为了及时识别和解决安全通道堵塞问题&#xff0c;专门设计了安全通道堵塞识别摄像机&#xff0c;它具有监测、识别和报警功能&#xff0c;可在第一时间发现通道堵塞情况。这种摄像机通常安装在通…

Mysql-索引创建,索引失效案例

索引创建建议 1 什么情况下需要创建索引&#xff1f; 频繁出现在where 条件字段&#xff0c;order排序&#xff0c;group by分组字段select 频繁查询的列&#xff0c;考虑是否需要创建联合索引&#xff08;覆盖索引&#xff0c;不回表&#xff09;多表join关联查询&#xff0…

【PyRestTest】高级使用

本节主要涉及PyRestTest的高级特征的详细使用,主要指:generators(生成器), variable binding(变量绑定), data extraction(数据提取), content validators(文本验证) 它们是如何组合在一起的? 模板和上下文 测试和基准测试可以使用变量来模板化动态配置。使用基础的…

OSPF排错

目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 故障六 故障现象 故障分析 …

区块链游戏解说:什么是 SecondLive

数据源&#xff1a;SecondLive Dashboard 作者&#xff1a;lesleyfootprint.network 什么是 SecondLive SecondLive 是元宇宙居民的中心枢纽&#xff0c;拥有超过100 万用户的蓬勃社区。它的主要使命是促进自我表达&#xff0c;释放创造力&#xff0c;构建梦想中的平行宇宙…

【HTML】自定义属性(data)

自定义属性 data: 的用法&#xff08;如何设置,如何获取) &#xff0c;有何优势&#xff1f; data-* 的值的获取和设置&#xff0c;2种方法: 传统方法 getAttribute() 获取 data- 属性值; setAttribute() 设置 data- 属性值getAttribute() 获取 data- 属性值; setAttribute()…

腾讯云SSL证书在阿里云添加域名DNS解析

场景说明 在阿里云申请并备案了域名&#xff0c;这个域名理论上可以在任何服务器上进行绑定。应用服务器部署到腾讯云&#xff0c;并在腾讯云申请了SSL证书&#xff0c;从而完成HTTPS转化。那么问题来了&#xff0c;腾讯提供的免费版SSL证书是一年有效期&#xff0c;到期后就需…

Cadence——布线部分相关教程

&#xff08;一&#xff09;PCB布线叠层与阻抗设计 PCB布线要区分有阻抗和无阻抗这个是根据频率和速率来区分&#xff0c;一般达100M以上就是有阻抗&#xff0c;单端信号一般是五十欧姆&#xff0c;差分信号一般一百欧姆 叠成是多层板由不同的介质压合而成&#xff0c;介质是&…

SD-WAN技术:网络升级的智慧选择

在移动办公、云计算技术和多元化的应用交付方式不断普及的今天&#xff0c;企业网络正变得越来越错综复杂&#xff0c;充满了不可预测性。为了跟上这一网络发展的步伐&#xff0c;IT部门需要深刻反思网络建设的方式&#xff0c;而定义软件广域网&#xff08;SD-WAN&#xff09;…

Ubuntu系统硬盘分区攻略(磁盘分区、RAID磁盘阵列、RAID阵列、固态硬盘分区、机械硬盘分区、swap分区、swap交换分区)

文章目录 分区需求分区方案分区顺序相关疑问swap分区不是应该放在最后吗&#xff1f;我安装系统分区的时候&#xff0c;上面有available devices&#xff0c;下面有create software raid(md)&#xff0c;我该用哪个&#xff1f;我available devices下面有个893G的固态&#xff…

C++数据结构与算法——链表

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

推特账号被冻结怎么办?检查IP是否正常

Twitter 拥有庞大的用户群和日常内容流&#xff0c;是沟通、网络和营销的重要平台。然而&#xff0c;处理其限制和潜在的帐户问题可能很棘手。有许多跨境社媒小伙伴反馈&#xff0c;账号无故被冻结&#xff0c;导致内容与客户尽失&#xff01;其实除了账户养号、被举报、广告信…

重磅!讯飞星火V3.5发布,携手35万生态开发者,赋能千行百业

今天的通用人工智能必将像PC和互联网的诞生一样&#xff0c;深刻改变人类生产生活方式。2023年&#xff0c;大模型的基础研究和应用风起云涌。2024年&#xff0c;国内大模型距国际顶尖技术追平了多少&#xff1f;大模型在哪些领域产生了效益&#xff1f; 1月30日&#xff0c;讯…

前端工程\模块化

前端工程\模块化&#x1f3ed; 本篇文章&#xff0c;学习记录于&#xff1a;尚硅谷&#x1f3a2;&#xff0c;紧接前文&#xff1a;邂逅Node.JS的那一夜→博客 无论是前端、后端、甚至非编程领域都有模块化的概念&#xff0c;只是不同的领域叫法不同&#xff0c;不过&#xf…

【WPF.NET开发】优化性能:图形呈现层

本文内容 图形硬件呈现层定义其他资源 呈现层为运行 WPF 应用程序的设备定义图形硬件功能和性能级别。 1、图形硬件 对呈现层级别影响最大的图形硬件功能包括&#xff1a; 视频 RAM - 图形硬件中的视频内存量决定了可用于合成图形的缓冲区大小和数量。 像素着色器 - 像素着…

【升级openssl1.1.1t报错libssl.so.1.1: cannot open shared object file】

升级openssl报错&#xff1a; openssl vesion openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory 编译安装openssl1.1.1t当执行openssl version的时候&#xff0c;报上述错误&#xff0c;将编译到的…

OCP NVME SSD规范解读-8.SMART日志要求-4

SMART-21&#xff1a;这段描述解释了一个与设备内部I/O操作非对齐相关的计数器功能。该计数器记录的是由NVMe SSD执行的、起始地址未按照设备内部间接寻址单元&#xff08;IU&#xff0c;Indirection Unit&#xff09;大小进行对齐的写入I/O操作数量。 “Alignment”指的是每次…

2014年苏州大学837复试机试C/C++

2014年苏州大学复试机试 要求 要求用C/C编程&#xff1b;对程序中必要的地方进行注释。上机规则 请在电脑桌面上新建一个文件夹文件夹名为考试姓名&#xff08;中文&#xff09;&#xff1b;考试完毕后&#xff0c;将所编写的文件放在上述文件中。 第一题&#xff08;20分&…

使用ffmpeg madiamtx制作一个rtsp源

有很多人在跑rtsp解码的demo的时候, 苦于找不到一个可以拉流的源, 这里说一个简单的方法. 使用mediamtx, 加ffmpeg加mp4文件方式, 模拟一个rtsp的源. 基本架构就是这样. 在PC上, 这里说的PC可以是远程的服务器, 也可以是你的开发用的windows, 都行. 把mediamtx, 在pc上跑起来 …