当前位置: 首页 > article >正文

C语言函数笔记5:从基础使用到递归与作用域深度解析

在C语言的学习进阶之路上函数是贯穿程序设计的核心骨架更是实现代码模块化、复用性的关键所在。从基础的函数定义、调用到形参实参的传参机制再到递归算法的灵活运用和变量作用域的精准把控每一个知识点都是构建高效C语言程序的基石。本文将结合C语言函数进阶的学习内容从函数基础使用、传参与返回值、递归算法实现、变量作用域四大维度系统梳理C语言函数的核心知识点与实战技巧同时结合字符串处理、学生成绩管理系统、排序查找算法等经典案例让理论落地实践助力大家吃透C语言函数的精髓。一、函数基础定义、分类与核心优势函数是C语言中实现特定功能的独立代码模块也是C程序的基本组成单元一个完整的C程序必须包含main函数可按需自定义多个功能函数其核心优势体现在代码复用、模块化设计、易维护调试、提升协作效率四个方面让复杂程序的开发和管理更高效。1. 函数的分类从不同维度划分函数有多种类型日常开发中最常用的分类方式如下按来源库函数C标准库提供如printf、fgets、strcmp和自定义函数程序员按需实现如成绩计算、素数判断函数按参数无参函数调用无需传参如菜单展示show_menu()和有参函数调用需传递数据如加法add(int a, int b)按返回值有返回值函数执行后返回结果如get_max(int x, int y)和无返回值函数用void修饰仅执行操作如show_all()按调用关系主调函数主动调用其他函数main函数只能作为主调函数和被调函数被其他函数调用一个函数可同时作为主调与被调函数。2. 函数的定义语法函数的定义由函数头和函数体组成语法规范如下其中函数名需符合C语言标识符规则推荐使用小写下划线的蛇形命名法如get_valid_score增强代码可读性。返回类型 函数名([形参列表]){// 函数体实现具体功能的语句}返回类型规定函数最终输出的数据类型无返回值时必须显式用void形参列表接收主调函数传入的数据多个形参用逗号分隔每个形参必须声明类型无参时可写void或留空函数体包裹在{}中的功能代码{}不可省略函数的核心逻辑在此实现。3. 函数的声明与调用函数调用遵循先定义/声明后使用原则调用格式为函数名(实参列表)无参则传空有参则实参与形参需类型匹配、个数一致、顺序对应函数声明若函数定义在调用之后需提前声明告知编译器函数的返回类型、函数名和形参类型形参名称可省略格式为返回类型 函数名(形参类型列表);如int max(int, int);。核心注意C语言不支持函数的嵌套定义不可在一个函数内定义另一个函数但支持嵌套调用一个函数内调用另一个函数这是实现复杂功能的基础。二、传参与返回值形参实参机制与类型转换函数的传参和返回值是主调与被调函数之间的数据交互桥梁理解其底层机制是避免程序bug的关键核心围绕形参和实参展开同时需注意返回值的类型匹配与隐式/显式转换。1. 形参与实参的核心区别实参主调函数中传递给被调函数的实际数据可是常量、变量、表达式、有返回值的函数调用如func(10)、func(a5)、func(get_max(2,4))形参被调函数中定义的接收数据的变量仅在函数调用时分配内存函数执行结束后立即销毁是实参的临时拷贝。2. 值传递的核心特性C语言默认采用值传递即主调函数将实参的数值拷贝一份给形参形参的值修改不会影响实参因为二者占用不同的内存空间。例如形参n在函数内被修改为20实参n的数值仍保持不变这是传参的核心易错点。3. 函数返回值的类型规则返回值通过return语句实现语法为return 表达式;或return(表达式);无返回值的void函数可写return;一般省略需提前结束函数时显式写出返回类型与实际返回值类型可不同编译器会自动进行隐式类型转换如double类型函数返回int会自动将int提升为doubleint类型函数返回double会舍弃小数部分保留整数若返回类型与实际值类型不兼容如int*函数返回int编译器会直接报错需通过显式类型转换保证匹配。补充C89标准允许省略函数返回类型默认返回intC99/C11后强制要求显式声明main函数必须声明为int类型推荐写法为int main(void)返回0表示程序正常结束。三、经典实战案例函数的综合运用函数的学习离不开实战结合字符串处理、学生成绩管理、数值计算、素数判断等经典场景能更直观地理解函数的使用技巧以下是核心经典案例的知识点梳理1. 字符串处理案例单词统计通过isspace函数判断空格结合标志位word0为空格、1为非空格统计单词数处理连续空格和开头空格的边界情况字符串求最值利用二维字符数组存储多个字符串通过strcmp比较字符串大小、strcpy拷贝最大值核心是字符串库函数的结合使用自定义字符串函数手动实现my_strcpy逐字符拷贝并在目标字符串末尾添加\0保证字符串的合法性理解库函数的底层实现逻辑。2. 学生成绩管理系统模块化实现这是函数模块化设计的经典实战通过多个自定义函数实现添加学生信息、显示信息、计算平均分、查找最高分科目等功能核心知识点用全局数组存储学生学号、姓名、成绩全局变量实现多函数间的数据共享封装功能函数get_valid_score校验成绩合法性0~100、add_student实现信息录入、calc_avg计算指定学生平均分、find_max查找全校最高分主函数通过switch语句结合循环实现菜单的循环选择让程序具备交互性。/************************************************************************ File Name: stu_mgr.c Author: WBF Description: 学生管理系统(不使用结构体) ***********************************************************************/#includestdio.h#includestring.h#defineMAX_STU50//最大学生数量#defineNAME_LEN20//学生姓名最大长度#defineID_LEN8//学生学号最大长度#defineCOURSE_NUM3//课程数量charstu_id[MAX_STU][ID_LEN];//储存所有学生学号charstu_name[MAX_STU][NAME_LEN];//储存所有学生姓名intscores[MAX_STU][COURSE_NUM];// 储存所有学生成绩charcourse_name[COURSE_NUM][NAME_LEN]{语文,数学,英语};intstu_count0;//定义一个全局变量用来记录实际存入的学生数(可以作为全局下标使用)//头部设计voidshow_menu(){printf( 主菜单 \n);printf(|| 1. 添加学生信息 ||\n);printf(|| 2. 显示所有学生信息 ||\n);printf(|| 3. 查询学生平均分 ||\n);printf(|| 4. 查找最高分科目 ||\n);printf(|| 5. 退出系统 ||\n);printf(\n);}//获取用户输入的成绩并验证有效性intget_valid_score(constchar*course){intscore;//创建变量记录输入的成绩do{printf(请输入%s的成绩0~100,course);scanf(%d,score);while(getchar()!\n);if(score0score100)break;printf(请输入0~100的数字。\n);}while(1);}//添加学生的学号和名字信息,和成绩voidadd_stu_info(){if(stu_countMAX_STU){printf(学生信息最多添加%d人目前已满\n,MAX_STU);return;}else{//1.添加学生学号printf(输入学号最多输入%d个字符。,ID_LEN-1);//给\0留一个位置scanf(%7s,stu_id[stu_count]);while(getchar()!\n);//2.添加姓名printf(请输入姓名最多%d位字符,NAME_LEN-1);scanf(%s,stu_name[stu_count]);while(getchar()!\n);//3.添加成绩for(inti0;iCOURSE_NUM;i){//scanf(%d,scores[COURSE_NUM][i]);scores[stu_count][i]get_valid_score(course_name[i]);}stu_count;//添加成功人数1printf(添加成功\n);}}// 显示所有学生信息voidprintf_stu_info(){if(stu_count0){printf(还没有学生信息);return;}printf(--------- 所有学生信息如下 ---------------\n);//三线表格打印输出printf(\n);printf(%s\t%s\t,学号,姓名);for(inti0;iCOURSE_NUM;i)printf(%s\t,course_name[i]);printf(\n----------------------------------\n);// 表格数据for(inti0;istu_count;i){printf(%s\t%s\t,stu_id[i],stu_name[i]);// 取出成绩for(intj0;jCOURSE_NUM;j)printf(%d\t,scores[i][j]);printf(\n);}printf(\n\n);printf(系统统计共%d名学生\n\n,stu_count);}// 计算指定学生的平均分voidcalc_avg(){// 检查系统中是否有学生if(stu_count0){printf(系统提示当前没有学生信息\n);return;}// 创建一个数组存储控制台输入的学号chartarget_id[ID_LEN];printf(请输入要查询的学生学号);scanf(%7s,target_id);// 清空输入缓冲区处理scanf残留的换行符避免后续fgets读取到空行while(getchar()!\n);// 遍历查找学生for(inti0;istu_count;i){// 比较两个字符串是否相等 strcmpif(strcmp(stu_id[i],target_id)0){floatsum0;// 总分// 计算总分for(intj0;jCOURSE_NUM;j)sumscores[i][j];// 显示平均分printf(学生 %s(学号%s)的平均分%.2f\n\n,stu_name[i],stu_id[i],sum/COURSE_NUM);// 提前结束函数return;}}// 如果没有找到学生就提示printf(系统提示未找到学号为 %s 的学生\n\n,target_id);}//查找最高分科目voidfind_max(){// 校验系统中是否有学生if(stu_count0){printf(系统提示当前没有学生信息\n);return;}intmax_score-1;// 最高分intmax_stu_idx-1;// 最高分学生下标intmax_course_idx-1;// 最高分科目下标// 遍历所有学生的所有科目for(inti0;istu_count;i){for(intj0;jCOURSE_NUM;j){// 先找最高分if(scores[i][j]max_score){max_scorescores[i][j];max_stu_idxi;max_course_idxj;}}}// 输出最高分信息printf(\n 系统最高分 \n);printf(学生%s\n,stu_name[max_stu_idx]);printf(学号%s\n,stu_id[max_stu_idx]);printf(科目%s\n,course_name[max_course_idx]);printf(分数%d\n\n,max_score);}//主函数intmain(intargc,char*argv[]){while(1){show_menu();intchoice;//选择主菜单中的功能printf(请输入你想要进行的功能\n);if(scanf(%d,choice)!1||choice0){printf(请输入合法数字根据主菜单提示功能输入数字0~5。\n);continue;}if(choice1){add_stu_info();//添加学生的学号和名字信息continue;}elseif(choice2){printf_stu_info();//显示所有学生信息continue;}elseif(choice3){calc_avg();continue;}elseif(choice4){find_max();continue;}elseif(choice5){printf(感谢你的使用\n);break;}else{printf(请根据主菜单提示功能输入数字0~5。\n);continue;}}return0;}3. 数值计算与判断案例阶乘计算通过函数实现n!的计算使用size_t无符号长整型存储结果避免数值溢出素数判断封装is_prime函数通过2~n/2的整除测试判断素数找到因子立即break减少计算量返回1素数或0非素数数组操作封装index_of函数查找数组元素下标、calc_avg计算数组平均值、compare_num比较两个数组对应元素大小核心是数组传参传递数组首地址需手动传递数组长度。四、递归算法核心思想与经典实现递归是函数进阶的重点指函数自身调用自身是实现分治算法的重要手段其核心是将复杂问题拆解为规模更小的同类问题直到拆解为递归出口终止条件避免无限递归导致栈溢出Stack Overflow。1. 递归的分类与核心要求直接递归函数直接调用自身推荐逻辑清晰如fac(n) n * fac(n-1)间接递归函数通过其他函数间接调用自身慎用易出错如a()→b()→a()。实现递归的两个必要条件存在递归出口即终止条件避免无限递归问题规模可逐步缩小且缩小后的问题与原问题为同类问题。2. 递归的底层逻辑函数调用时会在栈区创建栈帧专属内存空间存储参数、局部变量、返回地址递归调用时会依次创建多个栈帧入栈直到触发递归出口再从最后一个栈帧开始依次出栈计算销毁栈帧最终将结果返回给主调函数。例如计算3!栈帧入栈顺序为fac(3)→fac(2)→fac(1)出栈计算顺序为fac(1)→fac(2)→fac(3)。3. 经典递归案例实现年龄计算5人相邻年龄差2岁第1人10岁求第n人年龄递归公式age(n) age(n-1) 2出口age(1) 10阶乘计算递归公式fac(n) n * fac(n-1)出口fac(0)1、fac(1)1兼顾0的阶乘的特殊情况快速排序分治思想的经典应用以基准值将数组分区为“小于基准”和“大于基准”两部分递归排序左右子数组出口为数组长度≤1本身有序二分查找仅适用于有序数组每次将查找范围缩小一半递归公式为“目标大于中间值则查右半区否则查左半区”出口为left right未找到或找到目标元素。五、变量的作用域全局变量与局部变量变量的作用域决定了其可访问的范围与函数结合紧密核心分为全局变量和局部变量二者的存储位置、生命周期、访问规则差异显著也是程序设计中需要精准把控的知识点。1. 全局变量定义在所有函数外部定义的变量存储在数据段/BSS段程序运行前分配内存全程占用内存直到程序结束销毁访问规则可被整个程序的所有函数访问定义在函数后的全局变量需提前声明才能被访问优缺点减少函数参数传递简化多函数数据共享但全程占用内存过多使用会导致逻辑混乱违反高内聚、低耦合的程序设计原则建议尽量少用。2. 局部变量定义在函数内部、形参、复合语句如for/if内定义的变量存储在栈帧中仅在其作用域内有效超出作用域立即销毁类型形参、函数内变量、循环/分支内的块作用域变量其中块作用域变量仅在所在{}内可访问访问规则仅在其定义的作用域内可访问作用域嵌套时内层变量会覆盖外层变量。3. 同名变量的访问原则若全局变量与局部变量同名遵循就近原则——优先访问作用域更小的变量即块作用域变量覆盖函数内局部变量函数内局部变量覆盖全局变量。例如全局变量a10main函数内定义a20则main函数内访问的a为20循环内再定义a0则循环内访问的a为0。六、核心总结与学习建议函数是C语言模块化设计的核心嵌套调用合法嵌套定义非法开发中需将单一功能封装为独立函数提升代码复用性和可维护性值传递是C语言默认传参方式形参是实参的临时拷贝修改形参不影响实参数组传参本质是传递首地址需手动传递数组长度递归的核心是找出口、拆问题实现时必须保证终止条件避免栈溢出递归虽逻辑简洁但数组超长时效率不如迭代需按需选择变量作用域需精准把控尽量少用全局变量函数间数据交互优先通过“实参形参返回值”实现遵循高内聚、低耦合的设计原则函数的学习关键在实战结合字符串处理、数组操作、排序查找、系统开发等案例多写多练理解库函数的底层实现能手动实现经典函数如my_strcpy、my_strlen才能真正吃透函数的精髓。C语言的函数进阶不仅是知识点的积累更是程序设计思维的提升——从面向过程的代码编写到模块化、工程化的程序设计函数始终是核心载体。掌握以上知识点结合实战不断打磨就能灵活运用函数构建高效、可维护的C语言程序为后续指针、结构体、文件操作等进阶知识点的学习打下坚实基础。

相关文章:

C语言函数笔记5:从基础使用到递归与作用域深度解析

在C语言的学习进阶之路上,函数是贯穿程序设计的核心骨架,更是实现代码模块化、复用性的关键所在。从基础的函数定义、调用,到形参实参的传参机制,再到递归算法的灵活运用和变量作用域的精准把控,每一个知识点都是构建高…...

【从零开始学Java | 第三十二篇】方法引用(Method Reference)

目录 前言 一、什么是方法引用? 1.引例 2.方法引用的语法 二、方法引用的分类 1.引用静态方法 2.引用成员方法 ①其他类:其他类对象::方法名 3.引用构造方法 4.使用类名引用成员方法 5.引用数组的构造方法 总结 前言 在 Java 8 引入 Lambda 表…...

Matlab:势能法-编写的关于直齿轮时变啮合刚度求解模型程序(齿间摩檫力也有考虑进去)

Matlab:势能法-编写的关于直齿轮时变啮合刚度求解模型程序(齿间摩檫力也有考虑进去),根据周期变化计算得到整个啮合过程的综合刚度啮合曲线,并得到拟合公式,以便在建立动力学方程的时候方便使用! 内含详细…...

别再折腾PPT了!用VSCode + Marp插件,5分钟搞定一份高颜值Markdown幻灯片

用VSCode和Marp打造极简主义幻灯片:开发者首选的高效演示方案 在技术分享、教学演示或项目汇报的场景中,我们常常陷入一个两难困境:既希望保持内容的专业性和技术感,又不想在幻灯片设计上耗费过多时间。传统PPT软件虽然功能强大&a…...

Maxwell电机多目标尺寸优化:基于Ansys Maxwell与OptiSlang的内嵌式永...

Maxwell电机多目标尺寸优化 Ansys Maxwell 和OptiSlang 有案例电机,永磁同步电机内嵌式 满足电机多尺寸参数入手,满足多尺寸联动优化,最终达到多参数优化效果 提供源文件,提供操作视频概述 本文档旨在详细阐述一套基于 Ansys Maxw…...

Google 迎来「DeepSeek 时刻」:TurboQuant算法实现bit无损、×加速、×压缩、零预处理叭

从 UI 工程师到 AI 应用架构者 13 年前,我的工作是让按钮在 IE6 上对齐; 13 年后,我用 fetch-event-source 订阅大模型的“思维流”,用 OCR 解锁图片中的文字——前端,正在成为 AI 产品的第一道体验防线。 最近&#x…...

大模型的前生今世(二)

自注意力机制 序列:在深度学习中一般为带有时间先后顺序(拥有逻辑结构)的一段具有连续关系的数据(文本,语音等等) 注意力机制: 模拟人类视觉系统的聚焦能力,让模型能够在处理复杂…...

大卫小东(Sheldon)媳

Issue 概述 先来看看提交这个 Issue 的作者是为什么想到这个点子的,以及他初步的核心设计概念。?? 本 PR 实现了 Apache Gravitino 与 SeaTunnel 的集成,将其作为非关系型连接器的外部元数据服务。通过 Gravitino 的 REST API 自动获取表结构和元数据&…...

比特币白皮书解读:一种点对点的电子现金系统

比特币白皮书解读:一种点对点的电子现金系统 2008年,一个名为中本聪的神秘人物发布了一篇题为《比特币:一种点对点的电子现金系统》的白皮书,彻底改变了人类对货币和金融体系的认知。这篇白皮书不仅提出了一种去中心化的数字货币…...

集成AI 的 Redis 客户端 Rudist发布新版了谔

Qt是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本笔记将重点介绍QSpinBox数值微调组件的常用方法及灵活应用。…...

高级java每日一道面试题-2025年10月14日-团队协作篇[LangChain4j]-如何设计代码审查标准?

设计代码审查标准 在大型项目尤其是使用 LangChain4j 构建 AI 应用的场景中,代码审查(Code Review)不仅是保证代码质量的手段,更是知识传递、规范落地和风险控制的关键环节。设计一套科学、可执行的代码审查标准,需要从…...

AI原生大数据架构迁移避坑指南(含奇点大会实测的6类典型失败场景、ROI测算模板与12周渐进式演进路线图)

第一章:AI原生大数据架构迁移避坑指南总览 2026奇点智能技术大会(https://ml-summit.org) AI原生大数据架构迁移不是简单的组件替换,而是数据范式、计算语义与工程治理的系统性重构。传统ETL流水线在面对LLM微调数据准备、向量实时索引、多模态特征联合…...

如何用Python实现剪映自动化:告别重复剪辑的3步解决方案

如何用Python实现剪映自动化:告别重复剪辑的3步解决方案 【免费下载链接】JianYingApi Third Party JianYing Api. 第三方剪映Api 项目地址: https://gitcode.com/gh_mirrors/ji/JianYingApi 还在为每天重复的视频剪辑工作感到疲惫吗?想象一下&am…...

前端工程化的构建流程优化

前端工程化的构建流程优化 随着前端项目规模的不断扩大,构建流程的优化成为提升开发效率和性能的关键。前端工程化通过自动化工具和标准化流程,帮助开发者更高效地管理代码、资源和部署。随着项目复杂度增加,构建速度慢、打包体积过大等问题…...

终极指南:使用smcFanControl让您的Intel Mac保持凉爽高效

终极指南:使用smcFanControl让您的Intel Mac保持凉爽高效 【免费下载链接】smcFanControl Control the fans of every Intel Mac to make it run cooler 项目地址: https://gitcode.com/gh_mirrors/smc/smcFanControl 当您的Intel MacBook在运行大型应用时变…...

FLuke15B+与Fluke17B+的维修案例,适合硬件工 FLuke15B+与Fluke17B+的维修案例,适合硬件工程师。 包括15b、17b万用表原理图,电表开机无任何显示维修方法

FLuke15B与Fluke17B的维修案例,适合硬件工 FLuke15B与Fluke17B的维修案例,适合硬件工程师。 包括15b、17b万用表原理图,电表开机无任何显示维修方法,直流电压挡无法测量故障维修方法,交流档不能测量故障维修方法&#…...

仅限奇点大会注册开发者获取:LLM生产环境诊断工具包(含自动检测脚本+拓扑分析器+成本优化计算器)

第一章:2026奇点智能技术大会:LLM生产环境部署指南 2026奇点智能技术大会(https://ml-summit.org) 在真实生产环境中部署大语言模型,需兼顾推理延迟、显存效率、服务稳定性与安全合规性。2026奇点智能技术大会现场实测表明,超过7…...

从单体LLM API到生产级AI网格:一位CTO带队完成迁移的6周攻坚日志,含全部YAML配置模板

第一章:AI原生软件研发服务网格实践指南 2026奇点智能技术大会(https://ml-summit.org) AI原生软件不再仅是“运行AI模型的应用”,而是将模型推理、数据闭环、特征演化、可观测性与策略编排深度内嵌于服务生命周期中的系统级范式。服务网格作为云原生基…...

哥本哈士奇(aspnetx)固

简介 langchain中提供的chain链组件,能够帮助我门快速的实现各个组件的流水线式的调用,和模型的问答 Chain链的组成 根据查阅的资料,langchain的chain链结构如下: $$Input \rightarrow Prompt \rightarrow Model \rightarrow …...

别再让IDEA偷偷帮你import *了!手把手教你关闭Java代码的自动星号导入

彻底告别IDEA的星号导入:优化Java项目性能的隐藏技巧 你是否曾经在代码审查时,突然发现某个类里出现了import java.util.*这样的星号导入?或者更糟糕的是,在项目上线后才发现Jar包体积异常膨胀,经过一番排查才发现是星…...

AI日志平台建设不是工具选型,而是数据契约重构:一份被头部大厂封存3年的《日志Schema治理黄金12条》首次公开

第一章:AI原生软件研发日志分析平台建设 2026奇点智能技术大会(https://ml-summit.org) AI原生软件研发过程中,日志不再是被动记录的副产品,而是具备语义理解能力、可主动推理与反馈的核心数据资产。传统ELK栈难以应对高噪声、多模态、强上下…...

一物一码系统怎么搭建?从0到1的完整实施路径与避坑指南

在数字化转型浪潮中,一物一码已从"锦上添花"变为企业基础设施。但市面上方案繁杂,企业自建常陷入"技术选型迷茫"和"业务落地困难"。本文基于顶讯科技一物一码平台的底层架构逻辑,拆解系统搭建的完整路径&#…...

梅德生物技术快报|重组蛋白纯化工程化实现:Amuc_0119 蛋白 Ni‑NTA 亲和层析全参数方案

这里是卡梅德生物技术快报,本文面向生物工程、蛋白研发工程师,提供 Akk 菌 Amuc_0119重组蛋白纯化的完整工程化方案,包含实验参数、缓冲液体系、质控方法,可直接复现。在微生物功能蛋白研发中,重组蛋白纯化是决定蛋白质…...

Graphormer开源模型部署手册:Supervisor开机自启+日志监控全配置

Graphormer开源模型部署手册:Supervisor开机自启日志监控全配置 1. 模型概述 Graphormer是由微软研究院开发的纯Transformer架构图神经网络模型,专门用于分子属性预测任务。该模型通过创新的分子图表示方法,在OGB、PCQM4M等分子基准测试中大…...

大模型概述1

一个中文字符大约0.6个token,一个英文单词一般0.3个token,不同的大模型有自己不同的tokenize。令牌化的方法。FLOPs:算力的参数,多少此浮点型运算大模型分类:分类方式一:多模态的,多种形态的模型…...

汉鼎建设:用技术解码高端制造的“洁净密码”

在东莞这座“世界工厂”,从精密电子到新能源电池,无数高端制造企业的生产线,都藏在一个个“比手术室还干净”的净化车间里。而广东汉鼎建设集团,正是这些车间背后的“隐形建造者”——作为总部位于东莞东城、拥有装修与机电双一级…...

Cisco 18系列AP通过u-boot实现tftp镜像启动的详细步骤解析

1. 理解Cisco 18系列AP的u-boot启动机制 当你拿到一台Cisco 18系列AP设备时,可能会遇到需要从网络加载镜像进行启动的情况。这就像我们电脑坏了需要从U盘重装系统一样,只不过这里用的是tftp协议通过网络来传输系统镜像。u-boot就是这个过程中的关键角色&…...

从零到一:手把手教你用Labelme打造专属Mask数据集

1. 为什么你需要掌握Labelme标注工具 如果你正在做计算机视觉相关的项目,尤其是图像分割任务,那么高质量的数据集就是你的命根子。市面上现成的数据集往往无法完全匹配你的业务需求,这时候自己动手标注数据就成了必经之路。我刚开始接触图像分…...

LeetCode 热题 100 精讲 | 动态规划进阶篇:最大子数组和 · 分割等和子集 · 最长公共子序列 · 打家劫舍 III

一、53. 最大子数组和 🔗 题目链接 LeetCode 53. 最大子数组和 📝 题目描述 给你一个整数数组 nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输…...

保姆级教程:基于ROS Melodic和MoveIt!,手把手搭建双RM65机械臂协同控制系统

基于ROS Melodic和MoveIt!的双RM65机械臂协同控制系统实战指南 在工业自动化与智能制造领域,双机械臂协同作业正成为提升生产效率的关键技术。想象一下,两台机械臂如同默契的舞者,在装配线上精准配合,完成单台设备难以企及的复杂任…...