完整指南)
Making Decisions 实战在 Web-Dev-For-Beginners 中构建学生成绩处理器Student Grade Processor完整指南【免费下载链接】Web-Dev-For-Beginners24 Lessons, 12 Weeks, Get Started as a Web Developer项目地址: https://gitcode.com/GitHub_Trending/we/Web-Dev-For-Beginners本文围绕 Web-Dev-For-Beginners 课程JavaScript Basics模块第 3 课《Making Decisions》的课后作业 assignment.md 展开你将基于if...else分支、typeof类型判断、比较运算符与逻辑运算符完成一个处理两套不同评分体系的学生成绩筛选程序。读完后你将掌握如何在动态类型的 JavaScript 中编写可靠的分支逻辑并学会用多组测试数据验证、以及用校验、统计、分数换算三个方向对程序做实战扩展。任务背景两套评分体系的合并处理问题作业文档给出了一个贴近真实业务的问题设定你所在学校最近与另一所学校合并现在需要处理来自两套完全不同的评分体系的学生成绩并判断哪些学生通过passing。这正是练习条件逻辑conditional logic的典型场景。作业的学习目标是引自 assignment.mdIn this assignment, youll practice the decision-making concepts from this lesson by building a program that processes student grades from different grading systems. Youll useif...elsestatements, comparison operators, and logical operators to determine which students pass their courses.两套评分体系的规则拆解在写任何代码之前先把两套体系的判定规则拆清楚。这是整个程序判定逻辑的唯一事实来源维度第一套体系Numeric 数字制第二套体系Letter 字母制成绩形态数字 1–5字符串A、A-、B、B-、C、C-及格线3 及以上3、4、5列出的全部字母成绩均及格不及格情形小于 31 或 2该体系不包含D、F等不及格字母两条规则对分支逻辑的直接影响数字制只需要一个范围比较grade 3字母制没有大小顺序可比较只能做白名单成员判断检查该字符串是否属于六个有效字母成绩之一这正是作业指定用逻辑运算符||串联多个等值判断的原因。任务定义allStudents 样本数据与期望输出作业给定如下混合数组allStudents要求构造新数组studentsWhoPass收集其中所有及格的成绩let allStudents [ A, // Letter grade - passing B-, // Letter grade - passing 1, // Numeric grade - failing 4, // Numeric grade - passing 5, // Numeric grade - passing 2 // Numeric grade - failing ]; let studentsWhoPass [];逐个元素的判定过程如下元素typeof结果适用规则判定Astring字母制白名单命中及格B-string字母制白名单命中及格1number1 3为 false不及格4number4 3为 true及格5number5 3为 true及格2number2 3为 false不及格期望输出为[A, B-, 4, 5]。注意结果的顺序与输入顺序一致——因为studentsWhoPass是按遍历顺序逐个push进去的这也为后续测试验证提供了确定性基准。参考实现完整可运行的解决方案作业给出的 Step-by-Step 方法是四步1设一个循环遍历每个成绩2检查成绩类型数字还是字符串3按对应体系的规则判定数字看 3字符串看是否属于有效及格字母4把及格成绩 push 进结果数组。下面是一份严格按这四步实现的参考代码let allStudents [ A, // Letter grade - passing B-, // Letter grade - passing 1, // Numeric grade - failing 4, // Numeric grade - passing 5, // Numeric grade - passing 2 // Numeric grade - failing ]; let studentsWhoPass []; // 步骤 1循环遍历 allStudents 中的每个成绩 for (const grade of allStudents) { // 步骤 2先判断类型——是数字成绩还是字母成绩 if (typeof grade number) { // 步骤 3a数字体系—— 3 及格 if (grade 3) { // 步骤 4把及格成绩加入结果数组 studentsWhoPass.push(grade); } // 数字且 3不及格什么都不做 } else if (typeof grade string) { // 步骤 3b字母体系——逐个核对六个有效及格字母 if (grade A || grade A- || grade B || grade B- || grade C || grade C-) { studentsWhoPass.push(grade); } // 字符串但不在白名单内如 D视为无效/不及格 } // 其他类型undefined、null、boolean 等默认不通过 } console.log(studentsWhoPass); // [A, B-, 4, 5]实现中有两个值得注意的设计决策类型分派type dispatch放在最外层。因为 JavaScript 是动态类型语言同一个数组里可以合法地混放字符串和数字这正是本任务的核心难点所以先问类型、再选规则必须发生在任何规则判断之前。反过来如果你先写grade 3字符串A参与比较时行为将完全不可预期。字母判断用而非。配套课程 README 明确指出严格相等会同时检查值和类型5 5返回false而宽松相等会先做隐式类型转换Always useand!for equality checks unless you specifically need type conversion。在本任务中字符串与字符串比较用是最稳妥的写法。作业点名的五项关键技术工具assignment 的 Helpful Code Techniques 一节明确列出了本课要练习的五个技术点。结合上面参考实现它们各自承担的职责如下技术点作业原话要点在本任务中的职责typeof运算符typeof grade number判断是否数字成绩最外层分派决定走数字规则分支还是字母规则分支比较运算符用比较数字成绩数字体系的及格线判定grade 3逻辑运算符用||检查多个字母成绩条件串联六个字母的白名单成员判断if...else语句处理不同的评分体系两套规则互斥执行保证每个成绩只走一条路径数组方法.push()把及格成绩加入新数组结果收集器其中||Logical OR值得再展开一句作业要求用它检查多个字母条件从源码行为上看它做短路求值——六个等值判断中只要有一个为true后面的表达式就不再求值直接得到true。配套课程在讲时特别提到了这一特性Performance tip: JavaScript uses short-circuit evaluation||同理。把最可能命中的条件放在链条前端在性能敏感场景下是惯例写法本任务六个分支概率接近按字母顺序排列即可。测试你的解决方案assignment 的 Testing Your Solution 一节要求用不同组合的成绩验证代码原文给出的两组测试数据是// Test with different grade combinations let testGrades1 [A-, 3, C, 1, B]; let testGrades2 [5, A, 2, C-, 4]; // Your solution should work with any combination of valid grades按作业定义的两套规则推导这两组数据的期望输出分别是测试输入逐元素判定期望的studentsWhoPass[A-, 3, C, 1, B]A-通过3 3通过C通过1 3失败B通过[A-, 3, C, B][5, A, 2, C-, 4]5通过A通过2 3失败C-通过4通过[5, A, C-, 4]验证方法很简单把循环逻辑封装成可复用的形式或直接在每次运行前重置studentsWhoPass []用console.log/console.table输出结果与期望值比对。除了这两组提交前还应考虑 assignment Submission Guidelines 提示的边界场景例如空数组应得到[]而不是报错和意外的数据类型参考实现中else if (typeof grade string)之后的隐式兜底分支就是为这类输入准备的。附加挑战校验、统计与成绩换算assignment 在基础任务之外给出了三个扩展方向Bonus Challenges逐个说明实现思路1加入校验Add validation。检测非法成绩例如负数字或不在白名单里的字母。核心做法是在两套规则内部再各加一层合法性判断数字制要求grade 1 grade 5字母制则检查grade是否属于六个有效字母两者都不满足时console.log出告警而不是静默丢弃。2统计通过/失败人数Count statistics。借助条件表达式把判定结果收敛为布尔值再累加计数。这里可以顺带练习课程中的三元运算符let passCount 0; let failCount 0; for (const grade of allStudents) { // 三元运算符数字制看 3字母制看白名单 const isPassing (typeof grade number) ? grade 3 : (grade A || grade A- || grade B || grade B- || grade C || grade C-); if (isPassing) { passCount; } else { failCount; } } console.log(Passing: ${passCount}, Failing: ${failCount}); // 对 allStudentsPassing: 4, Failing: 23成绩换算Grade conversion。把所有成绩统一到数字制A5、B4、C3等。用switch实现还能顺带练习课程中讲的多分支结构并且演示了break的用途——多个case连续叠放、共用一个出口fall-through正是忘记 break 会发生什么这个问题的反面教材function convertToNumber(grade) { if (typeof grade number) { return grade; // 已经是数字制原样返回 } switch (grade) { case A: case A-: return 5; case B: case B-: return 4; case C: case C-: return 3; default: return null; // 无法识别的字母成绩 } } // convertToNumber(B-) - 4 // convertToNumber(4) - 4 // convertToNumber(D) - null注意switch中每个分支用return而非break提前退出避免了 fall-through 带来的连锁执行——课程 README 强调switch适用于一个变量对比多个离散值的场景而范围判断如 3仍应使用if...else本任务的字母白名单恰好落在前者。评分标准Rubric与提交清单assignment 附带的评分表从四个维度、每维 1–4 分评估作业完整继承如下维度优秀 (4)熟练 (3)发展中 (2)起步 (1)功能性程序正确识别两套体系中的全部及格成绩程序基本可用存在小问题或边界瑕疵程序部分可用但有逻辑错误程序存在严重错误或无法运行代码结构代码整洁、组织良好if...else逻辑得当结构良好条件语句使用恰当结构尚可但有一定组织问题结构差逻辑难以跟随概念运用有效运用比较运算符、逻辑运算符与条件语句良好运用课程概念存在小缺口运用了部分课程概念但缺少关键要素课程概念运用有限问题解决对问题理解清晰解法思路优雅解题思路良好逻辑扎实解决问题能力尚可略有混乱思路不清未体现出理解提交前的四项检查清单引自 assignment Submission Guidelines用题目给出的示例充分测试代码为逻辑尤其是条件语句添加注释核对输出与期望结果[A, B-, 4, 5]一致考虑边界情况如空数组、意外数据类型。作业最后还附了一条 Pro TipStart simple! 先让基础功能跑起来再叠加更复杂的功能——目标是运用本课学到的工具练习决策逻辑而不是追求炫技。现实印证同一决策模式在仓库真实项目中的应用本作业的分支模式并非孤立练习。仓库中的 memory-game/components/MemoryGame.jsxNext.js 记忆翻牌游戏组件里可以看到与作业完全同构的决策代码范围 整除的复合校验网格尺寸输入处理中用if (2 size size 10 (size % 2 0))同时约束范围与奇偶性不满足时进入else分支给出错误提示见 MemoryGame.jsx#L26-L34——这正是作业 Bonus 1加校验思路的实战版多分支状态机handleClick依据disabled、won守卫条件和flipped.length的取值0 或 1走不同分支逻辑骨架与作业的类型分派 → 规则判定一致见 MemoryGame.jsx#L74-L92短路求值胜利判定if (selectedPairs.length array.length array.length 0)中左侧为false空数组时右侧根本不会被求值避免了空数组场景下的无谓比较见 MemoryGame.jsx#L97-L101三元表达式渲染层用{isFlipped(card.id) ? card.number : ?}与{won ? You Won! : }做行内二选一见 MemoryGame.jsx#L142对应课程中简单条件赋值可用三元替代 if...else的写法。从源码结构看作业里先判类型/状态、再按规则分支的写法与真实项目中的输入校验、状态守卫、UI 条件渲染一脉相承——完成这份作业等于提前接触了后续项目如本仓库的 memory-game 与 quiz-app中会反复出现的决策骨架。相关学习资源本课完整讲义布尔、比较运算符表、if/if...else/switch、逻辑运算符、三元表达式与短路求值2-js-basics/3-making-decisions/README.md本作业原文2-js-basics/3-making-decisions/assignment.md下一课《Arrays and Loops》作业中.push()与循环遍历的延伸2-js-basics/4-arrays-loops/README.mdJavaScript 基础模块总览共 4 课2-js-basics/README.md真实决策逻辑参考实现memory-game/components/MemoryGame.jsx【免费下载链接】Web-Dev-For-Beginners24 Lessons, 12 Weeks, Get Started as a Web Developer项目地址: https://gitcode.com/GitHub_Trending/we/Web-Dev-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考