自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 STM32

STM32F103C8T6 单片机芯片,是开发板的 “大脑”,负责运行程序、处理数据。:有高速外部时钟()和低速外部时钟(),为系统运行提供计时基准。:包含复位电路(RESET 按键,用于重启单片机 )、电源指示灯(PWRER,显示开发板是否通电 )。:有各类 GPIO 引脚用于外接设备(如舵机等 ),还有 USB 接口(用于供电、程序下载等 ) ,提供硬件连接和扩展能力。

2025-07-17 19:01:22 495

原创 STM32介绍和GPIO

一个数的某一位,置为0,只需要按位与一个需要置换的位置为0其他位置为1的数,因为&有0则0,一个数&1是本身,不变一个数的某一位,置为1,只需要按位或一个需要置换的位置为1其他位置为0的数,因为|有1则1,一个数|0是本身,不变一个数的某一位,进行反转,只需要异或一个需要置换的位置为1其他位置为0的数,因为相同(本身)为0相异为1,一个数0不变,1反转要清零,用,掩码位是0要置 1,用,掩码位是1要翻转,用,掩码位是1要取反,用,整个数变反。

2025-07-14 19:17:23 286

原创 网络编程员工管理系统

本项目是经过了上一个单机版员工管理系统改版,基于 TCP 网络编程的员工管理系统,包含客户端和服务端两部分。服务端支持多线程并发处理多个客户端连接,使用 SQLite 数据库存储员工信息。客户端与服务端通过 JSON 格式进行数据交互,利用 cJSON 库解析和构建请求与响应,实现登录、增删改查、排序、日志等功能。客户端负责菜单交互和数据展示,服务端负责业务逻辑和数据管理。用户可通过命令行界面操作,实现员工信息的管理和统计。

2025-07-12 13:37:58 364

原创 模拟数字电路基础-2

或门有多个输入端,一个输出端,只要输入中有一个为高电平时(逻辑“1”),输出就为高电平(逻辑“1”);只有当所有的输入全为低电平(逻辑“0”)时,输出才为低电平(逻辑“0”)。在运放的差分输入端口,通常会接入两个电压信号,一个是(+IN)的电压,一个是(-IN)的电压。当所有的输入同时为高电平(逻辑1)时,输出才为高电平,否则输出为低电平(逻辑0)。非门(NOT gate,也叫反相门):非门是一种只有一个输入端口和一个输出端口的逻辑门,它的输出等于输入的反向,即当输入为高电平时,输出为低电平,反之亦然。

2025-07-07 21:05:29 1019

原创 项目一员工管理系统

以下我们实现一个单机版员工管理系统,代码约2000行。项目技术栈:使用sqlite做为数据存储方案使用IO流,多线程实现日志功能使用正则表达式,对用户输入(如姓名、密码)进行格式校验,保证数据合法性。对用户密码进行哈希加密,提升系统安全性。

2025-07-01 09:53:49 248

原创 模数电路基础-1

模电数电是模拟电路和数字电路的总称,也有的称为模数电。模电: 处理模拟信号(时间和幅度都连续的信号,可以理解为图像连续)的电子电路;数电: 一般称对数字量进行算术运算和逻辑运算的电路称为数字电路/系统.由于它具有逻辑运算和逻辑处理功能,所以又称数字逻辑电路.现代的数字电路由半导体工艺制成的若干数字集成器件构造而成.逻辑门是数字逻辑电路的基本单元.存储器是用来存储二值数据的数字电路.从整体上看,数字电路可以分为组合逻辑电路和时序逻辑电路(输出不依赖或不完全依赖当前输入)两大类.

2025-06-30 20:00:16 1049

原创 网络编程TCP与UDP

(1)为了更好应对和苏联的军事竞赛,1958美国成立了ARPA部门,开发了内部联网技术- ARPANET(因特网的前身)方便不同部门之间可以快速沟通,开发ncp协议作为早期网络的通信协议。(2)70年代末,随着链接ARPANET的电脑节点不断增加,美国开发了tcp/ip,并代替旧的网络通信协议(ncp)作为军事内部的标准通信协议(3)1983,ARPANET分裂成军用和民用两部分,民用部分随着全社会的加入,因特网从而开始崭露头角,这个是离不开tcp\ip协议的推进。(4)1984,国际标准化组织(iso)发

2025-06-17 19:27:37 1300

原创 进程创建及守护进程

进程是系统进行资源分配和调度的基本单位,而线程是 CPU 调度和分派的基本单位。理解这一点有助于优化程序性能(如多线程并行计算)和资源管理(如避免进程间过度切换)。

2025-06-16 22:28:52 849

原创 简易学生系统1.0

【代码】简易学生系统1.0。

2025-06-13 11:09:00 106

原创 数据库(sqlite)基本操作

在多个系统和程序语言之间提供极致的可移植性。

2025-06-07 12:42:21 1113

原创 线程基础编程

(1)官方定义线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中实际运行工作的单位。每个线程都是进程的一部分,包含在进程的地址空间内,可以利用进程所拥有的资源理解线程:为计算机种实际执行工作的最小单位。(2)线程和进程之间的关系包含进程是系统中资源分配的最小单元,具有独立的地址空间。而线程是执行(cpu调度)的最小单元,同一进程中的多个线程共享进程的资源,如内存和文件。通信:进程间通信需要特定的IPC机制,并且进程间相互独立。而线程之间可以直接通信。

2025-06-06 17:00:15 879

原创 时间获取函数

/上面经过time函数后,now里填充的是从1970年到当前时间的秒数,经过localtime函数格式化,转换为年月日...的本地时间(以struct tm结构体的形式表示),返回指向该结构体的指针,用t接收。是 C 标准库中定义的用于表示时间的类型,通常是整数类型,用于存储从 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC )开始到当前的秒数。//// 计算数组长度(即64)// 声明一个time_t类型的变量now,time_t类型变量(本质是整数,存储秒数)

2025-06-05 19:24:44 714

原创 标准IO及相关函数介绍

标准I/O:是指标准I/O库,又称带缓存的I/O,属于ISO实现的输入输出的标准库函数,内部调用的是底层的系统调用,是在文件IO的基础上封装出来的函数接口,也就是说基于低级IO的一个封装和抽象标准IO是基于低级IO进行设计的带缓存的IO机制。提供了一系列的库函数用于完成输入和输出相关操作。类别函数名说明文件读fgets一行一行的读fread一般读取整个文件,适合二进制文件,比如音频、视频,文档等fgetc一个一个字符的读fscanf。

2025-06-04 19:16:29 689

原创 文件IO流

单次调用read()返回 0 → 未读取到任何数据。循环中read()返回 0 → 文件已全部读完。

2025-06-03 23:24:53 937

原创 进阶-自定义类型(结构体、位段、枚举、联合)

如果c不使用前面剩余的bit直接使用新开辟的,使用完后,新开辟的还剩8 - 5 = 3个bit,那么存放d的时候是不够的,还需要再开辟一个字节,那这个时候一共开辟3个字节。c占5bit现在还剩一个bit但是不够放c,跳过直接使用下一个字节,现在把3放进c里,3的二进制是011,可以放进,不够5位,补0,00011,现在内存中就变成了。4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。2.位段中最大位的数目不能确定。

2025-05-25 23:12:37 416

原创 进阶-字符串与内存函数的介绍

/想要比较的字符个数。isspace 空白字符 : 空格' ',换页'\f',换行'\n',回车'\r',制表符'\t'或者垂直制表符'\v'

2025-05-06 00:42:16 657

原创 进阶-指针详解

/初始化过程中会把1 赋值给 a[0][0],3 赋值给 a[0][1],5 赋值给 a[1][0],而剩余的数组元素(即 a[1][1]、a[2][0] 和 a[2][1])会被自动初始化为 0。cpp[-1][-1]-->*(*(cpp-1)-1),上一轮打印运算并没有改变cpp的值,cpp还是指向cp+2,cpp - 1,现在cpp指向cp+1,解引用找到c + 2再-1得到c + 1,比如,当 arr[i] 是 'a' 时,arr1[arr[i] - 'a'] 就是 arr1[0];

2025-05-03 19:40:13 630

原创 进阶-数据存储

0.5(1 / 2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0 * 2 ^ (-1),其阶码为 - 1 + 127 = 126,表示为01111110,E全为0,这时,浮点数的指数E直接等于1 - 127(或者1 - 1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这时,浮点数的指数E直接等于1 - 127(或者1 - 1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。其中:S 是符号位的值。

2025-04-23 17:21:08 431

原创 调试-初阶完结!

const修饰*p,意思是p指向的对象不能通过p来改变了,但是p变量本身的值可以改变,可以把p改成别的值,如p=&n;Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。3. 如果i和arr之间有适当的空间,利用数组的越界操作就可能会覆盖到i,就可能会导致死循环出现的。const 放在 * 的右边意思是p指向的对象是可以通过p来改变的,但是不能修改p变量本身的值。while (*dest++ = *src++)//'\0'的阿斯克码为0。

2025-04-17 19:42:16 284

原创 结构体 - 完

/%s,打印字符串。//这个函数,需要它打印,不需要返回,所以给个void。

2025-04-14 22:37:12 554

原创 指针-浅识!

(2^32Byte == (2^32 / 1024)KB == (2^32 / 1024 / 1024)MB == (2^32 / 1024 / 1024 / 1024)GB == 4GB)4G的空闲进行编址。//右边的*说明ppa是指针变量,int*说明,ppa这个变量指向的对象ppa的类型是int*/*1. sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。要将& num(num的地址)保存到p中,我们知道p就是一个指针变量,那它的类型是怎样的呢?

2025-04-14 00:27:33 425

原创 操作符-整章完!

在这个例子中,a是int类型,b是float类型,在执行a + b运算时,编译器会自动把int类型的a转换为float类型,然后再进行加法运算。相同时,结果位为 0。先计算表达式 1 的值,若为真(非 0),则整个条件表达式的值为表达式 2 的值;当 num 所有的 1 都被置为 0 后,num 的值就变为 0 了,此时 while 循环的条件表达式为 “假”,循环终止。num &= (num - 1) 即 00001111 & 00001110,结果为 00001110,count 变为 1。

2025-04-12 18:27:52 461

原创 操作符-算术&位移

从最低位开始计算,0 - 1 不够减,向高位借 1 当 2,得到 10 - 1 = 1,其余高位依次计算,最终得到反码为 11111111 11111111 11111111 11110001。按位权展开求和,二进制数从右到左每一位的位权分别是 2 ^ 0, 2 ^ 1, 2 ^ 2,...,将每一位上的数字乘以对应的位权,然后相加。有符号整数使用最高位作为符号位(0 表示正数,1 表示负数),因此非负的有符号整数的取值范围是从 0 到 (2 ^ {n - 1} - 1),

2025-04-10 00:14:01 1019

原创 数组应用-扫雷

/这里放的是字符'0'和'1',需要'1'-'0'=1,'0'-'0'=0,因为字符 '0' 的 ASCII 码值是 48,字符 '1' 的 ASCII 码值是 49。使用 rand() 函数生成随机坐标,检查该位置是否已经有雷,如果没有则将该位置标记为雷('1'),并减少剩余雷的数量。在游戏中,mine 数组初始化为 '0' 表示没有布置雷,show 数组初始化为 '*' 表示未排查的区域。//存放排查出的雷的信息。printf("-----------扫雷游戏-----------\n");

2025-04-09 03:10:48 444

原创 数组应用-三子棋

调用 srand((unsigned int)time(NULL)) 函数,利用当前时间作为随机数种子,保证每次运行程序时电脑下棋的坐标是随机的。利用双重循环遍历棋盘的每个位置,若发现有未被占用的位置(值为 ' '),则返回 0 表示棋盘未满;若所有位置都被占用,返回 1 表示棋盘已满。进入一个无限循环,在循环中,玩家先下棋,调用 iswin 函数判断游戏结果,若游戏结束(返回值不是 'C'),则跳出循环;否则,打印当前棋盘,电脑下棋,再次调用 iswin 函数判断游戏结果,若游戏结束则跳出循环。

2025-04-08 17:07:36 363

原创 数组-完结

为什么printf("%p\n", &arr),printf("%p\n", arr);因此,sizeof(arr) / sizeof(arr[0])的结果并非数组的元素数量,这就会造成排序逻辑出错。按理说,数组名是数组首元素的地址,那么int n = sizeof(arr);1. sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。

2025-04-08 01:18:13 362

原创 数组-一维数组

例如,要访问 arr[i],可以通过首地址加上 i * sizeof(int) 来得到该元素的地址。数组在创建的时候如果想不指定数组的确定的大小就得初始化。//在字符数组初始化时,直接使用 ASCII 码值和使用单引号括起来的字符常量是等效的。比如元素1的地址 : 01 00 00 00, 元素2的地址:02 00 00 00。数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。//对数组内容赋值,数组是使用下标来访问的,下标从0开始。随着数组下标的增长,元素的地址,也在有规律的递增。

2025-04-07 00:00:32 304

原创 函数-整篇完结!

当前 my_strlen("abc") 的执行会暂停,等待 my_strlen("bc") 调用返回。当前 my_strlen("bc") 的执行暂停,等待 my_strlen("c") 调用返回。当前 my_strlen("c") 的执行暂停,等待 my_strlen("") 调用返回。my_strlen("bc") 函数在等待 my_strlen("c") 返回后,得到返回值 1。my_strlen("c") 函数在等待 my_strlen("") 返回后,得到返回值 0。执行 1 + 0,返回 1。

2025-04-05 21:35:31 288

原创 语句-猜数字游戏

int binary_search(int arr[], int k)中int arr[]的是一个指针变量,等价于int* arr。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。//int c =add(add(a,3),b)//数组名代表数组首元素的地址,函数接收此地址后就能对数组元素进行访问。//在 C 语言里,当你调用函数时,函数参数若为数组,仅需给出数组名。//数组名代表数组首元素的地址,函数接收此地址后就能对数组元素进行访问。

2025-04-04 22:31:20 240

原创 语句-练习

因为 z 中保存的是 a 原来的值,而 py 指向 b,所以这一步相当于把 a 原来的值赋给了 b。这样,b 的值就变成了 a 原来的值,从而完成了 a 和 b 两个变量值的交换。这时,a 的值就变成了 b 原来的值,而 a 原来的值由于之前已经保存到 z 中,所以不会丢失。例如,若直接写 a = b;,那么 a 原本的值就会被 b 的值覆盖,此时 a 原来的值就丢失了,也就无法完成交换。例如之前提到的 swap 函数,它的目的是交换两个变量的值,这就需要直接操作变量的内存地址,所以要使用指针来传递参数。

2025-04-02 20:51:34 419

原创 语句-循环语句,完结!

/如果这里放一个固定的数,那么rand生成的也是固定的,所以需要一个随机的数time()使用rand()函数生成一个随机数,然后对100取模得到一个0到99之间的数,再加上1,最终得到一个1到100之间的随机数,存储在变量ret中。time()函数用于获取当前的时间戳,常作为srand()的参数,以保证每次程序运行时生成不同的随机数序列。这就会导致每次新游戏生成的随机数序列都是一样的,玩家每次猜的都是同一个数字,失去了游戏的随机性和趣味性。

2025-04-01 21:05:58 274

原创 语句-循环语句-while

/if(password == "abcdef")//比较2个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp。//如果用 int right = sizeof(arr1) / sizeof(arr[0])-2,因为把\0算进去了。printf("找到了,下标是:%d\n", i);printf("找到了,下标是:%d\n", mid);printf("三次密码均输入错误,退出程序\n");

2025-03-31 20:58:56 585

原创 语句-分支语句

c语句可分为以下五类:表达式语句函数调用语句控制语句符合语句空语句c语言是【结构化】的程序设计语言顺序结构 选择结构 循环结构先介绍控制语句控制语句用于控制程序的执行流程,以实现程序的各种结构方式。它们由特定的语句定义符组成,c语言有9种控制语句可分成以下三类:1. 条件判断语句也叫分支语句:if语句、switch语句2. 循环语句:do while语句、while语句、for语句3. 转向语句:break语句、goto语句、continue语句。

2025-03-30 19:48:32 637

原创 C语言part4,初步完结!

或者printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->tele);//()就是函数调用操作符,add,2,3都是()的操作数。// / 除号两端都是整数的时候,执行的是整数除法,如果两端只要有一个浮点数就执行浮点数的除法。所以为了有效的使用内存,就把内存划分成为一个个小的内存单元,每个内存单元都有一个编号,大小是1个字节。

2025-03-29 13:45:41 325

原创 C语言part3

static 修饰局部变量的时候,局部变量出了作用域,不销毁,本质上,static修饰局部变量的时候,改变了变量的存储位置的。内存 //内存搭配(CPU - 中央处理器),但是后面跟不上了,使用寄存器快些。这个全局变量的外部属性就变成了内部链接属性,其他源文件(.c文件)就不能再使用到这个全局变量了。//自动变量,所有局部变量都会被自动销毁,所以省略。但是被static修饰的时候,外部链接属性就变成了内部链接属性,其他源文件就无法使用。

2025-03-28 18:30:02 426

原创 C语言part2

/ / 除号两端都是整数的时候,执行的是整数除法,如果两端只要有一个浮点数就执行浮点数的除法。//()就是函数调用操作符,add,2,3都是()的操作数。//[]就是下标引用操作符,arr和3就是[]的操作数。//取整,强制类型转换,类型在前。//前置++,先++,后使用,a,b=11。int b = 20;//,a和b都为非0,都为真。if (a && b) //a和b都为真打印hehe。//后置++,先使用,后++

2025-03-27 19:50:46 256

原创 C语言part1

/ 4 C语言规定:sizeof(long)>=sizeof(int)scanf("%d %d", &num1, &num2);//在源文件的第一行加#define _CRT_SECURE_NO_WARNINGS。标准的主函数的写法,main函数是程序的入口,有且仅有一个。浮点数的四舍五入,不能用你肉眼看的数值来计算!

2025-03-26 21:15:29 294

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除