C语言月份天数计算:从switch-case到数组映射的编程思维进阶
1. 从一道经典题目说起为什么计算月份天数值得深究如果你刚开始学习C语言或者正在准备编程相关的笔试面试那么“输入年月输出该月天数”这道题你大概率遇到过。它看起来简单不就是几个if-else或者一个switch-case吗很多教程一笔带过直接甩给你一段代码。但在我带新人和自己面试候选人的这些年里这道题恰恰是区分“会写代码”和“理解代码”的一道分水岭。为什么这么说因为它麻雀虽小五脏俱全。它考察的绝不仅仅是语法而是你对边界条件处理、逻辑抽象能力以及代码可维护性的初步感知。一个合格的实现需要妥善处理闰年二月这个特殊案例一个优秀的实现则能让你看到不同编程思维下的代码组织艺术。今天我就以这道题为引子不仅带你用两种最典型的方法实现它更会深入拆解每种方法背后的设计逻辑、容易踩的坑以及如何根据不同的应用场景选择合适的方法。你会发现这个简单的功能是理解数组应用、条件判断优化乃至更复杂状态管理的一个绝佳起点。2. 核心逻辑拆解闰年判断与月份天数映射在动手写代码之前我们必须把业务逻辑彻底理清。计算任意月份的天数核心在于解决两个问题第一如何确定给定的年份是否是闰年第二如何根据月份和是否闰年映射到具体的天数。2.1 闰年判断被误解的“四年一闰”闰年的规则很多人只记住了“四年一闰”但这并不完整。完整的格里高利历闰年规则是能被4整除的年份是闰年。但是能被100整除的年份不是闰年。然而能被400整除的年份又是闰年。用逻辑表达式来描述就是(year % 4 0 year % 100 ! 0) || (year % 400 0)。这个顺序很重要它体现了规则的优先级。你可以这样理解先看最特殊的400年规则满足就是闰年如果不满足再看“百年不闰”规则最后才是普通的“四年一闰”。注意这里有一个常见的思维陷阱。很多人会先判断year % 400 0再判断year % 100 0最后判断year % 4 0。逻辑上虽然等价但把%400放在最前面在代码可读性上更优因为它直接处理了最明确的例外情况如2000年。2.2 月份天数规律30天、31天与“捣蛋鬼”二月除去二月其他月份的天数是有固定规律的。你可以用“拳头记忆法”也可以用编程思维总结4、6、9、11月是30天小月。1、3、5、7、8、10、12月是31天大月。2月是变量平年28天闰年29天。这里的关键在于8月31天和7月挨着打破了“大小月交替”的简单规律这是因为历史原因凯撒和屋大维的月份命名。在编程实现时我们不能假设一个简单的奇偶或交替模式必须显式地定义这种映射关系。3. 方法一使用switch-case分支结构switch-case是C语言中处理多路分支的经典结构对于这种离散的、基于单个整数值月份的映射它非常直观。3.1 基础实现与代码逐行解析我们先来看最直接的实现方式#include stdio.h #include stdbool.h // 使用bool类型需要包含此头文件 int main() { int year, month, days; bool isLeapYear; printf(请输入年份和月份格式2024 2); scanf(%d %d, year, month); // 闰年判断 if ((year % 400 0) || (year % 4 0 year % 100 ! 0)) { isLeapYear true; } else { isLeapYear false; } // 使用switch-case判断月份天数 switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days 31; break; case 4: case 6: case 9: case 11: days 30; break; case 2: if (isLeapYear) { days 29; } else { days 28; } break; default: printf(输入月份无效月份应在1-12之间。\n); return 1; // 非正常退出 } printf(%d年%d月有%d天。\n, year, month, days); return 0; }代码逻辑拆解输入与闰年判断先获取用户输入的年份和月份。紧接着用一个if语句完成闰年判断并将结果存入布尔变量isLeapYear。这里将判断逻辑提前计算并存储避免了在switch的case 2里重复计算是一种良好的实践。switch-case结构case 1: case 3: ... case 12:这里利用了switch的“贯穿”fall-through特性。多个case标签共享同一段执行语句days 31;直到遇到break才跳出。这非常简洁地处理了所有31天的月份。case 4: case 6: case 9: case 11:同理处理所有30天的月份。case 2:这是特殊处理。根据之前计算好的isLeapYear变量决定赋值为28或29。default:这是一个至关重要的安全阀。它处理了用户可能输入的非法月份如0、13、-5等。没有它程序对非法输入的行为是未定义的很可能崩溃或输出错误结果。输出与返回最后打印结果。main函数返回0表示程序正常结束在default分支返回1表示因输入错误而终止。3.2 switch-case方法的优劣分析与适用场景优点逻辑清晰直观代码结构与我们的思维映射“如果是1月、3月…那就31天”高度一致易于理解和编写。执行效率可能较高对于某些编译器和优化场景switch可能被编译成跳转表jump table其执行时间是常数级的O(1)比一系列if-else if的判断效率更高尤其是在case值连续且密集时。缺点与注意事项冗余与维护成本每个case标签都需要显式列出。如果映射关系发生变化虽然月份天数几乎不变需要修改多处。不过在此特定问题中这不算大问题。“贯穿”陷阱忘记写break是新手常犯的错误会导致程序继续执行下一个case的语句引发逻辑错误。在上述代码中我们是有意利用“贯穿”来合并相同操作但务必清楚自己在做什么。仅适用于离散整型switch在C语言中只能用于整型或枚举类型不能用于字符串或范围判断。这限制了它的应用范围。适用场景当你需要根据一个离散的、取值明确的整型或枚举变量映射到不同的行为或值时switch-case通常是首选。例如处理状态机、命令解析、错误码转换等。在本例中月份1-12正是这样的理想场景。4. 方法二使用数组进行映射数组是存储同类型数据集合的利器。对于月份天数这种“查找表”性质的问题用数组来实现堪称“降维打击”代码会异常简洁。4.1 基础数组映射法思路是预先定义两个数组分别存储平年和闰年每个月的天数。然后根据年份是否为闰年选择对应的数组进行查找。#include stdio.h #include stdbool.h int main() { int year, month; int daysInMonthCommon[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 平年 int daysInMonthLeap[13] {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 闰年仅2月不同 int *selectedMonthArr; // 用于指向所选数组的指针 printf(请输入年份和月份格式2024 2); scanf(%d %d, year, month); // 输入有效性检查应放在最前面 if (month 1 || month 12) { printf(输入月份无效月份应在1-12之间。\n); return 1; } // 闰年判断并选择数组 if ((year % 400 0) || (year % 4 0 year % 100 ! 0)) { selectedMonthArr daysInMonthLeap; } else { selectedMonthArr daysInMonthCommon; } // 通过数组下标直接获取天数 int days selectedMonthArr[month]; printf(%d年%d月有%d天。\n, year, month, days); return 0; }代码精妙之处数组下标从1开始我们定义了长度为13的数组并让daysInMonth[0] 0。这样daysInMonth[1]就对应1月daysInMonth[12]对应12月非常符合直觉避免了month-1这种容易出错的偏移计算。指针切换一劳永逸通过一个指针selectedMonthArr根据闰年判断结果让它指向平年数组或闰年数组。之后只需要一句selectedMonthArr[month]就能得到结果。这种“选择数据结构”的思路比在逻辑中到处写if-else更优雅。提前进行输入校验在计算之前就检查月份是否合法这是一种防御性编程的好习惯能避免非法输入导致数组越界访问daysInMonth[13]这种严重错误。4.2 进阶单数组配合二月修正我们还可以进一步优化只使用一个基础数组平年然后单独处理闰年二月的情况。#include stdio.h #include stdbool.h int main() { int year, month; // 基础数组存储平年每月天数下标1-12有效 int daysInMonthBase[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; printf(请输入年份和月份格式2024 2); scanf(%d %d, year, month); if (month 1 || month 12) { printf(输入月份无效月份应在1-12之间。\n); return 1; } int days daysInMonthBase[month]; // 先获取基础值 // 如果是闰年且月份是2月则在基础值28天上加1天 if (month 2 ((year % 400 0) || (year % 4 0 year % 100 ! 0))) { days 29; // 或者 days 1; } printf(%d年%d月有%d天。\n, year, month, days); return 0; }这种方法更节省内存只有一个数组逻辑也清晰先拿基础值再针对唯一例外闰年二月做修正。它在概念上更贴近“二月是特例”这个事实。4.3 数组方法的优劣分析与适用场景优点代码极度简洁核心逻辑几乎就是一行查找arr[month]。消除了大量的分支判断语句。数据与逻辑分离天数数据明确地存储在数组中修改数据比如假设某个历法改革只需要改数组初始化值不需要动核心逻辑。这符合良好的软件设计原则。执行效率稳定数组访问是O(1)的时间复杂度且不受月份值影响性能可预测。易于扩展如果未来需要支持更多月份相关属性如季度、季节名称可以很容易地增加平行数组。缺点与注意事项空间开销需要额外的数组存储空间。但在现代计算机上一个13个int的数组约52字节的开销完全可以忽略不计。依赖下标有效性必须严格保证month的值在1-12之间否则就是数组越界会导致程序崩溃或读取到垃圾数据。因此输入验证至关重要。直观性稍弱对于初学者看到数组可能不如switch的case标签那样直接反映出“1月有31天”这个事实。适用场景“查找表”模式是数组的经典应用。任何输入到输出的映射关系是确定且有限的都适合用数组实现。除了月份天数还有星期几计算蔡勒公式的修正值表、摩尔斯电码编码、错误信息映射等。当你发现代码里有一长串if-else或switch-case仅仅是为了返回一个固定值时就该考虑是否能用数组或哈希表来优化了。5. 两种方法的深度对比与选型建议现在我们把两种方法放在一起从多个维度进行对比这能帮助你建立根据场景选择工具的思维。对比维度switch-case方法数组映射方法代码可读性高。逻辑分支一目了然非常符合人类“如果…就…”的思维习惯。中。对于新手需要理解“数组下标即月份”的映射关系。但熟悉后会觉得非常简洁。代码简洁性中。需要为每个月份编写case标签代码行数较多。高。核心逻辑只有数组定义和查找非常精炼。执行效率通常较高。编译器可能优化为跳转表效率稳定在O(1)。高且稳定。数组访问是确定性的O(1)操作。可维护性较低。修改天数映射如假设历法变化需要改动多个case语句。高。数据存储在数组中修改数据只需改动初始化部分逻辑不变。内存占用极低。只存储代码和少量变量。极低。多了一个小数组现代系统可忽略不计。错误处理依赖default分支结构清晰。强烈依赖输入验证非法月份会导致数组越界崩溃。扩展性差。增加与月份相关的其他属性如季节需要增加新的switch或if-else。好。可以轻松增加平行数组如char *season[]来实现多属性映射。选型建议追求极致简洁与数据驱动选择数组方法。尤其是在你预感到映射关系未来可能变动或者需要基于月份进行多次、多种属性查询时数组的优势巨大。强调教学与逻辑清晰在教程或给初学者讲解时switch-case方法更合适。它能一步步展示决策过程。处理更复杂的条件逻辑如果每个case里不仅仅是赋值还包含一系列复杂的操作、函数调用那么switch-case的结构会更清晰。数组更适合简单的值映射。性能敏感场景两者都是O(1)但数组访问的确定性可能略好一丁点。不过在99.9%的场景下这点差异无关紧要应优先考虑代码清晰度和可维护性。就我个人而言在真实的工程项目中我几乎总是选择数组方法。它的“数据与逻辑分离”特性使得代码更容易维护和测试。我可以把月份天数数组甚至闰年判断函数放在一个独立的配置头文件或工具类里业务代码只需要调用非常干净。6. 常见陷阱、边界测试与防御性编程写出能跑的程序容易写出健壮的程序难。下面这些坑我几乎见每个初学者都踩过。6.1 输入验证程序安全的第一道防线这是最重要也是最容易被忽略的一点。用户的输入是不可信的。错误示范scanf(“%d %d”, year, month); // 直接开始计算如果用户输入month15或month-1呢 days daysInMonth[month]; // 数组越界程序崩溃或行为异常。正确做法数组法为例if (scanf(“%d %d”, year, month) ! 2) { // 处理输入失败如输入了字母 printf(“输入格式错误请确保输入两个整数。\n”); while(getchar() ! ‘\n’); // 清空输入缓冲区防止后续读取错误 return 1; } if (month 1 || month 12) { printf(“月份必须在1到12之间。\n”); return 1; } if (year 0) { // 虽然历史上有公元前但很多简单程序不考虑 printf(“年份请输入一个非负数。\n”); return 1; } // 验证通过再进行计算对于switch-case法default分支可以捕获非法月份但同样无法处理非数字输入。因此综合的输入验证应放在最前面。6.2 闰年判断的逻辑错误错误1if (year % 4 0)。漏掉了“百年不闰四百年又闰”的规则会导致1900年等年份被错误判断为闰年。错误2嵌套if顺序混乱。逻辑上虽然可能正确但可读性差。最佳实践使用最清晰完整的逻辑表达式并考虑将其封装成函数。int isLeapYear(int year) { return (year % 400 0) || (year % 4 0 year % 100 ! 0); }这样主程序逻辑更清晰if (isLeapYear(year)) { … }。6.3 switch-case中的break遗漏在需要每个case独立执行时忘记break会导致“贯穿”这是一个经典错误。switch (month) { case 1: days 31; // 这里没有break! case 2: days 28; // 如果month1执行完case 1后会继续执行这里days被错误覆盖 … }应对在不需要“贯穿”的每个case后务必加break。一些现代IDE或代码检查工具如Lint会对此给出警告。6.4 边界条件测试用例一个好的程序必须经过测试。针对此题你应该至少测试以下几类情况测试用例 (年, 月)预期输出测试目的(2023, 2)28天平年二月(2024, 2)29天闰年二月(2000, 2)29天能被400整除的世纪闰年(1900, 2)28天能被100整除的非闰年(2023, 1)31天大月(2023, 4)30天小月(2023, 13)提示错误月份上界溢出(2023, 0)提示错误月份下界溢出(2023, -5)提示错误负月份(“abc”, 5)提示输入格式错误非数字输入处理养成编写测试用例的习惯是通往专业开发的必经之路。你可以手动测试也可以尝试学习简单的单元测试框架。7. 举一反三从月份天数到更通用的“查找表”思维这道题的价值远不止于其本身。它教会我们一种非常重要的编程范式将数据从逻辑中分离用查表代替复杂的计算或分支。场景扩展1星期几计算计算某年某月某日是星期几有蔡勒Zeller公式。公式本身有点复杂但其中有一个基于月份的修正值表{0,3,3,6,1,4,6,2,5,0,3,5}。你看这又是一个完美的数组应用场景用month做下标直接取值参与计算比写12个if判断优雅得多。场景扩展2工资税率计算假设不同的收入区间有不同的税率。你可以用两个平行数组double income_brackets[] {0, 3000, 12000, 25000, 35000, 55000, 80000, INFINITY}; double tax_rates[] {0.03, 0.10, 0.20, 0.25, 0.30, 0.35, 0.45};通过循环查找收入所在区间再应用对应税率。当税率表变化时你只需要修改数组数据核心计算循环无需变动。场景扩展3状态机或命令解析如果你在编写一个简单的解析器根据输入的命令字符串执行不同操作。虽然switch不能直接用于字符串但你可以先使用strcmp比较然后将结果映射到枚举常量再用switch处理。或者更高级的做法是使用函数指针数组或哈希表实现真正的“命令字符串”到“处理函数”的映射。核心思想当你发现代码中存在大量硬编码的、结构相似的if-else或switch-case语句并且它们主要是在进行“输入-输出”的映射时就应该思考“我能不能把这些映射关系抽出来做成一个配置数组、字典、配置文件” 这样做的好处是代码更简洁、更易维护、更易扩展。月份天数这道题就是这个强大编程思维的一个微型而完美的演练场。

相关新闻

大学生精力管理:从决策过载到系统修复的实践指南

大学生精力管理:从决策过载到系统修复的实践指南

1. 现象剖析:从“永动机”到“节能模式”的转变如果你问一个正在读大学的朋友“最近怎么样”,十有八九会听到“累”、“困”、“没精神”之类的回答。这几乎成了当代大学生的集体画像。反观高中时期,尤其是高三,每天五点半起床&am…

2026/10/11 2:13:19 阅读更多 →
数学建模竞赛面试全攻略:从技术原理到项目深挖的应对策略

数学建模竞赛面试全攻略:从技术原理到项目深挖的应对策略

1. 面试官视角:他们为什么对你的数模经历感兴趣?在保研或考研面试的紧张氛围里,当你的简历上“数学建模竞赛经历”这一行字被老师捕捉到时,他们的大脑里其实在快速进行一场信息解码。这绝不仅仅是一个简单的“加分项”标签。作为过…

2026/9/29 18:15:46 阅读更多 →
智能体软件架构设计:从LLM驱动到工程化落地的核心实践

智能体软件架构设计:从LLM驱动到工程化落地的核心实践

1. 项目概述:从“工具”到“伙伴”的软件范式革命最近和几个做企业级应用开发的老朋友聊天,大家不约而同地提到一个词:心累。不是代码难写,也不是架构难调,而是需求变得太快。今天客户要一个智能报表,能自动…

2026/10/11 14:22:56 阅读更多 →

最新新闻

拆解Amical的whisper.cpp封装:如何构建带Metal/CUDA/CPU自动回退的C++原生模块

拆解Amical的whisper.cpp封装:如何构建带Metal/CUDA/CPU自动回退的C++原生模块

【免费下载链接】amical 🎙️ AI Dictation App - Open Source and Local-first ⚡ Type 3x faster, no keyboard needed. 🆓 Powered by open source models, works offline, fast and accurate. 项目地址: https://gitcode.com/gh_mirrors/…

2026/10/12 0:27:12 阅读更多 →
基于YOLO的管道缺陷检测:980张图像训练实战与避坑指南

基于YOLO的管道缺陷检测:980张图像训练实战与避坑指南

简介:本资源为面向YOLO系列目标检测算法的下水管道缺陷检测数据集,适用于从事管道巡检、市政设施维护与工业视觉检测的开发者及研究人员,可解决缺陷样本稀缺、标注格式不统一等问题。压缩包共2000个文件,约33.89MB,包含…

2026/10/12 0:27:12 阅读更多 →
物联网模组柔性FPC天线方案全解析:选型、布局与调试

物联网模组柔性FPC天线方案全解析:选型、布局与调试

1. 项目背景与选型思路做物联网产品硬件设计的朋友,十有八九都遇到过同一个问题:模组选好了、主板画完了、结构堆叠也敲定了,结果天线没地方放。尤其是这两年,NB-IoT、Cat.1、BLE、LoRa 这些模组方案层出不穷,模组本身…

2026/10/12 0:27:12 阅读更多 →
用Tauri构建桌面天气应用:从技术选型到打包发布的完整实践

用Tauri构建桌面天气应用:从技术选型到打包发布的完整实践

桌面天气应用这个需求,看起来挺简单,但真做起来会发现它横跨了数据接口、桌面端集成、界面设计、异常处理好几个层面的问题。我前后用了两个周末把一套完整方案跑通,过程中踩了不少坑,这里把从选型到发布的完整链路梳理出来&#…

2026/10/12 0:27:12 阅读更多 →
UML四层建模实战:从用例图到部署图构建教务管理系统

UML四层建模实战:从用例图到部署图构建教务管理系统

简介:本资源是南京邮电大学软件工程课程设计的完整实验报告,面向高校计算机类专业本科生及软件工程初学者,聚焦教务管理系统的面向对象分析与UML建模实践。报告系统呈现了从需求分析到UML建模的全流程:涵盖用例图(管理…

2026/10/12 0:26:12 阅读更多 →
UML用例图与顺序图建模核心:抓准动作主体与交互时序

UML用例图与顺序图建模核心:抓准动作主体与交互时序

简介:本资源是一份面向软件工程专业学生、UML初学者及备考人员的系统性试题汇编,聚焦用例图、顺序图与协作图等核心交互建模技能,帮助读者深入理解UML动态建模原理与实际应用差异。资料以1个62KB的Word文档形式呈现,内容涵盖7大知…

2026/10/12 0:26:12 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/11 14:36:54 阅读更多 →