You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP加权成绩计算器输出值错误,请求技术协助

加权成绩计算器错误排查与修复

问题概述

编写的PHP加权学业成绩计算器运行结果错误:输入3个作业,填写成绩和权重后,预期输出当前班级平均分61.67%、剩余考核需达135%,但实际输出不符。

错误原因分析

  1. 数组索引不匹配
    表单生成时,作业的成绩和权重输入框name属性使用$i从1开始的索引(如keep-numassignments[1]),但计算时的for循环从$i=0开始取值,导致无法正确获取POST提交的数组值,加权计算完全错误。

  2. 未定义变量导致输入框异常
    成绩和权重输入框的value属性使用了未定义的$keep_numassignments和$weightnum变量,会在输入框中输出无效内容,可能干扰表单提交。

  3. 剩余成绩计算公式逻辑错误
    原公式错误推导了剩余考核所需分数的计算逻辑,无法得到正确结果。

修复后的完整代码

<?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>

修复说明

  1. 数组索引修复:将计算部分的for循环改为foreach遍历数组,确保每个成绩和对应的权重正确匹配,避免索引不匹配导致的取值错误。
  2. 输入框默认值修复:移除成绩和权重输入框中未定义的变量,避免无效内容干扰表单提交。
  3. 计算公式修复:重新推导剩余考核所需分数的计算公式,正确逻辑为:(目标分数*100 - 当前加权总分) / 剩余权重,确保结果符合预期。

内容的提问来源于stack exchange,提问作者Trap House

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:24:49