当前位置: 首页 > news >正文

AI应用实践:制作一个支持超长计算公式的计算器,计算内容只包含加减乘除算法,保存在一个HTML文件中

成品地址:超长公式计算器 讯飞星火

<!DOCTYPE html>

<html>

<head>

    <title>超长四则运算计算器</title>

    <style>

        #calculator {

            width: 400px;

            margin: 20px auto;

            padding: 20px;

            border: 1px solid #ccc;

            border-radius: 5px;

            box-shadow: 0 0 10px #eee;

        }

        #display {

            width: 100%;

            height: 50px;

            font-size: 24px;

            text-align: right;

            padding: 10px;

            margin-bottom: 10px;

            border: 1px solid #ccc;

            border-radius: 3px;

        }

        .buttons {

            display: grid;

            grid-template-columns: repeat(4, 1fr);

            gap: 5px;

        }

        button {

            padding: 15px;

            font-size: 18px;

            border: 1px solid #ccc;

            border-radius: 3px;

            cursor: pointer;

        }

        button:hover {

            background-color: #f0f0f0;

        }

    </style>

</head>

<body>

    <div id="calculator">

        <input type="text" id="display" readonly>

        <div class="buttons">

            <button onclick="appendToDisplay('7')">7</button>

            <button onclick="appendToDisplay('8')">8</button>

            <button onclick="appendToDisplay('9')">9</button>

            <button onclick="appendToDisplay('/')">/</button>

            <button onclick="appendToDisplay('4')">4</button>

            <button onclick="appendToDisplay('5')">5</button>

            <button onclick="appendToDisplay('6')">6</button>

            <button onclick="appendToDisplay('*')">×</button>

            <button onclick="appendToDisplay('1')">1</button>

            <button onclick="appendToDisplay('2')">2</button>

            <button onclick="appendToDisplay('3')">3</button>

            <button onclick="appendToDisplay('-')">-</button>

            <button onclick="appendToDisplay('0')">0</button>

            <button onclick="appendToDisplay('.')">.</button>

            <button onclick="clearDisplay()">C</button>

            <button onclick="appendToDisplay('+')">+</button>

            <button onclick="appendToDisplay('(')">(</button>

            <button onclick="appendToDisplay(')')">)</button>

            <button onclick="calculate()">=</button>

        </div>

    </div>

    <script>

        function appendToDisplay(value) {

            document.getElementById('display').value += value;

        }

        function clearDisplay() {

            document.getElementById('display').value = '';

        }

        function calculate() {

            try {

                const expression = document.getElementById('display').value;

                const sanitized = expression.replace(/[^0-9+\-*/().]/g, ''); // 过滤非法字符

                const result = evaluateExpression(sanitized);

                document.getElementById('display').value = result;

            } catch (e) {

                alert("错误: " + e.message);

                clearDisplay();

            }

        }

        function evaluateExpression(expr) {

            // 处理括号

            while (expr.includes('(')) {

                expr = expr.replace(/$([^()]+)$/g, (_, group) => evaluateSimpleExpression(group));

            }

            return evaluateSimpleExpression(expr);

        }

        function evaluateSimpleExpression(expr) {

            // 处理运算符优先级

            const operators = [];

            const operands = [];

            let currentNumber = '';

            

            for (const char of expr) {

                if (!isNaN(char) || char === '.') {

                    currentNumber += char;

                } else {

                    if (currentNumber) {

                        operands.push(parseFloat(currentNumber));

                        currentNumber = '';

                    }

                    while (operators.length > 0 && 

                           precedence(operators[operators.length - 1]) >= precedence(char)) {

                        applyOperation(operands, operators);

                    }

                    operators.push(char);

                }

            }

            

            if (currentNumber) operands.push(parseFloat(currentNumber));

            while (operators.length > 0) {

                applyOperation(operands, operators);

            }

            

            return operands.pop();

        }

        function precedence(op) {

            if (op === '+' || op === '-') return 1;

            if (op === '*' || op === '/') return 2;

            return 0;

        }

        function applyOperation(operands, operators) {

            const b = operands.pop();

            const a = operands.pop();

            const op = operators.pop();

            

            switch(op) {

                case '+': operands.push(a + b); break;

                case '-': operands.push(a - b); break;

                case '*': operands.push(a * b); break;

                case '/': 

                    if (b === 0) throw new Error("除数不能为零");

                    operands.push(a / b); 

                    break;

                default: throw new Error("未知运算符");

            }

        }

    </script>

</body>

</html>

主要功能特点:

  1. 界面设计

    • 响应式布局,适配不同屏幕尺寸

    • 清晰的数字和运算符按钮布局

    • 实时显示输入表达式

    • 错误提示机制

  2. 核心算法

    • 支持括号嵌套运算

    • 遵循运算符优先级规则(先乘除后加减)

    • 支持连续运算(如 1+2+3+4)

    • 自动处理小数运算

    • 输入过滤非法字符

  3. 实现原理

    • 使用逆波兰表达式算法处理运算顺序

    • 分阶段解析表达式:

    1. 处理括号内的子表达式

    2. 按运算符优先级逐步计算

    3. 最终计算结果

  4. 安全机制

    • 输入过滤(仅允许数字、运算符和括号)

    • 除零错误检测

    • 异常捕获处理

使用说明:

  1. 输入数字和运算符(支持+ - * /)

  2. 使用括号改变运算顺序

  3. 点击=号显示计算结果

  4. C按钮清空输入

  5. 支持连续输入(如 1+2 * 3+4/2)

该计算器能够处理包含数百字符的超长表达式,通过分阶段解析和运算符优先级处理确保计算准确性。所有功能均集成在单个HTML文件中,无需外部依赖即可运行。

http://www.xdnf.cn/news/1090333.html

相关文章:

  • 设计模式(行为型)-责任链模式
  • Flink Forward Asia 2025 主旨演讲精彩回顾
  • 两张图片对比clip功能
  • React 19 概览:新特性与生态系统变革
  • 1.1 ARMv8/ARMv9安全扩展
  • 网络安全之RCE分析与利用详情
  • 前端使用Web Cryptography API进行内容加密,几乎无法破解
  • 循环神经网络详解
  • 数据结构之位图和布隆过滤器
  • Web 前端框架选型:React、Vue 和 Angular 的对比与实践
  • [特殊字符] 突破小样本瓶颈:DataDream——用Stable Diffusion生成高质量分类数据集
  • “AI 曼哈顿计划”:科技竞赛还是人类挑战?
  • VUE混合开发,选哪个PHP框架最顺手?
  • 【Qt】Qt QML json处理
  • Qt的信号与槽(三)
  • uniapp小程序无感刷新token
  • 【数字后端】- Standard Cell Status
  • 【机器人】Aether 多任务世界模型 | 4D动态重建 | 视频预测 | 视觉规划
  • vue2中使用xgplayer播放流视频
  • Claude Code 开发使用技巧
  • 【Modern C++ Part7】_创建对象时使用()和{}的区别
  • 从0到1:Maven下载安装与配置全攻略
  • vcpkg交叉编译qt等过程记录(未完成)
  • 华为动态路由配置
  • Git基本操作1
  • git 报错fatal: refusing to merge unrelated histories
  • 城市地质大数据平台:透视地下空间,赋能智慧未来
  • 基于物联网的智能家居控制系统设计与实现
  • 从零开始的云计算生活——番外2,MySQL组复制
  • 项目进度管控缺乏闭环,如何形成反馈机制