- 博客(858)
- 资源 (1)
- 收藏
- 关注
原创 GD32F470实现485串口通信
这个方案提供了从硬件连接到软件驱动、从基础发送到错误处理的完整实现。关键在于方向切换的精确控制和符合规范的硬件布局。在GD32F470上实现RS485通信,核心在于利用一个GPIO引脚控制收发方向,并精确管理发送与接收的切换时机。发送时:拉高DE引脚,将MCU的串口TX信号驱动到总线。接收时:拉低DE引脚,使收发器变为高阻态,监听总线数据。
2025-12-02 15:43:03
29
原创 GD32F470控制伺服电机
将编码器的A相、B相和Z相信号线分别连接到GD32F470定时器支持正交解码功能的通道引脚上。在GD32F470上通过ABZ编码器获取电机转动角度,核心在于利用定时器的正交编码器模式自动计数,再通过计算将计数值转换为角度。在C语言中,将-500到500的范围映射到0~100可以通过线性变换实现。配置与定时器通道对应的GPIO为复用功能模式(AF),并使能内部上拉电阻以确保信号稳定。Z相(索引信号)每转输出一个脉冲,可用于确定电机的绝对零位,消除累计误差。这是核心配置,需要将定时器初始化为正交编码器模式。
2025-11-21 22:08:35
98
原创 gd32f470之PWM输出
在GD32F470上使用TIMER2和TIMER4分别控制PA7和PA1产生PWM信号,并提供频率和占空比调节功能。通过数据手册Table 2-3. GD32F470Ix BGA176 pin definitions可以查到GPIO复用情况。想要某个GPIO输出想要的PWM波形,第一步需要弄清楚该GPIO是否可以有定时器复用输出PWM波形功能。例如PB4可以使用TIMER2_CH0通道生成PWM。在设置复用是可以查看GD32F4xx库指南。最后选择PWM输出模式。
2025-11-19 21:53:06
196
原创 gd32f470x时钟设置
第一步:找到外部时钟输入,并且进行修改,将其修改为自己设计的电路中晶体振荡的频率。第二步:修改宏定义,选择需要生成的系统时钟。第三步:配置AHB/AP2/APB1等时钟。
2025-11-19 20:49:52
43
原创 C语言实现,输入一串数字,数字之间用逗号隔开。输出数字,去掉逗号。
请输入数字(用逗号隔开):123,456,789,101。处理后的数字:123456789101。方法二:读取整个字符串后处理。方法四:使用指针的高级版本。方法一:逐个字符读取处理。方法三:存储处理后的结果。
2025-11-03 11:45:45
239
原创 C语言练习题(二)
从字符串的第一个字符开始逐个比较,直至发现第一个不同的位置,比较这个位置字符的 Ascii 码,Ascii 码较小(“‘A’”<“‘B’“⋯<”‘Z’”<“‘a’”<⋯<“‘z’” )的字符串字典序也较小。输出以单词为单位逆序排放的结果,即仅逆序单词间的相对顺序,不改变单词内部的字母顺序。此后 n 行,每行输入一个长度 1≦length(s)≦100,由大小写字母构成的字符串 s,代表一个单词。在一行上输入一个长度为 1≦length(s)≦100 ,由可见字符构成的字符串 s ,代表待判断的密码。
2025-10-26 19:27:23
1017
原创 C语言练习题
目一 :输出一段单词中最后一个单词的长度描述对于给定的若干个单词组成的句子,每个单词均由大小写字母混合构成,单词间使用单个空格分隔。输出最后一个单词的长度。输入描述:在一行上输入若干个字符串,每个字符串代表一个单词,组成给定的句子。除此之外,保证每个单词非空,由大小写字母混合构成,且总字符长度不超过 10^3。输出描述:在一行上输出一个整数,代表最后一个单词的长度。
2025-10-25 19:19:18
806
原创 C语言需要掌握的基础知识点之统计
统计计算是数据分析的基础,C语言虽然不像专门的统计语言那样内置丰富的统计函数,但我们可以自己实现各种统计计算方法。以下是C语言中统计计算的详细介绍和实现。
2025-10-25 09:57:58
200
原创 C语言需要掌握的基础知识点之枚举
枚举(Enumeration)是C语言中一种重要的数据类型,它允许程序员定义一组命名的整数常量,使代码更加清晰和易读。枚举是一种用户定义的数据类型,它由一组命名的整数常量组成。这些常量称为枚举常量或枚举成员。枚举的定义枚举变量的声明和使用枚举的高级用法枚举与字符串的转换枚举作为函数参数和返回值枚举与位标志枚举数组和结构体枚举的实际应用案例状态机实现错误处理系统枚举的最佳实践枚举的命名规范和技巧枚举与联合体的结合完整测试程序枚举的重要特性总结
2025-10-25 09:57:44
271
原创 C语言需要掌握的基础知识点之分治
分治算法(Divide and Conquer)是一种重要的算法设计范式,它将问题分解成若干个规模较小的相同问题,递归地解决这些子问题,然后再合并其结果来得到原问题的解。分解(Divide):将原问题分解成若干个规模较小的子问题。合并(Combine):将子问题的解合并成原问题的解。解决(Conquer):递归地解决各个子问题。大整数乘法(Karatsuba算法)矩阵乘法(Strassen算法)最大子数组和(分治解法)
2025-10-25 09:57:31
244
原创 C语言需要掌握的基础知识点之并查集(Disjoint Set Union,DSU)
并查集(Disjoint Set Union,DSU)是一种用于处理不相交集合的数据结构,主要支持合并(Union)和查找(Find)两种操作。它在图论、网络连接、最小生成树等算法中有广泛应用。路径压缩(Path Compression)快速合并实现(Quick Union)按秩合并(Union by Rank)最小生成树算法(Kruskal)朴素实现(Quick Find)最小生成树(Kruskal算法)Find:确定元素属于哪个集合。Union:合并两个集合。图像处理中的连通区域标记。
2025-10-25 09:57:15
312
原创 C语言需要掌握的基础知识点之状态机
状态机(State Machine)是一种数学模型,用于表示有限数量的状态以及状态之间的转换。在编程中,状态机是处理复杂逻辑和状态转换的强大工具。米利机(Mealy Machine):输出依赖于当前状态和输入。摩尔机(Moore Machine):输出只依赖于当前状态。转换(Transition):状态之间的切换。动作(Action):状态转换时执行的操作。状态(State):系统可能处于的状况。事件(Event):触发状态转换的条件。简单的switch-case状态机。状态机工具函数和调试。
2025-10-24 14:33:32
445
原创 C语言需要掌握的基础知识点之回溯算法
回溯算法是一种通过试错来寻找问题解决方案的算法。它采用深度优先搜索策略,在搜索过程中逐步构建解决方案,当发现当前路径不可能得到正确解时,就回溯到上一步,尝试其他可能性。核心思想选择:从可用选择中做出一个选择约束:检查选择是否满足约束条件目标:检查是否达到目标状态回溯:如果当前选择导致死路,撤销选择并尝试其他选项经典回溯算法问题N皇后问题数独求解器全排列问题组合求和问题子集问题图的m着色问题单词搜索问题回溯算法模板通用回溯模板排列型回溯模板组合型回溯模板性能优化技巧剪枝优化
2025-10-24 13:57:05
280
原创 C语言需要掌握的基础知识点之动态规划(Dynamic Programming, DP)
动态规划(Dynamic Programming,DP)是一种重要的算法设计技术,它通过将复杂问题分解为更小的子问题来解决,并存储这些子问题的解以避免重复计算。重叠子问题:在递归求解过程中,相同的子问题会被多次计算。最优子结构:问题的最优解包含其子问题的最优解。记忆化:存储已计算子问题的结果,避免重复计算。自顶向下:递归 + 记忆化。最长公共子序列(LCS)最长递增子序列(LIS)
2025-10-24 13:48:45
227
原创 C语言需要掌握的基础知识点之排列组合
排列组合在算法竞赛、密码学、统计学等领域都有广泛应用。掌握这些基础算法对于提高编程能力和解决复杂问题非常重要。排列组合是组合数学中的基础概念,在编程中有着广泛的应用。以下是C语言中排列组合的详细实现和应用。从n个不同元素中取出m个元素,按照一定的顺序排成一列。从n个不同元素中取出m个元素,不考虑顺序。排列(Permutation)组合(Combination)杨辉三角(组合数的几何表示)使用long long类型。使用递推公式避免大数计算。密码破解(排列应用)
2025-10-24 11:57:42
262
原创 C语言需要掌握的基础知识点之贪心算法
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。以下是C语言中贪心算法的详细介绍和实现。核心思想:每一步都做出局部最优选择,希望这样的局部最优选择能够导致全局最优解。贪心选择性质:可以通过局部最优选择来构造全局最优解。单源最短路径(Dijkstra算法 - 贪心实现)最优子结构:问题的最优解包含其子问题的最优解。最小生成树(Prim算法 - 贪心实现)无后效性:当前选择不会影响后续选择。
2025-10-24 11:44:44
373
原创 C语言需要掌握的基础知识点之图
图是一种非常重要的非线性数据结构,由顶点的集合和顶点之间边的集合组成。以下是C语言中图的详细介绍和实现。顶点(Vertex):图的基本单元。Floyd-Warshall算法。边(Edge):顶点之间的连接。深度优先搜索(DFS)广度优先搜索(BFS)Dijkstra算法。
2025-10-24 11:31:32
412
原创 C语言需要掌握的基础知识点之BFS(广度优先搜索)
广度优先搜索:从起始节点开始,先访问所有相邻节点,然后再依次访问这些相邻节点的相邻节点,以此类推,直到遍历完所有可达节点。在C语言中,BFS(广度优先搜索)是一种重要的图遍历算法,它从根节点开始,逐层遍历所有节点。基于邻接矩阵的BFS。完整的BFS示例程序。最短路径(未加权图)
2025-10-24 11:27:03
147
原创 C语言需要掌握的基础知识点之DFS(深度优先搜索)
深度优先搜索:沿着树的深度遍历节点,尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。在C语言中,DFS(深度优先搜索)是一种重要的图遍历算法,也可以应用于树结构。DFS非递归实现(使用栈)基于邻接矩阵的DFS。完整的DFS示例程序。
2025-10-24 11:21:26
344
原创 C语言需要掌握的基础知识点之树
在C语言中,树(Tree)是一种非常重要的非线性数据结构,它由n(n≥0)个有限节点组成的一个具有层次关系的集合。高度:从该节点到最远叶子节点的路径长度。深度:从根节点到该节点的路径长度。父节点、子节点:节点之间的关系。叶子节点:没有子节点的节点。广度优先遍历(层次遍历)根节点:树的最顶层节点。度:节点拥有的子树数。检查是否为完全二叉树。
2025-10-24 11:16:00
346
3
原创 C语言需要掌握的基础知识点之正则表达式
/ 常用正则表达式模式"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", // 电子邮件"^1[3-9]\\d{9}$", // 手机号"^[0-9]{17}[0-9Xx]$", // 身份证"^(https?://)?%&=]*)?$", // URL"^#[0-9A-Fa-f]{6}$", // 十六进制颜色"^[0-9]{4}-[0-9]{2}-[0-9]{2}$", // 日期"^([01]?
2025-10-24 10:54:28
252
原创 C语言需要掌握的基础知识点之矩阵
矩阵是数学和计算机科学中的重要概念,在C语言中通常用二维数组来表示。矩阵在图形处理、科学计算、机器学习等领域有广泛应用。矩阵是一个按照长方阵列排列的数值集合,由行和列组成。在C语言中,我们使用二维数组来表示矩阵。线性方程组求解(高斯消元法)图像处理中的矩阵操作(卷积)矩阵求逆(伴随矩阵法)
2025-10-24 10:46:03
315
原创 C语言需要掌握的基础知识点之二分查找
二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法。它的时间复杂度为O(log n),远比线性查找的O(n)要高效。二分查找通过不断将搜索区间减半来快速定位目标元素。它要求数组必须是有序的(升序或降序)。查找第一个大于等于目标值的位置。在矩阵中查找(每行每列都排序)重复直到找到目标或区间为空。查找第一个等于目标值的位置。查找旋转排序数组中的目标值。在未知大小的有序数组中查找。根据比较结果调整搜索区间。确定搜索区间的左右边界。比较中间元素与目标值。与线性查找的性能比较。
2025-10-24 10:37:48
303
原创 C语言需要掌握的基础知识点之线性表
线性表是最基本、最常用的一种数据结构,它是由n个数据元素组成的有限序列。在C语言中,线性表可以通过数组或链表来实现。线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列。抽象性:只关心逻辑关系,不关心具体存储方式。同类型:所有元素属于同一数据类型。有限性:元素个数是有限的。有序性:元素有先后顺序。
2025-10-24 09:58:59
206
原创 C语言需要掌握的基础知识点之链表
链表是一种动态数据结构,它通过指针将一系列节点连接成一个序列。与数组不同,链表的大小可以在运行时动态改变,内存分配也更加灵活。双链表:每个节点有指向前一个和后一个节点的指针。单链表:每个节点只有一个指向下一个节点的指针。循环链表:尾节点指向头节点,形成环状结构。指针域:指向下一个节点的地址。数据域:存储实际数据。
2025-10-24 09:47:31
346
原创 C语言需要掌握的基础知识点之哈希表
哈希表(Hash Table)是一种通过哈希函数将键映射到数组中位置的数据结构,它提供了快速的数据插入、删除和查找操作。在C语言中,哈希表通常需要手动实现。哈希表使用哈希函数将键转换为数组索引,从而实现快速的数据访问。冲突解决机制:处理多个键映射到同一索引的情况。哈希函数:将键映射到数组索引。支持任意数据类型的哈希表。
2025-10-24 08:51:58
248
原创 C语言需要掌握的基础知识点之队列
操作系统任务调度10int pid;// 进程ID// 进程名// 优先级} Task;int front;int rear;int size;// 简单的任务调度模拟printf("=== 操作系统任务调度模拟 ===\n");// 添加任务到队列{1, "浏览器", 2},{2, "文本编辑器", 1},{3, "音乐播放器", 3},{4, "下载管理器", 2}i++) {
2025-10-23 18:23:30
219
原创 C语言需要掌握的基础知识点之位运算
位运算是在二进制位级别上直接操作数据的技术。C语言提供了丰富的位运算符,这些运算符在系统编程、嵌入式开发、性能优化等领域有广泛应用。位运算直接对整数在内存中的二进制位进行操作。C语言提供了6种位运算符,用于处理二进制数据。位字段(Bit Fields)位运算在标志位中的应用。计算二进制中1的个数。位运算在加密中的应用。
2025-10-23 18:11:42
393
原创 C语言需要掌握的基础知识点之进制转换
进制转换是C语言编程中的常见任务,涉及二进制、八进制、十进制和十六进制之间的相互转换。下面详细介绍各种进制转换的方法和实现。十六进制:基数为16,使用数字0-9和字母A-F。十进制:基数为10,使用数字0-9。二进制:基数为2,使用数字0和1。八进制:基数为8,使用数字0-7。使用sprintf和sscanf。快速二进制-十六进制转换表。
2025-10-23 18:04:55
223
原创 C语言需要掌握的基础知识点之栈
函数调用栈// 演示函数调用栈printf("函数C执行\n");// 函数C的栈帧printf("函数B执行\n");// 调用函数C// 函数B的栈帧printf("函数A执行\n");// 调用函数B// 函数A的栈帧printf("主函数开始\n");// 调用函数Aprintf("主函数结束\n");return 0;撤销操作(Undo)10100int top;printf("=== 撤销操作演示 ===\n");
2025-10-23 17:57:07
317
原创 C语言需要掌握的基础知识点之双指针技术
双指针技术是C语言中一种重要的算法技巧,它使用两个指针以不同的速度或方向遍历数据结构,从而高效解决各种问题。这种技术在数组、字符串和链表操作中特别有用。两个指针从两端向中间移动,常用于有序数组。移除有序数组中的重复元素。简化复杂问题的解决方案。两数之和(有序数组)
2025-10-23 17:37:31
303
原创 C语言需要掌握的基础知识点之滑动窗口
滑动窗口算法是一种用于处理数组/字符串子数组或子串问题的有效技术。它通过维护一个窗口(通常是两个指针表示的范围)来避免不必要的重复计算,从而优化算法性能。滑动窗口技术使用两个指针(通常称为left和right)来表示当前考虑的窗口范围。通过移动这两个指针,我们可以在线性时间内解决许多需要嵌套循环的问题。大小为k的子数组最大和。和至少为k的最短子数组。覆盖所有字符的最短子串。无重复字符的最长子串。满足条件的最长子数组。前缀和 + 滑动窗口。
2025-10-23 11:53:28
352
原创 C语言需要掌握的基础知识点之循环
循环是C语言中用于重复执行代码块的重要控制结构。C语言提供了多种循环结构,每种都有其特定的用途和适用场景。do-while循环先执行一次代码块,然后检查条件,适用于至少需要执行一次的情况。while循环在条件为真时重复执行代码块,适用于循环次数未知的情况。for循环是最常用的循环结构,适用于已知循环次数的情况。continue用于跳过当前循环迭代,继续下一次迭代。break用于立即退出循环。
2025-10-22 22:27:07
186
原创 C语言需要掌握的基础知识点之递归
递归是C语言中一种重要的编程技术,它允许函数调用自身来解决问题。递归可以将复杂问题分解为更小的相似问题,直到达到基本情况。递归是一个函数直接或间接调用自身的过程。递归情况:函数调用自身的部分。基本情况:递归终止的条件。
2025-10-22 22:15:53
333
原创 C语言需要掌握的基础知识点之前缀和
前缀和(Prefix Sum)是一种重要的数据处理技术,它可以在预处理后快速计算数组任意区间的和。这种技术在算法竞赛和实际开发中都有广泛应用。前缀和是一个数组,其中每个元素存储原数组从第一个元素到当前位置所有元素的和。对于数组 arr[0…对于二维数组,前缀和可以快速计算任意子矩阵的和。优化版本(包含边界处理)
2025-10-22 17:42:54
709
原创 C语言需要掌握的基础知识点之排序
冒泡排序通过重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。i < n-1;j++) {// 交换 arr[j] 和 arr[j+1]i < size;i++)printf("排序后的数组: \n");return 0;
2025-10-22 14:04:21
644
原创 C语言需要掌握的基础知识点之字符串
这种方式中,字符串"Hello"存储在只读内存区,不能通过指针修改其内容(尝试修改会导致未定义行为)。在C语言中,没有内置的字符串类型,而是使用字符数组来表示字符串。字符串转整数:atoi, atol, atof(注意:这些函数不检查错误,更安全的用法是strtol, strtod)查找字符:strchr, strrchr(分别查找第一个和最后一个出现的位置)数值转字符串:sprintf(不安全),snprintf(安全)字符串连接:strcat, strncat。求字符串长度:strlen。
2025-10-21 22:07:16
409
原创 C语言需要掌握的基础知识点之数组
当数组作为函数参数传递时,实际上传递的是数组首元素的地址(指针),因此函数内部无法通过sizeof来获取数组长度,通常需要将长度作为另一个参数传递。数组的大小必须是编译时常量(C99之前)或者可以使用变量长度数组(C99标准,但部分编译器可能不支持)。定义:数组是一组相同类型数据的集合,这些数据在内存中连续存储,通过索引(下标)来访问各个元素。例如,对于数组int a[10];数组是C语言中一种非常重要的数据结构,用于存储相同类型元素的集合。如果初始化列表中的元素个数小于数组大小,则剩余元素被初始化为0。
2025-10-21 20:52:51
476
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅