html 网站建设中模板wordpress 文章收缩

张小明 2026/1/10 11:06:23
html 网站建设中模板,wordpress 文章收缩,北京工程建设有限公司,常州百度推广公司在完成 Week 1 的 C 语言基础学习后#xff0c;是时候通过实际编程来巩固所学知识了。Problem Set 1 包含四个编程题#xff0c;难度逐步递增#xff0c;涵盖了循环、条件判断、算法设计等核心概念。 官方链接#xff1a;CS50 Problem Set 1 问题1#xff1a;Mario#…在完成 Week 1 的 C 语言基础学习后是时候通过实际编程来巩固所学知识了。Problem Set 1 包含四个编程题难度逐步递增涵盖了循环、条件判断、算法设计等核心概念。官方链接CS50 Problem Set 1问题1Mario简单版问题描述还记得超级马里奥游戏中的阶梯吗我们要用#字符在终端中画出一个右对齐的金字塔。要求提示用户输入金字塔的高度1-8之间使用#字符绘制右对齐的金字塔示例高度为4# ## ### ####示例高度为8# ## ### #### ##### ###### ####### ########解题思路这个问题的关键在于理解行数、空格数、井号数之间的关系行号(i)空格数井号数071162253344.........iheight - i - 1i 1规律空格数height - i - 1随行数增加而减少井号数i 1随行数增加而增加代码实现/* * mario.c (Less Comfortable) * * 打印右对齐的金字塔 */ #include stdio.h #include cs50.h int main(void) { int height; // 使用 do-while 确保输入在 1-8 之间 do { height get_int(Height: ); } while (height 1 || height 8); // 打印金字塔 for (int i 0; i height; i) { // 第一步打印前导空格右对齐 for (int j 0; j height - i - 1; j) { printf( ); } // 第二步打印井号 for (int j 0; j i 1; j) { printf(#); } // 第三步换行 printf(\n); } return 0; }知识点回顾do-while循环先执行一次再检查条件适合输入验证嵌套循环外层控制行数内层控制每行的字符找规律观察输出总结数学关系问题2Mario挑战版问题描述这次我们要画一个双侧金字塔就像马里奥游戏中的两座相邻的阶梯中间有2个空格的间隙。示例高度为4# # ## ## ### ### #### ####示例高度为8# # ## ## ### ### #### #### ##### ##### ###### ###### ####### ####### ######## ########解题思路这个问题是简单版的扩展左侧金字塔和简单版完全一样空格 井号中间间隙固定打印2个空格右侧金字塔打印与左侧相同数量的井号每行结构[空格] [左侧#] [2个空格] [右侧#]代码实现/* * mario.c (More Comfortable) * * 打印双侧金字塔 */ #include stdio.h #include cs50.h int main(void) { int height; // 确保输入在 1-8 之间 do { height get_int(Height: ); } while (height 1 || height 8); // 打印双侧金字塔 for (int i 0; i height; i) { // 第一步打印前导空格右对齐左侧金字塔 for (int j 0; j height - i - 1; j) { printf( ); } // 第二步打印左侧金字塔 for (int j 0; j i 1; j) { printf(#); } // 第三步打印中间间隙固定2个空格 printf( ); // 第四步打印右侧金字塔 for (int j 0; j i 1; j) { printf(#); } // 第五步换行 printf(\n); } return 0; }编程技巧模块化思维把复杂问题拆解成小步骤空格、左侧、间隙、右侧、换行代码复用右侧金字塔的循环和左侧完全一样问题3Cash零钱找零问题描述你在商店工作需要给顾客找零。为了减少找零的硬币数量你需要使用贪心算法。美国硬币面值25美分Quarter10美分Dime5美分Nickel1美分Penny要求给定找零金额单位美分计算最少需要多少枚硬币。示例Change owed: 41 4解释41美分 1个25美分 1个10美分 1个5美分 1个1美分 4枚硬币解题思路贪心算法Greedy Algorithm贪心策略每次都选择面值最大且不超过剩余金额的硬币。算法步骤从最大面值25美分开始尽可能多地使用该面值硬币数 金额 / 面值更新剩余金额金额 % 面值重复步骤2-3直到面值为1美分为什么贪心算法在这里有效因为美国硬币的面值设计1, 5, 10, 25具有特殊性质每个面值都能被更大的面值整除或有合理的倍数关系。但注意贪心算法并不总是适用于所有硬币系统代码实现/* * cash.c * * 使用贪心算法计算最少硬币数 */ #include stdio.h #include cs50.h int main(void) { int cents; // 确保输入是正整数 do { cents get_int(Change owed: ); } while (cents 0); int coins 0; // 硬币总数 // 25美分硬币Quarter coins cents / 25; cents % 25; // 10美分硬币Dime coins cents / 10; cents % 10; // 5美分硬币Nickel coins cents / 5; cents % 5; // 1美分硬币Penny - 剩余全部 coins cents; printf(%i\n, coins); return 0; }运算符回顾/整数除法41 / 25 1取商%取模运算41 % 25 16取余数复合赋值coins 1等同于coins coins 1测试用例输入计算过程输出2525÷2511411×25 1×10 1×5 1×14702×25 2×104993×25 2×10 4×19问题4Credit信用卡验证问题描述验证信用卡号是否有效并识别卡片类型。这个问题需要用到Luhn算法也叫模10算法。卡片规则AMEX美国运通15位以34或37开头MASTERCARD万事达16位以51-55开头VISA维萨13位或16位以4开头示例Number: 4003600000000014 VISA Number: 378282246310005 AMEX Number: 1234567890 INVALIDLuhn算法详解算法步骤从右往左对倒数第2位、第4位、第6位...偶数位置的数字乘以2如果乘积是两位数≥10将两位数字分别相加例如7×214 → 145将所有未乘2的数字奇数位置相加将步骤2和步骤3的和加起来如果总和能被10整除卡号有效示例验证卡号4003600000000014卡号 4 0 0 3 6 0 0 0 0 0 0 0 0 0 1 4 位置 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ 偶数位从右往左 步骤1偶数位乘2 1×22, 0×20, 0×20, 0×20, 0×20, 6×212→(12)3, 0×20, 4×28 步骤2偶数位之和 2 0 0 0 0 3 0 8 13 步骤3奇数位之和 4 0 0 0 0 0 3 0 7 步骤4总和 13 7 20 步骤5检查 20 % 10 0 ✓ 有效代码实现/* * credit.c * * 使用Luhn算法验证信用卡并识别类型 */ #include cs50.h #include stdio.h int main(void) { // 获取信用卡号 long card_number get_long(Number: ); // 计算卡号长度和获取前1位、前2位数字 long temp card_number; int length 0; int first_digit 0; int first_two_digits 0; // 从右往左遍历计算长度并提取前缀 while (temp 0) { first_digit temp % 10; // 最高位会保留到最后 if (temp 10 temp 100) { first_two_digits temp; // 当剩余两位时保存 } temp / 10; length; } // Luhn算法验证 int sum1 0; // 偶数位置倒数第2、4、6...位乘2后的和 int sum2 0; // 奇数位置倒数第1、3、5...位的数字和 temp card_number; int position 1; // 位置计数器从右往左从1开始 while (temp 0) { int digit temp % 10; if (position % 2 0) // 偶数位置 { int product digit * 2; // 如果乘积≥10需要将两位数字分别相加 if (product 10) { sum1 (product / 10) (product % 10); } else { sum1 product; } } else // 奇数位置 { sum2 digit; } temp / 10; position; } int total sum1 sum2; // 检查校验和如果总和不能被10整除卡号无效 if (total % 10 ! 0) { printf(INVALID\n); return 0; } // 根据长度和前缀识别卡类型 if (length 15 (first_two_digits 34 || first_two_digits 37)) { printf(AMEX\n); } else if (length 16 (first_two_digits 51 first_two_digits 55)) { printf(MASTERCARD\n); } else if ((length 13 || length 16) first_digit 4) { printf(VISA\n); } else { printf(INVALID\n); } return 0; }关键技巧1. 如何获取数字的位数和前缀long num 4003600000000014; long temp num; int length 0; while (temp 0) { temp / 10; // 每次去掉最右边一位 length; // 计数 } // 最终 length 162. 如何判断位置从右往左使用一个计数器position从1开始position % 2 0偶数位置position % 2 1奇数位置3. 如何分离两位数对于数字14十位14 / 10 1个位14 % 10 4测试用例可以使用以下测试卡号来自CS50官方卡号类型378282246310005AMEX371449635398431AMEX5555555555554444MASTERCARD5105105105105100MASTERCARD4111111111111111VISA4012888888881881VISA4222222222222VISA (13位)1234567890INVALID关于输入处理的注意事项CS50的get_long()函数会自动处理无效输入如字母、特殊字符如果用户输入了非数字字符它会重新提示用户输入直到得到一个有效的long类型整数。示例$ ./credit Number: 4003-6000-0000-0014 Number: foo Number: 4003600000000014 VISA这是get_long()的内部行为不是bug。它会过滤掉破折号和字母一直重新提示直到得到纯数字输入。代码改进使用函数抽象 ⭐上面的代码虽然能正确工作但所有逻辑都堆在main函数中代码有点臃肿。还记得 Week 1 中我们学到的函数抽象Abstraction吗为什么需要函数抽象回顾 Week 1 的核心思想提高可读性main函数只展示主要流程具体实现细节隐藏在各个函数中便于复用如果需要在多处使用相同功能函数可以被反复调用易于调试每个函数职责单一出错时容易定位模块化设计就像搭积木每个函数是一个积木块思考我们可以抽象哪些功能看看main函数中做了哪些事情✅获取卡号长度→get_length()✅获取第一位数字→get_first_digit()✅获取前两位数字→get_first_two_digits()✅Luhn算法验证→is_valid_luhn()✅识别卡类型→print_card_type()重构后的代码/* * credit.c (重构版 - 使用函数抽象) * * 应用 Week 1 学到的函数抽象思想 */ #include cs50.h #include stdio.h // 函数声明 int get_length(long number); int get_first_digit(long number); int get_first_two_digits(long number); bool is_valid_luhn(long number); void print_card_type(long number); int main(void) { // 获取信用卡号 long card_number get_long(Number: ); // 使用Luhn算法验证卡号 if (!is_valid_luhn(card_number)) { printf(INVALID\n); return 0; } // 识别并打印卡类型 print_card_type(card_number); return 0; } // 函数定义 /* * 计算数字的位数 * 例如get_length(4003600000000014) 返回 16 */ int get_length(long number) { int length 0; while (number 0) { number / 10; length; } return length; } /* * 获取数字的第一位最高位 * 例如get_first_digit(4003600000000014) 返回 4 */ int get_first_digit(long number) { while (number 10) { number / 10; } return number; } /* * 获取数字的前两位 * 例如get_first_two_digits(378282246310005) 返回 37 */ int get_first_two_digits(long number) { while (number 100) { number / 10; } return number; } /* * 使用Luhn算法验证卡号是否有效 * * Luhn算法步骤 * 1. 从右往左对偶数位置的数字乘以2 * 2. 如果乘积≥10将两位数字分别相加 * 3. 将所有数字相加 * 4. 如果总和能被10整除则有效 * * 返回 true 表示有效false 表示无效 */ bool is_valid_luhn(long number) { int sum1 0; // 偶数位置乘2后的和 int sum2 0; // 奇数位置的和 int position 1; while (number 0) { int digit number % 10; if (position % 2 0) // 偶数位置 { int product digit * 2; if (product 10) { // 将两位数分别相加14 → 145 sum1 (product / 10) (product % 10); } else { sum1 product; } } else // 奇数位置 { sum2 digit; } number / 10; position; } int total sum1 sum2; return (total % 10 0); } /* * 根据卡号长度和前缀识别并打印卡片类型 * * 规则 * - AMEX: 15位以34或37开头 * - MASTERCARD: 16位以51-55开头 * - VISA: 13或16位以4开头 */ void print_card_type(long number) { int length get_length(number); int first_digit get_first_digit(number); int first_two_digits get_first_two_digits(number); if (length 15 (first_two_digits 34 || first_two_digits 37)) { printf(AMEX\n); } else if (length 16 (first_two_digits 51 first_two_digits 55)) { printf(MASTERCARD\n); } else if ((length 13 || length 16) first_digit 4) { printf(VISA\n); } else { printf(INVALID\n); } }对比两种实现的优缺点对比维度原始版本函数抽象版本代码行数~60行~130行含注释main函数复杂包含所有逻辑简洁只有6行核心逻辑可读性需要仔细阅读才能理解一眼看出程序结构可维护性修改某个功能需要在main中找直接修改对应函数可复用性逻辑无法复用函数可在其他地方调用调试难度出错时不知道哪部分有问题可以单独测试每个函数适合场景小型程序、快速原型大型项目、团队协作重构版的亮点 ✨main函数清晰明了// 一眼就能看出程序做了什么 // 1. 获取卡号 // 2. 验证有效性 // 3. 打印卡类型函数命名语义化is_valid_luhn()- 一看就知道是验证函数返回boolget_length()- 获取长度返回intprint_card_type()- 打印类型无返回值void文档注释完善每个函数都有说明其功能、参数、返回值符合专业的代码规范单一职责原则每个函数只做一件事如果is_valid_luhn()有bug只需检查这一个函数关于注释风格的说明 你可能注意到函数前面的注释采用了特殊格式。这里我使用的是简化版的文档注释只说明函数的功能和示例。专业代码中的文档注释你现在不需要掌握在大型项目中程序员会使用 Doxygen 或 JavaDoc 风格的注释例如/** * brief 计算数字的位数 * param number 要计算的数字 * return 返回位数 */但对于初学者简单的注释就足够了// 计算数字的位数例如 123 返回 3选择适合自己和团队的注释风格即可是否过度抽象了为了理解巩固函数抽象的知识点上面我把每个可抽象的功能都抽象出来了其实有的是不必要的。必要的抽象 ✅is_valid_luhn()- 非常值得抽象代码有20行逻辑复杂两个sum位置判断乘2等有明确的功能验证卡号返回bool值语义清晰print_card_type()- 值得抽象包含多个if-else判断有明确的功能识别卡类型避免main函数过长可选的抽象 ⚖️get_length(),get_first_digit(),get_first_two_digits()- 可以讨论支持抽象的理由✅ 让main函数更简洁✅ 函数名表达了意图自文档化✅ 如果将来需要在其他地方使用可以直接调用反对抽象的理由❌ 每个函数只有3-5行非常简单❌ 只在一个地方使用没有复用❌ 增加了代码跳转阅读时需要来回翻看更简洁的方案因此可以只保留核心函数#include cs50.h #include stdio.h // 只声明两个最重要的函数 bool is_valid_luhn(long number); void print_card_type(long number); int main(void) { long card_number get_long(Number: ); if (!is_valid_luhn(card_number)) { printf(INVALID\n); return 0; } print_card_type(card_number); return 0; } // Luhn算法验证 bool is_valid_luhn(long number) { // ... (保持不变) } // 识别并打印卡类型 void print_card_type(long number) { // 直接在这里计算长度和前缀不单独抽象 int length 0; long temp number; while (temp 0) { temp / 10; length; } int first_digit number; while (first_digit 10) first_digit / 10; int first_two number; while (first_two 100) first_two / 10; // 判断卡类型 if (length 15 (first_two 34 || first_two 37)) printf(AMEX\n); else if (length 16 (first_two 51 first_two 55)) printf(MASTERCARD\n); else if ((length 13 || length 16) first_digit 4) printf(VISA\n); else printf(INVALID\n); }判断是否需要抽象的标准 问自己这些问题代码行数超过10-15行 → 考虑抽象复用性会在多处使用 → 必须抽象复杂度逻辑复杂难以一眼看懂 → 应该抽象命名价值函数名能让代码更易读 → 值得抽象测试需求需要单独测试这个功能 → 应该抽象结论对于 Problem Set 1 这个规模两种方式都可以完全抽象版更适合学习函数抽象的思想折中版更实用平衡了可读性和简洁性原始版逻辑最直接但main函数较长我的建议作业提交使用原始版或折中版学习目的尝试完全抽象版理解函数设计未来项目根据团队规范和项目大小决定学习建议对于初学者推荐的编码流程第一步先写出能工作的代码像原始版本第二步测试确保功能正确第三步识别可以抽象的部分第四步重构代码将功能封装成函数第五步再次测试确保重构没有引入新bug核心原则抽象是为了解决问题提高可读性、复用性、可维护性而不是为了炫技。如果一个3行的函数只用一次抽象的价值就很有限。总结本次作业涉及的核心概念循环控制使用for循环实现嵌套结构Mario使用do-while验证输入使用while遍历数字的每一位Credit算法思维找规律观察输出抽象出数学关系Mario贪心算法每次选择局部最优解CashLuhn算法理解和实现标准算法Credit数学运算整数除法/和取模%的应用位数计算和数字提取函数抽象⭐将复杂逻辑分解为多个小函数每个函数专注于单一职责提高代码可读性和可维护性函数命名要有意义、一看就懂调试技巧使用printf打印中间变量测试边界情况如高度为1或8使用官方测试用例验证编程建议先理解再编码不要急于写代码先在纸上画出几个例子找规律分步实现把复杂问题拆解成小步骤逐个击破先实现再优化第一遍先让代码工作第二遍再考虑函数抽象和优化充分测试不仅测试正常情况也要测试边界和异常情况代码注释养成写注释的习惯解释你的思路函数抽象当一段代码超过20行或有明确的功能模块时考虑封装成函数扩展思考Mario如果要打印菱形或其他形状如何修改Cash如果硬币面值是[1, 6, 10]贪心算法还有效吗提示对于41美分贪心给出4×10 1×1 5枚但最优是4×10 1×1 5枚。试试25美分的情况Credit为什么要用Luhn算法它能防止什么样的错误提示防止输入错误如数字顺序颠倒函数抽象你能把 Cash 或 Mario 的代码也用函数抽象改写吗什么时候应该使用函数什么时候不需要如果要写一个测试函数test_luhn()应该如何设计参考资料CS50 Problem Set 1 官方页面Luhn算法详解维基百科贪心算法介绍下周我们将学习数组挑战更复杂的问题
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

小网站发布要怎么做学校网站建设工作

还在为Java应用如何高效连接Apache Doris而困扰吗?🤔 本文将通过场景化解决方案,带你快速掌握JDBC驱动的核心用法,避开常见陷阱,构建稳定可靠的数据应用! 【免费下载链接】doris Apache Doris is an easy-t…

张小明 2026/1/9 17:03:21 网站建设

网站营销工作流程宠物网站建设报告

实时监控系统中I2C数据采集的实战精要:从协议到稳定运行在工业自动化、环境监测和物联网边缘节点中,我们常常需要面对这样一个问题:如何用最少的资源,稳定地读取十几个传感器的数据?答案往往藏在一个看似“古老”的总线…

张小明 2026/1/10 7:03:30 网站建设

诸城网站建设多少钱安阳网站公司

vLLM 多模态输入:图像、视频与音频处理全解析 在生成式 AI 快速演进的今天,单一文本推理已无法满足复杂应用场景的需求。从智能客服中的图文问答,到教育平台上的音视频内容理解,再到工业质检中的视觉分析——多模态能力正成为大模…

张小明 2026/1/10 7:03:31 网站建设

网站建设junke100安徽淮南

第一章:告别传统自动化测试,迎接智能新范式随着软件系统复杂度的持续攀升,传统基于脚本的自动化测试逐渐暴露出维护成本高、适应性差、反馈周期长等瓶颈。测试人员频繁陷入“写完即废弃”的循环中,面对UI频繁变更或业务逻辑调整&a…

张小明 2026/1/10 7:17:21 网站建设

html网页爱心代码专业网站seo推广

macOS iSCSI存储扩展终极指南:告别存储空间不足 【免费下载链接】iSCSIInitiator iSCSI Initiator for macOS 项目地址: https://gitcode.com/gh_mirrors/is/iSCSIInitiator 你的Mac存储空间又告急了?面对不断积累的项目文件、视频素材和重要数据…

张小明 2026/1/10 7:03:32 网站建设

哪个网站可以做彩经专家网页加速器安卓

Excalidraw 支持 Service Worker 缓存,离线体验增强 在如今频繁切换网络环境的工作场景中——地铁隧道里、远程会议中途断网、机场候机厅信号微弱——我们对 Web 应用的“韧性”提出了更高要求。一个理想的在线工具,不该因为几秒钟的网络抖动就丢失内容、…

张小明 2026/1/10 7:20:14 网站建设