如何用Dart/JavaScript实现NATA多场次成绩的规则计算?
Dart/JavaScript 实现 NATA 成绩计算逻辑方案
核心需求回顾
- 必填输入:12年级得分、对应考试满分
- 可选输入(至少填1个):3次NATA考试得分
- 计算规则:
- 仅1个有效NATA成绩 → 返回该成绩
- 2个有效NATA成绩 → 返回两者平均值
- 3个有效NATA成绩 → 取分数较高的两个计算平均值
Dart 实现代码
先封装核心计算逻辑为独立函数,替换原print语句的关键是将计算结果对接实际业务场景(如页面展示、数据存储等):
// 核心计算函数:处理NATA成绩逻辑 double calculateNataScore(List<double?> nataScores) { // 过滤空值,保留有效成绩 List<double> validScores = nataScores.where((score) => score != null).cast<double>().toList(); switch (validScores.length) { case 1: return validScores.first; case 2: return (validScores[0] + validScores[1]) / 2; case 3: // 升序排序后取后两个(较高的分数)计算平均 validScores.sort(); return (validScores[1] + validScores[2]) / 2; default: throw Exception("至少需要填写1个NATA成绩"); } } void main() { // 模拟用户输入(实际场景可从表单/控制台获取) double twelfthGradeScore = 92.5; double twelfthMaxScore = 100.0; // 示例:用户填了2个NATA成绩,第三个留空 List<double?> userNataScores = [115.0, 128.0, null]; try { double finalNataScore = calculateNataScore(userNataScores); // 替换原print语句:根据业务需求处理结果 // 控制台输出示例 print("12年级得分: $twelfthGradeScore/$twelfthMaxScore"); print("最终NATA有效得分: ${finalNataScore.toStringAsFixed(2)}"); // Web场景下可更新DOM,例如: // document.getElementById('nata-result')?.textContent = "最终NATA有效得分: ${finalNataScore.toStringAsFixed(2)}"; } catch (error) { print(error.toString()); } }
JavaScript 实现(可选)
如果需要在Web前端实现,逻辑完全一致:
function calculateNataScore(nataScores) { // 过滤无效值(空、NaN) const validScores = nataScores.filter(score => score !== null && !isNaN(score)); switch (validScores.length) { case 1: return validScores[0]; case 2: return (validScores[0] + validScores[1]) / 2; case 3: validScores.sort((a, b) => a - b); return (validScores[1] + validScores[2]) / 2; default: throw new Error("至少需要填写1个NATA成绩"); } } // 调用示例 const twelfthGradeScore = 92.5; const twelfthMaxScore = 100.0; const userNataScores = [115, 128, null]; try { const finalScore = calculateNataScore(userNataScores); // 替换console.log,更新页面元素 document.getElementById('twelfth-score').textContent = `${twelfthGradeScore}/${twelfthMaxScore}`; document.getElementById('nata-result').textContent = `最终NATA有效得分: ${finalScore.toFixed(2)}`; } catch (err) { console.error(err.message); }
关键说明
- 输入处理:通过过滤空值/无效值,确保只计算用户实际填写的成绩
- 逻辑分支:用switch替代if-else让代码更清晰,覆盖所有合法输入场景
- 结果替换:原print语句可替换为业务需求的操作——控制台输出用于调试,DOM更新用于Web页面展示,数据存储则可将结果写入后端接口或本地存储
内容的提问来源于stack exchange,提问作者Stay Foolish
相关产品推荐
相关产品推荐

