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

news2024/9/22 3:45:01

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Meta开源Code Llama 70B,缩小与GPT-4之间的技术鸿沟

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【C++基础入门】一、C++初识

一、C初识 1.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 1.1.1 创建项目 ​ Visual Studio是我们用来编写C程序的主要工具&#xff0c;我们先将它打开 1.1.2 创建文件 右键源文件&#xff0c;选择添加->新建项 给C文件起个名称&am…

vue3-hand-mobile

当我写完手势移动事件后&#xff0c;我又通过svg的方法添加了一段文字和polygon。当我在这个蓝色的polygon上滑动手势的时候&#xff0c;会报错。 可能这个bug只是我个人的代码导致的。但是我觉得vue3-hand-mobile插件的这一段代码写的有问题。 我通过circular-json库修复了这…

petalinux2022.2启动文件编译配置

安装必要运行库: sudo apt-get install iproute2 gawk python3 python sudo apt-get install build-essential gcc git make net-tools libncurses5-dev tftpd sudo apt-get install zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat sudo apt-ge…

IDEA Java常用快捷键

目录 main方法快捷键&#xff1a;psvm输出语句&#xff1a;sout复制行&#xff1a;ctrld删除行&#xff1a;ctrly单行注释或多行注释 &#xff1a; Ctrl / 或 Ctrl Shift /for循环 直接 &#xff1a;fori代码块包围&#xff1a;try-catch,if,while等 ctrlaltt缩进&#xff1…

CentOS 7 部署 ZeroTier Moon 节点

ZeroTier是一套使用UDP协议构建的SD-WAN网络软件&#xff0c;其主要有三部分组成&#xff1a;行星服务器Planet、月亮服务器Moon、客户端节点LEFA&#xff0c;行星服务器是ZeroTier的根节点&#xff0c;可以采用ZeroTier官方的服务器&#xff0c;也可以使用开源代码自行搭建 月…

linux平台 LED情报板网关项目总结

LED情报板目前已经基本稳定 主要存在两个版本LED1.5 和LED2 两个版本的主要差别是 &#xff1a; 1.1.5的配置文件存在本地 2.0的存在平台 需要通过接口从平台获取 2.1.5的下发消息的时候需要同步返回 2.0的是异步返回&#xff0c;所以1.5的要尽可能完成 不然会导致发 布平台…

Oracle 锁的概念以及分类

1.什么是锁 数据库是一个庞大的多用户数据管理系统&#xff0c; 同一时刻可能有多个用户同时操作。事务的分离性要求当前事务不能影响其他的事务&#xff0c;所以多个会话操作同一个资源时&#xff0c;数据库会利用锁确保他们像队列一样一次执行。利用来锁消除多个用户操作同一…

Jmeter分布式场景

Jmeter分布式 1. 为什么使用Jmter分布式测试 1.1 需求 对学院接口(查询学院-所有)进行1000用户并发访问&#xff0c;测试服务器处理批量请求能力1.2 现状 我们单台电脑由于配置(CPU、内存)问题&#xff0c;最模拟500用户时&#xff0c;就出现卡死现象按照一般的压力机配置&…

opencv学习 特征提取

内容来源于《opencv4应用开发入门、进阶与工程化实践》 图像金字塔 略 拉普拉斯金字塔 对输入图像进行reduce操作会生成不同分辨率的图像&#xff0c;对这些图像进行expand操作&#xff0c;然后使用reduce减去expand之后的结果&#xff0c;就会得到拉普拉斯金字塔图像。 …

6.2 静态内存分配模式

Bruce Powel Douglass大师介绍-CSDN博客https://blog.csdn.net/ChatCoding/article/details/134665868 嵌入式软件开发从小工到专家-CSDN博客https://blog.csdn.net/ChatCoding/article/details/135297955 C嵌入式编程设计模式源码-CSDN博客https://blog.csdn.net/ChatCoding…

STM32单片机基本原理与应用(四)

直流电机驱动控制原理 1、电机正反转控制 在STM32中&#xff0c;直流电机的正反转控制主要通过改变电机输入电源的极性来实现。当电机的电压极性发生变化时&#xff0c;电机的旋转方向也会相应改变。在硬件电路中&#xff0c;可以通过继电器或晶体管等电子开关来切换电机的电源…

消息中间件RabbitMQ介绍

一、基础知识 1. 什么是RabbitMQ RabbitMQ是2007年发布&#xff0c;是一个在AMQP(高级消息队列协议)基础上完成的&#xff0c;简称MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法&#xff0c;由Erlang&#xff08;专门针对于大…

【Tomcat与网络4】Tomcat的连接器设计

目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇&#xff0c;我们介绍了Tomcat提供服务的整体结构&#xff0c;本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能&#xff1a; 处理 Socket 连接&#xff0c;负责网络字节流与…

中国的茶文化:现代生活中的茶文化

中国的茶文化&#xff1a;现代生活中的茶文化 引言 在现代社会的快节奏生活中&#xff0c;茶文化并未随时间流逝而褪色&#xff0c;反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴&#xff0c;成为一种连接历史、人文与现代生活方式的艺术形式。本文…

VRRP负载平衡

1.构图 2.实验 2.1如图提示配置pc1-pc4 掩码:255.255.255.0网关均设置为192.168.1(\2).254 2.2配置sw1-sw2 [sw1]port-group 1 //创建接口组&#xff0c;组号是1[sw1-port-group 1]group-member gigabitethernet 0/0/1 to gigabitethernet 0/0/3 //添加组成员&#xff0c;从…

Unity 设置鼠标

前言 本章主要对鼠标图标样式还有鼠标显隐进行设置 图标样式的设置 代码控制 有时候需要有改变鼠标样式的需求可以使用如下代码 Cursor.SetCursor(this.mouseTexture, Vector2.zero, CursorMode.Auto); 传入的要替换的图标偏移量允许您在支持的平台上使用硬件光标&#xff0…

【Javaweb】【C00157】基于SSM的宠物护理预定系统(论文+PPT)

基于SSM的宠物护理预定系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的宠物护理预订系统 本系统分为前台系统模块、后台管理员模块以及后台会员用户模块 其中前台系统模块&#xff1a;当游客打开系统的网址后&…

《Lua程序设计》-- 学习9

迭代器和泛型for 迭代器和闭包 迭代器&#xff08;iterator&#xff09;是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中&#xff0c;通常使用函数表示迭代器&#xff1a;每一次调用函数时&#xff0c;函数会返回集合中的“下一个”元素。 一个闭包就是一个…

万户 ezOFFICE SendFileCheckTemplateEdit.jsp SQL注入漏洞

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…