PHP加权成绩计算器输出值错误,请求技术协助
加权成绩计算器错误排查与修复
问题概述
编写的PHP加权学业成绩计算器运行结果错误:输入3个作业,填写成绩和权重后,预期输出当前班级平均分61.67%、剩余考核需达135%,但实际输出不符。
错误原因分析
数组索引不匹配
表单生成时,作业的成绩和权重输入框name属性使用$i从1开始的索引(如keep-numassignments[1]),但计算时的for循环从$i=0开始取值,导致无法正确获取POST提交的数组值,加权计算完全错误。未定义变量导致输入框异常
成绩和权重输入框的value属性使用了未定义的$keep_numassignments和$weightnum变量,会在输入框中输出无效内容,可能干扰表单提交。剩余成绩计算公式逻辑错误
原公式错误推导了剩余考核所需分数的计算逻辑,无法得到正确结果。
修复后的完整代码
<?php $numassignments = isset($_GET['numassignments']) ? $_GET['numassignments'] : 0; ?> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Lab 01 - Final Grade Calculator</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> </head> <body> <div class="container"> <h1 class="mt-5">Final Grade Calculator</h1> <p>Welcome to the Final Grade Calculator!</p> <div class="alert alert-info mb-5"> <h2 class="form-text fs-4 mb-4">To get started, please enter the number of assignments that you've completed so far.</h2> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get"> <fieldset> <div class="mb-3"> <label for="numassignments" class="form-label">Number of Assignments:</label> <input type="number" class="form-control" name="numassignments" id="numassignments" min="1" max="10" value="<?php echo $numassignments ?>" required> </div> <p class="form-text">How many assignments have you already completed in this course?</p> </fieldset> <div class="mb-3"> <input type="submit" name="submit" value="Generate Rows" class="btn btn-primary"> </div> </form> </div> <!-- Second form --> <?php if (isset($_GET['numassignments']) && $_GET['numassignments'] > 0) : ?> <div class="alert alert-info mb-5"> <h2 class="form-text fs-4 mb-4">Next, for each assignment, add the grade that you received and the assignment's overall weight.</h2> <form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post"> <fieldset> <?php $desired = isset($_POST["desired"]) ? $_POST["desired"] : 0; for ($i = 1; $i <= $numassignments; $i++) { echo "<div class=\"row\">"; echo " <div class=\"col-md-6\">"; //grade input echo " <div class=\"mb-3\">"; echo " <label for=\"keep-numassignments{$i}\" class=\"form-label\">Assignment " . $i . " Grade:</label>"; // 移除未定义的默认值变量 echo " <input type=\"number\" class=\"form-control\" name=\"keep-numassignments[$i]\" id=\"keep-numassignments{$i}\" min=\"0\" max=\"100\" required>"; echo " </div>"; echo " </div>"; echo " <div class=\"col-md-6\">"; //weight input echo " <div class=\"mb-3\">"; echo " <label for=\"weightnum{$i}\" class=\"form-label\">Assignment " . $i . " Weight:</label>"; // 移除未定义的默认值变量 echo " <input type=\"number\" class=\"form-control\" name=\"weightnum[$i]\" id=\"weightnum{$i}\" min=\"1\" max=\"100\" required>"; echo " </div>"; echo " </div>"; echo " </div>"; } ?> <p class="form-text">Finally, if you would like to calculate what you will need to get on the remainder of your coursework in order to receive a certain grade, enter your desired grade below.</p> <div class="mb-3"> <label for="desired" class="form-label">Desired Final Grade (Optional):</label> <input type="number" class="form-control" name="desired" id="desired" min="0" max="100" value="<?php echo $desired; ?>"> </div> </fieldset> <div class="mb-3"> <input type="submit" name="gradesubmit" value="Calculate Grade" class="btn btn-primary"> </div> </form> </div> <?php endif; ?> <?php if (isset($_POST['gradesubmit'])) { // Retrieve the values from the form $grades = isset($_POST["keep-numassignments"]) ? $_POST["keep-numassignments"] : []; $weights = isset($_POST["weightnum"]) ? $_POST["weightnum"] : []; $desired = isset($_POST["desired"]) ? $_POST["desired"] : 0; // Calculate the weighted average of completed assignments $weightedSum = 0; $totalWeight = 0; // 使用foreach循环遍历数组,避免索引不匹配问题 foreach ($grades as $key => $grade) { $weight = $weights[$key] ?? 0; $weightedSum += ($weight * $grade); $totalWeight += $weight; } $currentAverage = ($totalWeight > 0) ? ($weightedSum / $totalWeight) : 0; // Calculate the required grade on remaining assessments $requiredGrade = 0; if ($totalWeight < 100 && $desired > 0) { $remainingWeight = 100 - $totalWeight; // 修正剩余成绩计算公式 $requiredGrade = ($desired * 100 - $weightedSum) / $remainingWeight; } // Display the results echo "<div class=\"alert alert-success mb-5\">"; echo " <p>Current Class Average: " . number_format($currentAverage, 2) . "%</p>"; if ($desired > 0) { echo " <p>Required Grade on Remaining Assessments: " . number_format($requiredGrade, 2) . "%</p>"; } echo " </div>"; } ?> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script> </body> </html>
修复说明
- 数组索引修复:将计算部分的
for循环改为foreach遍历数组,确保每个成绩和对应的权重正确匹配,避免索引不匹配导致的取值错误。 - 输入框默认值修复:移除成绩和权重输入框中未定义的变量,避免无效内容干扰表单提交。
- 计算公式修复:重新推导剩余考核所需分数的计算公式,正确逻辑为:
(目标分数*100 - 当前加权总分) / 剩余权重,确保结果符合预期。
内容的提问来源于stack exchange,提问作者Trap House
相关产品推荐
相关产品推荐

