📜  使用 JavaScript 设计学生成绩计算器(1)

📅  最后修改于: 2023-12-03 14:49:41.616000             🧑  作者: Mango

使用 JavaScript 设计学生成绩计算器

本文将介绍如何使用 JavaScript 编写一款学生成绩计算器。学生成绩计算器可以帮助老师计算学生的成绩,并且可以快速生成成绩单。本文将以一个简单的学生成绩计算器为例,向读者展示如何编写 JavaScript 代码实现这个功能。

功能需求

学生成绩计算器需要完成以下功能:

  1. 输入学生姓名和课程成绩,并且可以一次性输入多个学生的成绩;
  2. 计算每个学生的总成绩和平均成绩;
  3. 根据学生成绩排名,并且可以输出成绩单。
技术实现

学生成绩计算器需要使用 HTML、CSS 和 JavaScript 三种技术实现。其中,HTML 和 CSS 用于实现页面布局和样式,JavaScript 用于计算成绩和生成成绩单。

页面布局和样式

学生成绩计算器的页面主要分为三个部分:输入区、成绩列表和成绩单。其中,输入区包括学生姓名和课程成绩的输入框,成绩列表显示所有学生的成绩信息,成绩单则按照学生成绩排名显示每位学生的成绩。

页面的布局可以使用 HTML 和 CSS 实现,以下是一个简单的页面布局代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>学生成绩计算器</title>
    <style>
        /* CSS 样式 */
        /* ...... */
    </style>
</head>
<body>
    <div id="input-area">
        <!-- 学生姓名和课程成绩的输入区 -->
    </div>
    <div id="score-list">
        <!-- 成绩列表 -->
    </div>
    <div id="score-report">
        <!-- 成绩单 -->
    </div>
    <script>
        /* JavaScript 代码 */
    </script>
</body>
</html>
计算成绩和生成成绩单

学生成绩计算器的核心功能是计算成绩和生成成绩单,这需要使用 JavaScript 实现。以下是一个简单的 JavaScript 代码实现:

// 输入区表单提交事件
document.querySelector('#input-area form').addEventListener('submit', function (event) {
    event.preventDefault();  // 阻止表单默认行为
    var data = serialize(this);  // 获取表单数据
    if (!check(data)) {  // 校验表单数据
        return false;
    }
    var score = calculate(data);  // 计算成绩
    render(score);  // 渲染成绩列表
    generateReport(score);  // 生成成绩单
});

// 计算成绩
function calculate(data) {
    var score = {};
    for (var i = 0; i < data.length; i++) {
        var name = data[i].name;
        var chinese = parseInt(data[i].chinese);
        var math = parseInt(data[i].math);
        var english = parseInt(data[i].english);
        score[name] = chinese + math + english;
        score[name + '_chinese'] = chinese;
        score[name + '_math'] = math;
        score[name + '_english'] = english;
    }
    return score;
}

// 渲染成绩列表
function render(score) {
    var html = '<table><thead><tr><th>姓名</th><th>语文</th><th>数学</th><th>英语</th><th>总分</th></thead><tbody>';
    for (var name in score) {
        if (!name.endsWith('_chinese') && !name.endsWith('_math') && !name.endsWith('_english')) {
            html += '<tr><td>' + name + '</td><td>' + score[name + '_chinese'] + '</td><td>' + score[name + '_math']
                + '</td><td>' + score[name + '_english'] + '</td><td>' + score[name] + '</td></tr>';
        }
    }
    html += '</tbody></table>';
    document.querySelector('#score-list').innerHTML = html;
}

// 生成成绩单
function generateReport(score) {
    var rank = Object.keys(score).sort(function (a, b) {
        if (a.endsWith('_chinese')) {
            return score[a] - score[b];
        } else if (a.endsWith('_math')) {
            return score[a] - score[b];
        } else if (a.endsWith('_english')) {
            return score[a] - score[b];
        } else {
            return score[b] - score[a];
        }
    });
    var html = '<ol>';
    for (var i = 0; i < rank.length; i++) {
        var name = rank[i].replace(/(_chinese|_math|_english)?$/, '');
        html += '<li>' + name + ':' + score[name] + '分</li>';
    }
    html += '</ol>';
    document.querySelector('#score-report').innerHTML = html;
}

// 获取表单数据
function serialize(form) {
    var data = [];
    var inputs = form.querySelectorAll('input');
    for (var i = 0; i < inputs.length; i += 3) {
        var name = inputs[i].value.trim();
        var chinese = inputs[i + 1].value.trim();
        var math = inputs[i + 2].value.trim();
        var english = 100 - chinese - math;  // 计算英语成绩
        data.push({
            name: name,
            chinese: chinese,
            math: math,
            english: english
        });
    }
    return data;
}

// 校验表单数据
function check(data) {
    var regex = /^[0-9]{1,2}$/;
    for (var i = 0; i < data.length; i++) {
        var name = data[i].name;
        var chinese = data[i].chinese;
        var math = data[i].math;
        if (!name) {
            alert('姓名不能为空!');
            return false;
        }
        if (!regex.test(chinese) || parseInt(chinese) < 0 || parseInt(chinese) > 100) {
            alert('语文成绩必须在 0~100 之间!');
            return false;
        }
        if (!regex.test(math) || parseInt(math) < 0 || parseInt(math) > 100) {
            alert('数学成绩必须在 0~100 之间!');
            return false;
        }
    }
    return true;
}

以上 JavaScript 代码实现了学生成绩计算器的核心功能,需要注意的是,由于本文只是一个简单的示例,这段 JavaScript 代码仅仅实现了一部分功能,读者可以自行扩展完善。