C#初级教程(6)——函数:从基础到实践
一、函数的核心价值:简化与复用代码
以游戏开发项目为例,在游戏中,角色的移动、攻击等行为并非只在单一场景中出现。设想一下,若每次需要角色执行这些行为时,都要重新编写对应的代码,那将是何等繁琐且易错的工作。通过将这些行为封装成函数,我们只需编写一次,然后在不同场景中按需调用即可。这不仅避免了代码的重复编写,还显著提升了开发效率,让代码结构更加简洁明了,易于维护和扩展。
二、函数的基础构建:定义与调用
(一)函数定义的基础结构
在 C# 的控制台应用程序中,函数的定义遵循特定的形式:
static <returnType> <FunctionName>(<parameterList>)
{// 函数体代码return <returnValue>;
}
在这里,<returnType> 明确了函数返回值的类型。若函数无需返回值,可将其指定为 void。<FunctionName> 则是函数的名称,在命名时需严格遵循 C# 的命名规范,以确保代码的可读性和规范性。<parameterList> 为参数列表,它可以为空,也可以包含一个或多个参数。而 <returnValue> 必须与 <returnType> 的类型保持一致,用于将函数的计算结果返回给调用者。
下面是一个简单的无参数、无返回值的函数定义示例:
static void PrintMessage()
{Console.WriteLine("欢迎来到C#函数的世界!");
}
在这个例子中,PrintMessage 函数没有接收任何参数,也不返回任何值,其功能仅仅是在控制台输出一条欢迎信息。
(二)函数的调用
一旦函数定义完成,就可以在其他函数中进行调用。通常,我们会在 Main 函数中调用其他函数,以启动程序的执行流程。以下是在 Main 函数中调用 PrintMessage 函数的示例:
static void Main()
{PrintMessage();
}
当程序执行到 PrintMessage(); 这一行时,会跳转到 PrintMessage 函数的定义处,执行函数体中的代码,即输出欢迎信息,然后再返回 Main 函数继续执行后续代码。
(三)带参数和返回值的函数
函数的强大之处在于它能够通过参数接收外部传递的数据,并通过返回值将处理结果反馈回去。例如,下面是一个用于计算两个整数之和的函数:
static int AddNumbers(int num1, int num2)
{return num1 + num2;
}
在这个函数中,num1 和 num2 是两个整数类型的参数,函数体将这两个参数相加,并通过 return 语句返回计算结果。
在 Main 函数中调用该函数的示例如下:
static void Main()
{int result = AddNumbers(3, 5);Console.WriteLine("两数之和为:" + result);
}
在上述代码中,首先调用 AddNumbers 函数,将 3 和 5 作为参数传递进去,函数计算得到结果 8,然后将结果赋值给 result 变量,最后在控制台输出两数之和。
三、参数的灵活运用:从固定参数到参数数组
(一)固定参数
函数的固定参数在定义时,其数量和类型都是明确且固定的。例如,在计算圆面积的函数中,我们需要接收圆的半径作为参数,以进行面积的计算。以下是该函数的定义:
static double CalculateCircleArea(double radius)
{return Math.PI * radius * radius;
}
在这个函数中,radius 是一个 double 类型的固定参数,用于表示圆的半径。函数通过 Math.PI 常量和传入的半径值,按照圆面积公式计算并返回圆的面积。
(二)参数数组
当函数需要处理数量不确定的参数时,参数数组就派上了用场。在 C# 中,参数数组通过 params 关键字来定义,并且它只能出现在参数列表的最后一个位置。
例如,我们可以定义一个计算多个整数之和的函数:
static int SumNumbers(params int[] numbers)
{int sum = 0;foreach (int num in numbers){sum += num;}return sum;
}
在这个函数中,params int[] numbers 表示这是一个参数数组,它可以接收任意数量的整数参数。在函数体内部,通过 foreach 循环遍历参数数组,将每个元素累加到 sum 变量中,最后返回累加的结果。
调用该函数时,我们可以非常灵活地传递任意多个整数参数,如下所示:
static void Main()
{int total = SumNumbers(1, 2, 3, 4, 5);Console.WriteLine("多个数之和为:" + total);
}
在上述代码中,我们向 SumNumbers 函数传递了 5 个整数参数,函数会正确地计算它们的和并返回。
四、函数在结构体中的应用:增强数据与行为的关联性
在 C# 中,结构体是一种用户自定义的数据类型。在结构体中定义函数,能够将数据和与之相关的操作紧密地结合在一起,从而增强代码的内聚性和可读性。
以表示学生信息的结构体为例:
struct Student
{public string Name;public int Age;public string GetStudentInfo(){return "姓名:" + Name + ",年龄:" + Age;}
}
在这个结构体中,我们定义了两个字段 Name 和 Age,用于存储学生的姓名和年龄信息。同时,还定义了一个 GetStudentInfo 函数,该函数用于返回包含学生姓名和年龄的字符串信息。
在 Main 函数中使用该结构体和其内部函数的示例如下:
static void Main()
{Student student = new Student { Name = "张三", Age = 20 };string info = student.GetStudentInfo();Console.WriteLine(info);
}
在上述代码中,首先创建了一个 Student 结构体的实例 student,并为其 Name 和 Age 字段赋值。然后调用 student 的 GetStudentInfo 函数,获取学生信息字符串,并在控制台输出。
五、函数重载:提升代码的适应性
函数重载是 C# 中一个非常实用的特性,它允许我们在同一个作用域内定义多个具有相同名称的函数,但这些函数的参数列表必须不同(参数个数、类型或顺序不同)。编译器会根据调用函数时传递的实际参数的类型和个数,自动确定应该调用哪个函数。
例如,我们可以针对求两个数最大值的需求,针对不同数据类型进行函数重载:
static int Max(int num1, int num2)
{return num1 > num2? num1 : num2;
}static double Max(double num1, double num2)
{return num1 > num2? num1 : num2;
}
在上述代码中,我们定义了两个名为 Max 的函数,一个用于比较两个整数的大小并返回较大值,另一个用于比较两个双精度浮点数的大小并返回较大值。
在 Main 函数中调用不同版本的 Max 函数的示例如下:
static void Main()
{int intResult = Max(5, 8);double doubleResult = Max(3.5, 7.2);Console.WriteLine("整数最大值:" + intResult);Console.WriteLine("双精度浮点数最大值:" + doubleResult);
}
在这个例子中,根据传递给 Max 函数的参数类型,编译器会准确地调用相应版本的函数,从而实现对不同数据类型的最大值求解。
六、委托:动态调用函数的强大工具
委托是 C# 中一种非常强大的类型,它的作用是存储函数的引用。通过委托,我们可以实现函数的动态调用,这为代码的编写带来了极大的灵活性。
首先,我们需要定义一个委托类型,它定义了返回类型和参数列表。例如:
delegate int MathOperation(int num1, int num2);
在这个例子中,MathOperation 是一个委托类型,它表示可以引用一个接收两个 int 类型参数,并返回一个 int 类型结果的函数。
接下来,我们定义两个符合该委托定义的函数:
static int Add(int num1, int num2)
{return num1 + num2;
}static int Subtract(int num1, int num2)
{return num1 - num2;
}
在 Main 函数中使用委托的示例如下:
static void Main()
{MathOperation operation;operation = Add;int result1 = operation(5, 3);operation = Subtract;int result2 = operation(5, 3);Console.WriteLine("加法结果:" + result1);Console.WriteLine("减法结果:" + result2);
}
在上述代码中,首先声明了一个 MathOperation 类型的变量 operation。然后将 operation 指向 Add 函数,通过 operation 调用 Add 函数并传递参数 5 和 3,得到加法运算的结果。接着,将 operation 重新指向 Subtract 函数,再次调用 operation 并传递相同参数,得到减法运算的结果。通过这种方式,我们实现了根据程序运行时的逻辑动态选择调用不同函数的功能。
七、函数相关的进阶知识拓展
(一)Lambda 表达式与匿名函数
Lambda 表达式是 C# 中的一种匿名函数,它提供了一种简洁的方式来定义可作为参数传递或存储在变量中的代码块。Lambda 表达式可以极大地简化代码编写,尤其是在处理一些简单的函数逻辑时。
例如,我们可以使用 Lambda 表达式来实现两个整数相加的功能,如下所示:
MathOperation addLambda = (num1, num2) => num1 + num2;
int lambdaResult = addLambda(4, 6);
Console.WriteLine("Lambda表达式计算结果:" + lambdaResult);
在上述代码中,(num1, num2) => num1 + num2 就是一个 Lambda 表达式,它定义了一个接收两个整数参数并返回它们之和的函数。通过将这个 Lambda 表达式赋值给 addLambda 变量(addLambda 是 MathOperation 委托类型的变量),我们可以像调用普通函数一样调用它,从而得到计算结果。
(二)递归函数
递归函数是一种在函数内部调用自身的函数。递归函数常用于解决那些可以分解为相似子问题的场景,通过不断地调用自身来逐步解决问题,直到满足某个终止条件。
以计算阶乘为例,我们可以使用递归函数来实现:
static int Factorial(int n)
{if (n == 0 || n == 1){return 1;}else{return n * Factorial(n - 1);}
}
在这个递归函数中,当 n 为 0 或 1 时,函数返回 1,这是递归的终止条件。否则,函数会将 n 与 Factorial(n - 1) 的结果相乘并返回,其中 Factorial(n - 1) 就是对自身的递归调用,通过不断地减小 n 的值,最终达到终止条件。
在 Main 函数中调用递归函数的示例如下:
static void Main()
{int factorialResult = Factorial(5);Console.WriteLine("5的阶乘为:" + factorialResult);
}
在上述代码中,调用 Factorial(5) 时,函数会按照递归逻辑逐步计算,最终返回 5 的阶乘结果。
八. 题目
1. 选择题改编及 C# 解析
在以下给出的常量形式里,不属于字符常量的是哪一项呢?请仔细判断后选择正确答案。
A. '\t'
B. "A"
C. 'Z'
class Program
{static void Main(){// 分析每个选项// 选项A '\t' 是转义字符,属于字符常量// 选项B "A" 是用双引号括起来的,这是字符串常量,不是字符常量// 选项C 'Z' 是用单引号括起来的单个字符,属于字符常量Console.WriteLine("答案选B,因为只有 \"A\" 是字符串常量,不是字符常量。");}
}
2. 递归函数求 f(n) 改编及 C# 解析
已知有这样一个数列,其递推关系为 f(n) = f(n - 1) + f(n - 2),并且初始条件为 f(0) = 2,f(1) = 3。请编写程序计算出 f(40) 的值。
class Program
{static void Main(){int n = 40;int[] f = new int[n + 1];f[0] = 2;f[1] = 3;for (int i = 2; i <= n; i++){f[i] = f[i - 1] + f[i - 2];}Console.WriteLine($"f(40) 的值为: {f[n]}");}
}
3. 正整数分解质因数改编及 C# 解析
请编写一个程序,让用户可以多次输入正整数,程序会将输入的正整数分解为质因数相乘的形式并输出。例如,当用户输入 90 时,程序应打印出 90 = 2 * 3 * 3 * 5。
using System;class Program
{static void Main(){while (true){Console.Write("请输入一个正整数(输入 0 退出): ");int num = int.Parse(Console.ReadLine());if (num == 0) break;Console.Write($"{num} = ");int divisor = 2;bool firstFactor = true;while (num > 1){if (num % divisor == 0){if (!firstFactor) Console.Write(" * ");Console.Write(divisor);num /= divisor;firstFactor = false;}else{divisor++;}}Console.WriteLine();}}
}
4. 求最大公约数和最小公倍数改编及 C# 解析
编写一个程序,让用户输入两个正整数 m 和 n,程序会计算并输出这两个数的最大公约数和最小公倍数。
using System;class Program
{static int GCD(int a, int b){while (b != 0){int temp = b;b = a % b;a = temp;}return a;}static int LCM(int a, int b){return a * b / GCD(a, b);}static void Main(){Console.Write("请输入第一个正整数 m: ");int m = int.Parse(Console.ReadLine());Console.Write("请输入第二个正整数 n: ");int n = int.Parse(Console.ReadLine());int gcd = GCD(m, n);int lcm = LCM(m, n);Console.WriteLine($"最大公约数是: {gcd}");Console.WriteLine($"最小公倍数是: {lcm}");}
}
5. 小球反弹问题改编及 C# 解析
有一个小球从 100 米的高度自由落下,每次落地后会反弹回原高度的一半,然后再落下。请编写程序计算小球在第 10 次落地时,总共经过了多少米,以及第 10 次反弹的高度是多少。
using System;class Program
{static void Main(){double height = 100;double totalDistance = 100;for (int i = 1; i < 10; i++){height /= 2;totalDistance += 2 * height;}height /= 2;Console.WriteLine($"第 10 次落地时共经过: {totalDistance} 米");Console.WriteLine($"第 10 次反弹高度: {height} 米");}
}
6. 求阶乘和改编及 C# 解析
编写一个程序,计算 1 + 2! + 3! + ... + 20! 的和。
using System;class Program
{static long Factorial(int n){long result = 1;for (int i = 2; i <= n; i++){result *= i;}return result;}static void Main(){long sum = 0;for (int i = 1; i <= 20; i++){sum += Factorial(i);}Console.WriteLine($"1 + 2! + 3! + ... + 20! 的和为: {sum}");}
}
7. 递归求阶乘改编及 C# 解析
使用递归的方法编写一个程序,计算 5 的阶乘。已知阶乘的递归公式为 f(n) = n * f(n - 1)。
using System;class Program
{static int Factorial(int n){if (n == 0 || n == 1){return 1;}return n * Factorial(n - 1);}static void Main(){int result = Factorial(5);Console.WriteLine($"5 的阶乘是: {result}");}
}
8. 定义结构体并赋值输出改编及 C# 解析
编写一个程序,定义一个名为 Student 的结构体,该结构体包含学号、姓名、性别和程序设计成绩四个字段。声明该结构体类型的变量,使用赋值语句对其进行赋值,然后将这些信息输出。
using System;struct Student
{public int StudentID;public string Name;public char Gender;public double ProgrammingScore;
}class Program
{static void Main(){Student student;student.StudentID = 101;student.Name = "张三";student.Gender = '男';student.ProgrammingScore = 85.5;Console.WriteLine($"学号: {student.StudentID}");Console.WriteLine($"姓名: {student.Name}");Console.WriteLine($"性别: {student.Gender}");Console.WriteLine($"程序设计成绩: {student.ProgrammingScore}");}
}
9. 四舍五入运算改编及 C# 解析
编写一个程序,让用户输入一个正数,程序会对该数进行四舍五入到个位数的运算,并输出结果。例如,输入 12.56 会得到 13,输入 12.46 会得到 12。
using System;class Program
{static void Main(){Console.Write("请输入一个正数: ");double num = double.Parse(Console.ReadLine());int result = (int)Math.Round(num, 0);Console.WriteLine($"四舍五入后的结果是: {result}");}
}
10. 求满足关系式的 k 的最大值改编及 C# 解析
已知关系式 1*1 + 2*2 + 3*3 + ... + k*k < 2000,编写一个程序,求出满足此关系式的 k 的最大值。
using System;class Program
{static void Main(){int k = 0;int sum = 0;while (sum < 2000){k++;sum += k * k;}Console.WriteLine($"满足关系式的 k 的最大值是: {k - 1}");}
}
11. 百钱买百鸡问题改编及 C# 解析
某人有 100 元钱,打算去买 100 只鸡。已知公鸡 5 元钱一只,母鸡 3 元钱一只,小鸡一元钱 3 只。请编写程序找出所有可能的购买方案,并将其打印出来。
using System;class Program
{static void Main(){Console.WriteLine("可能的购买方案如下:");for (int rooster = 0; rooster <= 20; rooster++){for (int hen = 0; hen <= 33; hen++){int chick = 100 - rooster - hen;if (chick % 3 == 0 && rooster * 5 + hen * 3 + chick / 3 == 100){Console.WriteLine($"公鸡: {rooster} 只, 母鸡: {hen} 只, 小鸡: {chick} 只");}}}}
}
九.结语
C# 函数在编程中占据着不可或缺的重要地位。从基础的定义和调用,到参数的灵活运用、函数重载以及委托等高级特性,再到 Lambda 表达式和递归函数等进阶知识,每一个环节都蕴含着强大的功能和无限的可能性。希望通过本文的详细讲解,能够帮助大家对 C# 函数有更深入、更全面的理解和掌握,从而在编程实践中能够灵活运用这些知识,编写出更加高效、更具扩展性的优质代码。无论是开发小型应用程序,还是构建大型复杂系统,对 C# 函数的精通都将成为开发者的得力武器。
相关文章:
C#初级教程(6)——函数:从基础到实践
一、函数的核心价值:简化与复用代码 以游戏开发项目为例,在游戏中,角色的移动、攻击等行为并非只在单一场景中出现。设想一下,若每次需要角色执行这些行为时,都要重新编写对应的代码,那将是何等繁琐且易错的…...
【Bluedroid】AVRCP 连接源码分析(一)
一、AVRCP协议简介 AVRCP(Audio/Video Remote Control Profile)是蓝牙协议栈中的一个重要部分,它定义了蓝牙设备之间的音视频传输控制的流程和特点。AVRCP使得用户可以通过一个蓝牙设备(如手机)远程控制另一个蓝牙设备(如蓝牙耳机或音箱)上的音视频播放,如播放、暂停、…...
编程考古-忘掉它,Delphi 8 for the Microsoft .NET Framework
忘掉它吧,作一篇记录! 【圣何塞,加利福尼亚 – 2003年11月3日】在今日的Borland开发者大会上,Borland正式推出了Delphi 8 for Microsoft .NET Framework。这款新版本旨在为Delphi开发者提供一个无缝迁移路径,将现有的…...
Linux-Ansible基础模块
文章目录 模块Command模块Shell模块Script模块 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2025年02月22日19点21分 模块 Command模块 Command模块实践 ansible 192.168.1.100 -m com…...
正则表达式–断言
原文地址:正则表达式–断言 – 无敌牛 欢迎参观我的个人博客:正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...):正向预查(positive lookahead),表示某个字符串后面应该跟着什么。但这个字符串本身…...
Swiper插件的运用和学习
Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 Swiper 是目前最流行的免费开源轮播组件之一,它功能强大、高度可定制且兼容性好,支持移动端手势操作和丰富的交互动画。 下载Swiper压缩包 轮播图演示页面。可以看见各种不同切换效果的轮播图 然后解压…...
标准I/O与文件I/O
一、概念 标准IO:标准IO是指程序与标准输入(stdin)、标准输出(stdout)和标准错误(stderr)之间的输入输出操作。通常用于与用户交互或输出调试信息。文件IO:文件IO是指程序与文件系统…...
JavaScript函数-函数的参数
在JavaScript编程语言中,函数是组织代码和实现复杂逻辑的基本单元。而函数参数则是这些功能的重要组成部分,它们允许我们将数据传递给函数,从而使得函数更加通用和灵活。本文将深入探讨JavaScript函数参数的各种特性及其最佳实践。 参数基础…...
Android TabLayout 实现随意控制item之间的间距
效果 红色标注是不同的间距。 实现方式 1、xml中定义 <com.google.android.material.tabs.TabLayoutandroid:id"id/tab_layout"android:layout_width"wrap_content"app:tabIndicatorColor"color/color_FF00B2E3"app:tabBackground"a…...
STM32的“Unique device ID“能否修改?
STM32F1系列的"Unique device ID"寄存器的地址为0x1FFFF7E8。 这个寄存器是只读的。 "Unique device ID"寄存器位于“System memory”中。“System memory”地址范围为“0x1FFF F000- 0x1FFF F7FF”。 所有STM32 MCU上都存在系统引导加载程序。顾名思义&a…...
STM32-温湿度上传OneNET项目
一、项目需求 使用 ESP8266 连接 OneNET 云平台,并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、DHT11工作原理 参考于良许嵌入式手把手教你玩转DHT11(原理驱动) | 良许嵌入式 3.1 正常工作验证 # 上电后ÿ…...
前端面试-JavaScript 数据类型详解
目录 一、数据类型分类 二、核心区别对比 1. 存储方式 2. 比较方式 3. 类型检测方法 三、特殊类型详解 1. Symbol 2. BigInt 3. null vs undefined 四、常见面试扩展问题 五、总结 一、数据类型分类 JavaScript 数据类型分为 基本数据类型(原始类型&…...
【进程 】
【进程】 目录1. ELF格式程序与进程2. 进程的组织方式3. 进程的复刻(fork)4. 进程的状态 目录 1. ELF格式程序与进程 在Linux系统里,程序文件普遍采用ELF(Executable and Linkable Format)格式。这种格式的程序文件存…...
深入HBase——数据结构与算法
引入 通过前面的文章,我们对HBase已经有了基本认识,下面我们从HBase最核心的算法和数据结构进一步深入HBase。 HBase的一个列簇(Column Family)本质上就是一棵LSM树(Log-Structured Merge-Tree)。LSM树…...
Python爬虫实战:获取六图网漫画图
注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 一、引言 Python 作为一种广泛应用于数据处理和网络爬虫领域的编程语言,拥有丰富的库和框架。其中,Scrapy 框架以其高效、灵活、可扩展等特点,成为构建爬虫程序的…...
HAProxy介绍与编译安装
目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…...
全链路优化:如何让单点登录认证接口并发性能翻倍?
背景 最近针对一个单点登录认证项目进行性能优化,在 8核 16G 环境下的认证并发能力从每秒800次提升至每秒1600次,性能提升一倍,整理此次优化过程中的相关性能优化操作总结和大家分享一下。 Nginx配置优化 在并发认证场景下,Ngi…...
在Spring Boot中如何使用Freemaker模板引擎
在 Spring Boot 中使用 FreeMarker 模板引擎可以帮助你创建动态的 Web 页面。以下是详细的步骤和示例代码,介绍如何在 Spring Boot 项目里集成和使用 FreeMarker。 1. 添加依赖 如果你使用的是 Maven 项目,需要在 pom.xml 文件中添加 FreeMarker 相关依赖。Spring Boot 提供…...
Elasticsearch7.1.1 配置密码和SSL证书
生成SSL证书 ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass 我这里没有设置ssl证书密码,如果需要设置密码,需要再配置给elasticsearch 在之前的步骤中,如果我们对elastic-certificates.p12 文件配置了密码…...
个人简历html网页模板,科技感炫酷html简历模板
炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…...
BilibiliDown音频提取技术解析:从多格式流到无损音质的实现路径
BilibiliDown音频提取技术解析:从多格式流到无损音质的实现路径 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_…...
终极指南:三小时从零掌握 llama-cpp-python 大模型本地部署
终极指南:三小时从零掌握 llama-cpp-python 大模型本地部署 【免费下载链接】llama-cpp-python Python bindings for llama.cpp 项目地址: https://gitcode.com/gh_mirrors/ll/llama-cpp-python llama-cpp-python 是 llama.cpp 的 Python 绑定项目࿰…...
机器学习:基于python旅游推荐系统 景点推荐系统 爬虫 可视化 机器学习 协同过滤算法
1、项目 介绍 (1)技术栈: Django框架、基于用户协同过滤推荐算法、requests爬虫 、MySQL数据库、去哪儿网站、Echarts可视化 (2)介绍选题基于现阶段时代背景,利用Python爬虫技术获取旅游网站 中的旅游信息&…...
ROS+Catkin项目如何正确生成compile_commands.json?让clangd在VSCode里精准补全
ROSCatkin项目如何正确生成compile_commands.json?让clangd在VSCode里精准补全 在ROS开发中,代码补全和跳转的准确性直接影响开发效率。许多开发者从传统的C/C插件转向clangd时,常遇到#include报错、符号无法解析等问题。这背后往往是因为cla…...
Maplsemi美浦森原厂原装一级代理分错经销
Maplsemi美浦森原厂原装一级代理分错经销 序号 品牌 元件类别 型号 描述 包装 数量 1 MAPLESEMI MOSFET SLD20N06T TO-252 2500 2,500 2 MAPLESEMI MOSFET SLD130N04T TO-252 2500 5,000(https://i-blog.csdnimg.cn/direct/3f0025dea646479b87ba0c15005171b7.png)(https://i-bl…...
Ansys Mechanical脚本踩坑实录:从‘材料赋值失败’到‘自动网格划分’的避坑指南
Ansys Mechanical脚本实战避坑指南:从报错到精通的进阶之路 第一次在Ansys Mechanical中尝试脚本自动化时,那种挫败感我至今记忆犹新。明明按照教程一字不差地输入代码,却频频遭遇"对象只读"、"材料不识别"等错误提示。作…...
ESP32-S3驱动SPI屏幕踩坑实录:从官方Demo到稳定运行LVGL的完整配置流程
ESP32-S3驱动SPI屏幕实战指南:从硬件选型到LVGL流畅运行的深度优化 在嵌入式开发领域,显示界面的人机交互体验往往决定了产品的最终品质。ESP32-S3作为乐鑫推出的高性能Wi-Fi/蓝牙双模SoC,凭借其丰富的外设资源和强大的计算能力,成…...
MySL不推荐使用UUID等字符串做主键
环境安装 pip install keystone-engine capstone unicorn 这3个工具用法极其简单,下面通过示例来演示其用法。 Keystone 示例 from keystone import * CODE b"INC ECX; ADD EDX, ECX" try:ks Ks(KS_ARCH_X86, KS_MODE_64)encoding, count ks.asm(CODE)…...
AntV X6自定义连线避坑指南:如何实现动态虚线、箭头与悬停删除按钮?
AntV X6高级连线实战:动态虚线、箭头定制与悬停交互全解析 在数据可视化领域,连线(Edge)作为节点(Node)间关系的载体,其表现力直接影响整个图谱的专业度和用户体验。AntV X6作为企业级图编辑引擎,提供了高度灵活的连线定制能力&am…...
树、森林——树和森林的遍历(森林的遍历)
森林由多棵互不相交的树组成,遍历规则:按树的顺序依次遍历每一棵树 森林同样没有中序遍历,只有两种: 1. 森林先序遍历 访问第一棵树的根结点 先序遍历第一棵树的所有子树 依次先序遍历剩下所有树 对应关系:森林先序遍历…...
