news 2026/9/18 0:14:02

VB编程十三实践:从基础语法到二分查找的算法之旅

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VB编程十三实践:从基础语法到二分查找的算法之旅

简介:这份PDF是针对浙江高中信息技术课程中《算法与程序设计学生活动手册》的参考答案汇编,由一线教师整理,面向浙江地区高中生及信息技术教师,服务算法与程序设计实践环节的自主校对与课堂讲评。文件为单个PDF文档,共1个文件,大小244KB,页面紧凑、便于手机或电脑上直接查看、按实践编号快速定位。目前已有72人学习,适合正在使用该活动手册的学生对照练习、查漏补缺,也可供教师批改参考。内容覆盖实践一至实践八,从环境搭建、变量与输入输出,到条件循环结构、数组/列表遍历、函数定义与调用、文件读写,再到递归及排序搜索算法,均有对应操作提示和相关练习解答,能直观呈现解题思路与程序实现结果。借助这份答案,学习者可以及时发现问题、修正算法设计,更高效地完成高中阶段算法与程序设计的实践任务。

1. 一份被压到极简的算法参考答案:十三次实践的完整还原

拿到这份手册的参考答案时,我的第一反应是“省”字。实践一的圆环面积只给了s = PI * R1 ^ 2 - PI * R2 ^ 2,实践十的冒泡排序只留了三个循环边界,实践十三的二分查找连数组状态都没画。真要把这些答案讲给学生听,缺的恰恰是中间的推导过程:变量声明写在哪,循环每一轮数组怎么变,ASCII 内码加 10 之后会得到什么字符。把十三个实践按「表达式与函数、分支与循环、字符串处理、排序与查找、随机模拟」五个主题重排后会发现,它其实覆盖了 VB 基础语法到经典算法的完整链路。这份还原适合高中信息技术教师、准备学考的学生,以及想用少量代码快速回看算法基础的程序员;配套的网络技术资源里能查到不少同类讲解,但建议先跟着下文把代码跑通一遍。

2. VB 表达式与内置函数:实践一到三的求值顺序

2.1 圆环面积里的常量声明与幂运算优先级

实践一第 1 题是圆环面积:(s = \pi R_1^2 - \pi R_2^2)。手册答案给出两种写法,第一种直接用字面量,第二种用Const声明常量。后者是教材推荐做法,也更容易维护:

' 写法一:直接使用字面量,程序里出现两次 3.14 s = 3.14 * R1 ^ 2 - 3.14 * R2 ^ 2 ' 写法二:声明编译期常量,修改圆周率精度只改一处 Const PI = 3.14 s = PI * R1 ^ 2 - PI * R2 ^ 2

关键点在于^运算符的优先级。VB 中幂运算优先级高于乘除,所以PI * R1 ^ 2会先计算R1 ^ 2,再与 PI 相乘,不会产生(PI * R1)^2的歧义。这里最常见的错误是学生把内半径和外半径写反,圆环面积是外圆减内圆,一旦R1 < R2结果变成负数,程序不会报错,但几何意义就错了。调试时可以先在立即窗口用Debug.Print输出中间量,确认两个半径变量分别取到了正确的文本框值。

与此相关的还有变量声明方式,实践一相关练习第 5 小题给了Dim b As Double, x As Double,这是 VB 里声明 Double 型局部变量的标准写法。注意 VB 的Dim一行声明多个变量时,每个变量都要带类型关键字,Dim b, x As Double只会让 x 是 Double,b 是 Variant,这是新手极易踩的坑。声明方式与作用域的对应关系可以按下面这张表整理:

声明位置关键字示例作用域与说明
过程内部DimDim b As Double, x As Double仅当前过程可用
模块顶部ConstConst PI = 3.14过程内只读,编译期确定
模块顶部DimDim arr(1 To 100) As Integer整个模块可用,数组下标从 1 开始

2.2 一元二次方程求根:Sqr 的参数必须非负

实践二相关练习第 1 题给出了三个填空:判别式b^2-4*a*c、求根公式(-b+sqr(d))/(2*a)、以及两根相同时的条件d=0Sqr是 VB 的平方根函数,要求参数非负,否则运行时会弹出“实时错误 5:无效的过程调用参数”。补全后的分支代码应该是:

Dim a As Double, b As Double, c As Double Dim d As Double, x1 As Double, x2 As Double d = b ^ 2 - 4 * a * c If d < 0 Then MsgBox "方程无实数解" ElseIf d = 0 Then x1 = (-b + Sqr(d)) / (2 * a) ' d=0 时两根相同 Else x1 = (-b + Sqr(d)) / (2 * a) x2 = (-b - Sqr(d)) / (2 * a) End If

这里的(2 * a)括号不能省。VB 的/*优先级相同,按从左到右结合,如果不加括号,(-b + Sqr(d)) / 2 * a会被解析成先除以 2 再乘 a,结果差了一个平方因子。这类表达式的检查技巧是先看括号层数,再看运算符:每层括号必须成对出现,除号后面的分母整体要放在括号里。学生在抄写手册答案时经常丢掉这层括号,程序不报错但值全错,恰恰是最难排查的逻辑错误。

2.3 嵌套函数与换底公式:从最内层括号往外读

实践三相关练习第 1 题给了三个表达式,第 3 个Log(5) / Log(10)是 VB 里求常用对数的经典写法。VB 的Log函数默认是自然对数 ln(x),没有现成的Log10,所以要用换底公式:(\log_{10} 5 = \frac{\ln 5}{\ln 10})。第 1 个表达式Sqr(Abs(x + y) / 2)的求值顺序是:先算x+y,再对结果取绝对值,除以 2,最后开方,嵌套函数必须从内向外读。第 2 个表达式Abs(b - a + a) - Abs(-2 * a)可以化简为Abs(b) - Abs(-2*a),其中b-a+a的 a 相互抵消,这类化简能减少一次运行时计算,虽然手册阶段不要求性能,但养成先化简后编码的习惯对后续算法题很有帮助。

' 组合求值:观察嵌套顺序与换底写法 Dim x As Double, y As Double Dim r1 As Double, r2 As Double x = 4 y = -8 r1 = Sqr(Abs(x + y) / 2) ' 先算 x+y=-4,取绝对值 4,除 2 得 2,开方约 1.414 r2 = Log(5) / Log(10) ' 以 10 为底 5 的对数,约 0.699 Debug.Print r1, r2

程序设计实践里,表达式求值错误大多集中在三处:幂运算误用为位运算、括号层级错位、整除与浮点除混用。VB 里\是整除,/是浮点除法,求平均值必须用/,而求数组中间下标用\,两者混用会导致小数值被截断或类型不匹配。实践三的选择题答案集中在 D、C、B,考的就是这些基本函数的返回值边界,比如Sqr(0)返回 0,Log(1)返回 0,Abs(-3.14)返回 3.14,这些都是可以直接在立即窗口里验证的。

3. 条件分支与循环控制:闰年、素数与最大公约数

3.1 分段条件的两种写法:If 分支与数轴图

实践四操作提示第 4 小题给出的是b <= 20 Then ... Else ... 或 ElseIF b > 35 Then,这说明手册在让学生补全一个分段条件的判断逻辑。分段问题最稳妥的做法是先在纸上画数轴,把 b 的取值区间切成互不重叠的几段,再决定分支顺序。如果手册原题是让填b <= 20之后的分支,一种完整结构是:

' 结构一:从低区间往高区间依次判断 If b <= 20 Then fee = 0 ElseIf b > 35 Then fee = 15 Else fee = 8 End If ' 结构二:用 And 显式写出区间边界 If b > 20 And b <= 35 Then fee = 8 ElseIf b <= 20 Then fee = 0 Else fee = 15 End If

两种写法等价,差别在可读性和扩展性。结构一按区间顺序推进,新增档位时只需在中间插入 ElseIf,代码更清晰;结构二用 And 把边界直接写出来,等于把数轴画在代码里,适合边界值较少的场景。我一般让学生先用第一种,因为 ElseIf 天然保证了互斥,不会出现两个分支条件同时成立的情况。这里要特别注意 VB 的And不是短路运算符,b > 20 And b <= 35左右两边都会求值;如果第二个表达式可能越界抛错,需要把先做判断的条件放在左边。

3.2 闰年判断:布尔函数调用与复合条件

实践七操作提示第 4 小题给出了年份和月份的合法性判断:year >= 1 And year <= 9999 And month >= 1 And month <= 12,以及闰年判断的两种调用写法leap(year) Or leap(year) = True。这说明教材允许两种风格,但leap(year)本身就是布尔表达式,直接作为条件更简洁。完整的闰年函数和日期分支如下:

Function leap(ByVal y As Integer) As Boolean leap = (y Mod 4 = 0 And y Mod 100 <> 0) Or (y Mod 400 = 0) End Function Dim year As Integer, month As Integer, d As Integer ' 先校验输入合法性,再计算当月天数 If year >= 1 And year <= 9999 And month >= 1 And month <= 12 Then Select Case month Case 1, 3, 5, 7, 8, 10, 12 d = 31 Case 4, 6, 9, 11 d = 30 Case 2 If leap(year) Then d = 29 Else d = 28 End Select End If

闰年判断的规则容易记混,口诀是“四年一闰,百年不闰,四百年再闰”。代码里两个条件通过AndOr组合,注意And优先级高于Or,所以(y Mod 4 = 0 And y Mod 100 <> 0) Or (y Mod 400 = 0)能按预期解析,不用额外嵌套。我在课堂上会让每个学生拿2000、1900、2024、2023四个年份手算一次,2000 年能整除 400 是闰年,1900 年能整除 100 但不能整除 400 是平年,这两个边界值能筛掉绝大多数对规则理解不到位的情况。

3.3 更相减损法与素数筛选:循环边界的三种选择

实践七相关练习第 1 题输出 6,是求两个数的最大公约数,手册特别注明用的是更相减损法,并且提示还可以用欧几里得算法。两种实现对比:

' 更相减损法:大数减小数,直到两数相等 Dim a As Integer, b As Integer a = 42: b = 30 Do While a <> b If a > b Then a = a - b Else b = b - a End If Loop Debug.Print a ' 输出 6 ' 欧几里得算法:取模迭代,循环次数远少于相减 a = 42: b = 30 Do While b <> 0 t = a Mod b a = b b = t Loop Debug.Print a ' 输出 6

更相减损法在数学课上直观好懂,但当两个数差距悬殊时,比如求 1 和 10000 的公约数,需要相减近万次;欧几里得算法用Mod一步把规模降到余数级别,效率差别是线性和对数的区别。手册特意保留两种解法,目的是让学生体会“同一个算法问题,不同策略的运算量差异”。我一般建议把欧几里得作为标准实现,因为取模本身就是除法运算,硬件层面比循环相减高效得多。

实践八的素数判定是另一个循环边界问题。标准写法是:

Function IsPrime(ByVal n As Integer) As Boolean Dim i As Integer If n < 2 Then Exit Function For i = 2 To n - 1 If n Mod i = 0 Then Exit Function Next i IsPrime = True End Function

For i = 2 To n - 1逐个试除,只要有一次余数为 0,函数立即退出,返回 False。这段代码的时间复杂度是 O(n),但 n 的因子成对出现,a * b = n中较小的因子必然不超过 (\sqrt{n}),所以循环上界可以安全改成Int(Sqr(n)),这就是从朴素试除到根号剪枝的经典优化,实践八的相关练习里m Mod i = 0配合布尔变量p1、p2做复合判断,本质上也是在提前排除非素数。三个实践涉及的循环结构对比如下:

实践循环结构退出条件时间复杂度
实践七相关练习 1Do While a <> b两数相等O(n),最坏是两数之和级
实践八相关练习 2For i = 2 To n - 1n Mod i = 0O(n),优化后 O(√n)
实践六相关练习 2For i = 1 To ni > nO(n),求最小值

4. 字符串内码与加密循环:Mid、Asc、Chr 的组合用法

4.1 逐字符取用的三个基础函数

实践五操作提示第 4 题给出了Mid(s, i, 1)Chr(Asc(a) - 10),实践六操作提示第 2 题又给出了Mid(x, j, 1)Chr(Asc(b) + 10)。两组提示连起来看,就是在实现一个“字符内码加 10”的替换式加密:Asc取字符的内码,加 10 后用Chr还原成新字符,Mid负责逐字符遍历。三个函数的配合关系是固定的:

函数作用示例返回值类型
Mid(s, i, 1)截取字符串第 i 个字符Mid("ABC", 2, 1) → "B"String
Asc(c)字符转内码Asc("A") → 65Integer
Chr(n)内码转字符Chr(65) → "A"String

实践五相关练习第 3 题的填空i = 1: k = d(i)是另一种遍历起点,它假设数组第一个元素就是当前最大值,循环从第 2 个元素开始比较,这和第 3 章的求最小值套路一致。字符串处理的遍历则不同,它的循环上界必须用Len(s)动态获取,因为字符串长度在运行时才确定。一次典型的取字符循环是:

Dim s As String, i As Integer, c As String s = "Zhejiang2024" For i = 1 To Len(s) c = Mid(s, i, 1) Debug.Print i, Asc(c) ' 输出位置和字符内码 Next i

4.2 内码加 10 的加密与解密循环

实践六实现的是每个明文字符内码加 10 得到密文。补全后的加密过程非常短,但信息量集中:

' 加密:把每个明文字符的内码加 10 Dim plain As String, cipher As String Dim j As Integer, c As String plain = Text1.Text For j = 1 To Len(plain) c = Mid(plain, j, 1) cipher = cipher & Chr(Asc(c) + 10) Next j Text2.Text = cipher

解密时把+10换成-10即可。这段代码有两个边界问题值得在课堂上演示。第一,Asc对英文字符返回 ASCII 码,但中文字符在 VB6/VBA 里返回的是本地代码页编码,不是 Unicode 码点,加 10 之后可能落在未定义字符区,所以教材只拿可见的英文字符做示例;如果换成 VB.NET,应该用AscWChrW处理 Unicode。第二,加密字符内码加 10 后可能越过可打印范围,比如z的 ASCII 是 122,加 10 变成 132,在特定代码页下输出乱码,这一点手册没有展开,实际教学里可以让学生自己试一组a、m、z的加密结果。

实践六相关练习第 3 题还出现了sum = sum + iText2.Text = Str(sum)Str函数把数值转成字符串再赋值给文本框,VB 里 TextBox 的 Text 属性只接受字符串,直接赋数值虽然会自动转换,但显式用Str能避免空格和格式上的意外。这个习惯在做输出格式化时尤其重要。

4.3 最大子序列和:一次扫描完成的最值问题

实践五相关练习最后一题的答案是 6,手册注释明说是“求最大子序列和”。这个题目在算法和数据结构里属于经典入门问题,初级解法是三重循环枚举所有子序列,而手册想教的是在线扫描的版本:

Dim d(1 To 10) As Integer Dim i As Integer, s As Integer, mx As Integer ' 数组 d 已按要求赋值,假设最大连续子序列和为 6 s = 0 mx = 0 For i = 1 To 10 s = s + d(i) If s < 0 Then s = 0 If s > mx Then mx = s Next i Debug.Print mx ' 输出 6

核心是If s < 0 Then s = 0这一行。任何连续子序列,如果当前累加和已经变成负数,它作为后续元素的前缀只会拖累总和,所以直接从 0 重新累计;mx记录的是历史上出现过的最大和,和当前累计值s是两个独立概念。数组全是正数时,最大子序列和等于总和;数组全是负数时,这个算法会错误地返回 0,这是它唯一需要修补的边界,解法是让mx初始值为第一个元素而不是 0。整段代码只扫描数组一遍,时间复杂度 O(n),空间 O(1),其思想也是后面动态规划入门课里“状态只依赖前一步结果”的雏形,值得让学生把执行过程按 i 的变化手写一遍再对比运行结果。

5. 排序与查找:从冒泡到二分查找的循环边界

5.1 冒泡排序:内层上界为什么不断缩小

实践十操作提示只给了三个填空:外层1 To n - 1、内层n To i + 1、交换d(j) = d(j - 1)。这是从后向前扫描的冒泡变体,补全成更常见的向前扫描版本,逻辑是等价的:

Dim i As Integer, j As Integer, t As Integer Dim d(1 To 6) As Integer ' 数组赋值略 For i = 1 To n - 1 For j = 1 To n - i If d(j) > d(j + 1) Then t = d(j) d(j) = d(j + 1) d(j + 1) = t End If Next j Next i

每轮外层循环执行完,未排序区间的最大值就被交换到末尾,所以第 i 轮结束后,最后 i 个位置已经排好。内层循环的上界因此从 n 逐渐缩小到 n - i,这就是答案1 To n - 1n To i + 1的来源。手册相关练习题里给出的序列164 168 172 175 185 178164 168 172 175 178 185,正是最后一轮把 185 和 178 交换后的状态。排序状态变化可以用表格记录:

轮次遍历范围本轮确定的位置示例状态(升序)
初始178 168 172 175 185 164
第 1 轮1 到 5下标 6168 172 175 178 164 185
第 2 轮1 到 4下标 5168 172 175 164 178 185
最终164 168 172 175 178 185

最容易被忽视的坑是把内层上界写成 n,这样程序不会报错,但每一轮都在比较已经就位的元素,白白多出近一半运算量。调试时可以在每次外层循环结束加一句Debug.Print Join(d, ","),观察最大值逐步“冒泡”到末尾的过程,比直接看运行结果直观得多。冒泡排序的比较次数固定为 n(n-1)/2,交换次数则依赖数据的初始有序程度,这也是教材先讲冒泡再讲选择排序的原因——两者比较次数相同,但交换策略的差异正好引出算法效率的讨论。

5.2 选择排序:比较次数不变,交换次数锐减

实践十一操作提示的第 3 题给出了选择排序的核心填空:外层1 To n - 1、记录当前最小值位置k = i、内层i + 1 To n、交换条件min <> i。补全后的代码为:

For i = 1 To n - 1 k = i For j = i + 1 To n If d(j) < d(k) Then k = j Next j ' 若最小值不在当前位置才交换,省掉多余的赋值 If k <> i Then t = d(i) d(i) = d(k) d(k) = t End If Next i

冒泡排序在每次比较时都可能做交换,最坏情况下要交换 n(n-1)/2 次;选择排序每一轮只记录最小值的下标,一轮结束才交换一次,最多交换 n-1 次。手册相关练习第 4 题的填空就是这组对比数据:比较次数恒为 n(n-1)/2,升序时交换 0 次,无序时最多 n-1 次,答案是“少快”。两种排序的对比学习是数据结构与算法入门的标准路径,很多人面试时被问“冒泡和选择哪个快”,本质就是在问交换开销和稳定性:

排序算法比较次数最优交换次数最差交换次数稳定性
冒泡排序n(n-1)/20n(n-1)/2稳定
选择排序n(n-1)/20n-1不稳定

选择排序不稳定的原因在于交换可能把相同值的相对顺序打乱,比如5a、3、5b、1,第一轮把 1 换到最前面时,两个 5 的相对位置就变了。手册阶段不需要深究稳定性定义,但要让学生知道“比较次数相同不代表性能相同”。归并排序和堆排序这类更快的算法通常安排在后续章节,选择排序的价值是建立一个 O(n^2) 排序家族的基线,后续学快排时才看得出差距。

5.3 线性查找与二分查找:循环条件的两种风格

实践十二操作提示里的i <= nd(i) = lSearchi = i + 1是线性查找的骨架:从下标 1 开始逐个比较,直到越界或命中。二分查找则在实践十三,核心是(lLeft + lRight) \ 2lSearch > mArray(lMidd)这两个分支。两者的循环条件差异直接决定了各自的适用前提:

' 线性查找:不要求数组有序,最坏遍历 n 次 Function lSearch(d() As Integer, key As Integer) As Integer Dim i As Integer i = LBound(d) Do While i <= UBound(d) And d(i) <> key i = i + 1 Loop If i <= UBound(d) Then lSearch = i Else lSearch = 0 End Function
' 二分查找:要求数组升序,每次排除一半区间 Function bSearch(mArray() As Integer, key As Integer) As Integer Dim lLeft As Integer, lRight As Integer, lMidd As Integer lLeft = LBound(mArray) lRight = UBound(mArray) Do While lLeft <= lRight lMidd = (lLeft + lRight) \ 2 If mArray(lMidd) = key Then bSearch = lMidd Exit Function ElseIf key > mArray(lMidd) Then lLeft = lMidd + 1 Else lRight = lMidd - 1 End If Loop bSearch = -1 End Function

线性查找的循环条件是“没越界且没找到”同时成立,一旦越界说明数组里没有目标值;二分查找的循环条件是lLeft <= lRight,区间还有元素就继续折半。两个函数都用了LBoundUBound代替固定 n,这样数组下标从 0 开始还是从 1 开始都不影响正确性。二分查找里最容易错的是把lMidd写成(lLeft + lRight) / 2,浮点除返回带小数的 Double,直接赋值给 Integer 型变量会发生四舍五入而不是截断,可能越界;用\整除既保证下标是整数,也符合二分查找“取下整”的语义。实践十三相关练习给出的答案是 8 次,对应大约 256 个元素的搜索规模,每次比较把区间缩小一半,最多需要 (\lceil \log_2(n+1) \rceil) 次。76 人落位后真正要提醒学生的点是:二分查找之前必须排序,否则lMidd位置的元素和 key 的大小比较不携带任何区间信息,整个算法立刻失效。这是排序算法和查找算法被放在同一个章节的原因,没有前面的有序性,就没有后面的对数级复杂度。

6. 蒙特卡洛模拟:用随机撒点估算 π 值

6.1 从公式验算到随机模拟

实践九的答案里有两条线索:Text3.Text对应的累加公式ai*(i-1)/(2*i-1)Str(pai*2),这是莱布尼茨级数计算 π 的近似值;Text4.Text对应的是a^2+b^2s=s+1Str(4*s/n),这是蒙特卡洛模拟。蒙特卡洛的思路是在单位正方形里随机撒点,统计落在四分之一圆内的点数比例,比例乘以 4 就是 π 的估计值:

' 蒙特卡洛估算 π:n 个随机点,落在圆内的比例逼近 π/4 Dim n As Long, i As Long, s As Long Dim a As Double, b As Double n = 10000 s = 0 Randomize For i = 1 To n a = Rnd ' 生成 [0,1) 区间随机数 b = Rnd If a ^ 2 + b ^ 2 <= 1 Then s = s + 1 End If Next i Text4.Text = Str(4 * s / n)

判断条件a^2 + b^2 <= 1就是原点距离平方小于等于 1,落在半径 1 的四分之一圆内。每个随机点独立均匀分布在 1×1 的正方形里,圆内面积与正方形面积之比是 π/4,所以4 * s / n逼近 π。n 取 10000 时误差约 1%,n 取 1000000 时可以到 0.1% 量级,学生可以直观看到“次数越多,随机模拟越精确”的大数定律现象,这也是这个实践放在排序和查找之后的价值:它展示了不靠解析公式也能算出数值结果的一种算法思维。

6.2 用固定种子复现实验结果

随机模拟在教学里有个麻烦:每次运行结果都不一样,学生无法对照检查自己的程序是否正确。VB 的Rnd函数在没有Randomize时,每次程序启动生成的随机序列完全相同,这反而适合调试;一旦调用了Randomize,就按当前时间初始化随机序列,结果才真正随机。想复现某次实验数据,常见做法是先用一个固定种子重置随机序列:

' 固定随机种子,复现同一组实验结果 Rnd -1 Randomize 42

Rnd -1用固定值重置随机数生成器,后面的Randomize 42再让序列从确定位置开始,这样全班同学运行程序得到的是同一组随机点,误差也一致,便于课堂讨论。实践九相关练习第 1 题里的Int(Rnd * 10 + 1)生成的是 1 到 10 的随机整数,它和Int(Rnd * 10) + 1的区别只在边界:前者直接加 1,后者先取整再加 1,两种写法在Rnd < 0.1时结果略有差异,这也是随机数取区间的一个细节。判断一个随机数公式是否正确,可以连续运行 1000 次并统计s/n的收敛趋势,比单次数值更有说服力。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 0:12:34

VS Code SSH远程连接服务器配置与高频报错排查

大部分人第一次把 VS Code 和远程服务器放在一起用的场景&#xff0c;都差不多&#xff1a;手上有一台跑着训练任务或者测试环境的机器&#xff0c;代码在远端&#xff0c;本地只是一台性能普通的笔记本。于是就有了两条路——ssh 上去用 vim 硬改&#xff0c;或者本地写完再用…

作者头像 李华
网站建设 2026/9/18 0:05:40

C++文件I/O操作指南:从基础到高性能实践

1. 为什么每个C开发者都必须掌握文件I/O在Linux环境下用C处理文件&#xff0c;就像厨师用刀——看似基础却暗藏玄机。我见过太多项目因为文件操作不当导致数据损坏、性能瓶颈甚至安全漏洞。有一次排查线上服务崩溃&#xff0c;最终发现竟是开发者在写入日志时没检查fwrite返回值…

作者头像 李华
网站建设 2026/9/17 23:53:06

Apache Fesod替代EasyExcel:高并发Excel处理的确定性方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华