期末考试保层次名次计算器 算法解析

最后更新于 2023-05-21 980 次阅读


0.背景

马上迎来高三前最后一次分班,相信同学们对前几次考试在分班考试中占比耿耿于怀。

与此同时,学校说下次分层次将会是2-4-5 为了保在中层次(卓越),折合排名至少在300以内

为了让同学们更方便的计算自己最后一次分班考试需要考入的最低名次,在得到核心算法后我用ChatGPT将这个小东西写了出来,很简单 下面是算法解析及源代码

1.占比计算

根据老王说的


最新算法:上学期0.2×(0.3+0.3+0.4)
这学期0.8×(0.1+0.2+0.3+0.4)

2.计算核心源代码

       <?php
        function calculate_next_rank($current_ranks) {
            // 将输入的排名与对应的比例相乘
            $multiplied_ranks = array_map(function($rank, $ratio) {
                return $rank * $ratio;
            }, $current_ranks, array(0.06, 0.06, 0.08, 0.08, 0.16, 0.24));

            // 计算累加和
            $cumulative_sum = array_sum($multiplied_ranks);

            // 计算下一次考试需要的排名
            $next_rank = (300 - $cumulative_sum) / 0.32;

            return $next_rank;
        }

        // 检查是否收到表单提交的数据
        if (isset($_POST['ranks'])) {
            // 获取用户输入的6次考试排名
            $current_ranks = $_POST['ranks'];

            // 计算下一次需要的排名
            $next_rank = calculate_next_rank($current_ranks);

            echo "<strong>你下次考试需要考进  {$next_rank} 名才可以进入/留在卓越层次。</strong>";
        } else {
            echo "请填写考试排名并提交表单。";
        }
        ?>

3.完整代码(Web应用)

index.php

<!DOCTYPE html>
<html>
<head>
    <title>期末考试保层次最低名次计算器</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f2f2f2;
            margin: 0;
            padding: 20px;
        }

        h1 {
            text-align: center;
        }

        form {
            background-color: #fff;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
            max-width: 500px;
            margin: 0 auto;
        }

        label {
            display: block;
            margin-bottom: 10px;
        }

        input[type="number"] {
            width: 100%;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 3px;
        }

        button[type="submit"] {
            width: 100%;
            padding: 10px;
            background-color: #4CAF50;
            border: none;
            color: #fff;
            cursor: pointer;
            font-size: 16px;
            border-radius: 3px;
        }

        h4 {
            color: black;
        }

        .note {
            margin-bottom: 20px;
        }
    </style>
</head>
<body>
    <style>
    .note-container {
        text-align: center;
    }
</style>

    <h1>期末考试保层次名次计算器</h1>
    <div class="note" class="note-container" align="center";>
    <h4>0.计算数据与王老师本人计算结果有30名左右的浮动差值。<br><text style="text-decoration: line-through; color: grey;">1.请注意:这六次考试的占比计算方式分别为5次0.1和最后一次的0.3x0.8=0.24 (听王杰老师说的)</text><br>2.主要功能及页面美化完全由ChatGPT编写!由Dos7t3r部署于Web服务器供大家使用~<br>
    3.成绩排名仅供参考,有问题可以联系bzy~(<a href="https://www.blog.iambzy.com" target="_blank">www.blog.iambzy.com</a>)<br>
    4.如果你想查看倒数六次的考试成绩(只有2108班的!),请点击<a href="https://view.officeapps.live.com/op/view.aspx?src=https%3A%2F%2Fblog.iambzy.com%2Fdisk%2Fdown.php%2F413d819d65b3b58f87d2c46606997ddd.xlsx" target="_blank">这里!!</a>
    <br>5.本套算法是通用的,你可以分享给别的班的同学一起使用~<br></h4>
    <h4 style="color:red">6.(2023年5月20日20:32:44)算法已更新!<br>最新算法:上学期0.2×(0.3+0.3+0.4)<br>这学期0.8×(0.1+0.2+0.3+0.4) 最后一次0.4还没考 所以不需要填写!!~
    <br>6.算法解析和核心源代码请点→ <a href="https://blog.iambzy.com/p/2859" target="_blank">https://www.blog.iambzy.com/p/2859</a></h4>

     
    </div>

    <div align=center>
       总访问次数: <span id="totalCount"></span>
    </div>
<br>
    <form method="post" action="calculate.php">
        <label for="rank1">1.上学期三诊(占比0.06):</label>
        <input type="number" id="rank1" name="ranks[]" required>

        <label for="rank2">2.上学期期中(占比0.06):</label>
        <input type="number" id="rank2" name="ranks[]" required>

        <label for="rank3">3.上学期期末(占比0.08):</label>
        <input type="number" id="rank3" name="ranks[]" required>

        <label for="rank4">4.下学期一诊(占比0.08):</label>
        <input type="number" id="rank4" name="ranks[]" required>

        <label for="rank5">5.下学期二诊(占比0.16):</label>
        <input type="number" id="rank5" name="ranks[]" required>

        <label for="rank6">6.下学期期中(这次刚考完的 占比0.24):</label>
        <input type="number" id="rank6" name="ranks[]" required>

        <!--<label for="rank7" disable>下学期期末(还没考):</label>-->
        <!--<input type="number" id="rank7" name="ranks[]" required disabled>-->

        <button type="submit">计算</button>
    </form>
    
    <?php
        // 存储总访问次数的文件路径
        $counterFile = 'counter.txt';

        // 递增总访问次数
        $counter = (int)file_get_contents($counterFile);
        $counter++;
        file_put_contents($counterFile, $counter);
    ?>

    <script>
        // 显示总访问次数
        document.addEventListener('DOMContentLoaded', function() {
            var totalCountElement = document.getElementById('totalCount');
            totalCountElement.textContent = "<?php echo $counter; ?>";
        });
    </script>
</body>
<div align="center">
    <br>
    <text>CopyRight @ Dos7t3r <a href="https://blog.iambzy.com" target="_blank">www.blog.iambzy.com</a></text>
</div>
</html>

calculate.php

<!DOCTYPE html>
<html>
<head>
    <title>计算结果</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f2f2f2;
            margin: 0;
            padding: 20px;
        }

        h1 {
            text-align: center;
        }

        .result {
            background-color: #fff;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
            text-align: center;
            margin-bottom: 20px;
        }

        .result strong {
            font-size: 20px;
        }

        .result a {
            display: inline-block;
            margin-top: 10px;
            text-decoration: none;
            color: #4CAF50;
        }
    </style>
</head>
<body>
    <h1>计算结果</h1>

    <div class="result">
        <?php
        function calculate_next_rank($current_ranks) {
            // 将输入的排名与对应的比例相乘
            $multiplied_ranks = array_map(function($rank, $ratio) {
                return $rank * $ratio;
            }, $current_ranks, array(0.06, 0.06, 0.08, 0.08, 0.16, 0.24));

            // 计算累加和
            $cumulative_sum = array_sum($multiplied_ranks);

            // 计算下一次考试需要的排名
            $next_rank = (300 - $cumulative_sum) / 0.32;

            return $next_rank;
        }

        // 检查是否收到表单提交的数据
        if (isset($_POST['ranks'])) {
            // 获取用户输入的6次考试排名
            $current_ranks = $_POST['ranks'];

            // 计算下一次需要的排名
            $next_rank = calculate_next_rank($current_ranks);

            echo "<strong>你下次考试需要考进  {$next_rank} 名才可以进入/留在卓越层次。</strong>";
        } else {
            echo "请填写考试排名并提交表单。";
        }
        ?>
    </div>
<h4>1.请注意:负数为不可能事件,该排名越大越好,越有希望留在卓越层次(300) <br>
3.成绩排名仅供参考,有问题可以联系bzy~(<a href="https://www.blog.iambzy.com" target="_blank">www.blog.iambzy.com</a>)</h4>
    <a href="index.php">返回</a>
</body

同目录下新建counter.txt 用来计算访问次数

507
最后更新于 2023-05-21