Django开发微信小程序之逆波兰计算器(二)计算器实现算法

django基于Python的网上点餐微信小程序(程序+开题) 研究目的: 本研究的主要目的是开发一款基于Python的网上点餐微信小程序,通过对系统功能的完善和优化,提高用户的使用体验,满足用户多样化的需求。2)优化系统性能,提高系统的稳定性和可扩展性;研究意义: 本研究旨在开发一款基于Python的网上点餐微信小程序,通过对系统功能的完善和优化,提高用户的使用体验,满足用户多样化的需求。[7] 郭婺, 郭建, 张劲松, 石翠萍, 刘道森, 刘超. 基于Python的网络爬虫的设计与实现[J]. 信息记录材料, 2023, 24 (04): 159-162. 阅读详情

下面将着重讲解如何实现计算器,使其可以进行小数、负数的加减乘除计算,并显示结果给用户

处理用户输入

用户输入一长串的表达式,里面有数字,有加减乘除符号,有括号,我们应该把用户输入的表达式记录下来,并进行适当的划分,将数字和符号分开来,为后续的计算做准备

首先我们在为每个按钮都设置一个data-value自定义属性,从而在后台知道用户按了哪一个键

<view class="button_area" bindtap='clickButton'>
    <view class="row">
      <button class="row1-item button_item" data-value="7" hover-stay-time='120'>7</button>
      <button class="row1-item button_item" data-value="8" hover-stay-time='120'>8</button>
      <button class="row1-item button_item" data-value="9" hover-stay-time='120'>9</button>
      <button class="row1-item button_item" data-value="/" hover-stay-time='120'>/</button>
      <button class="row1-item button_item" data-value="back" hover-stay-time='120'>←</button>
    </view>
    <view class="row">
      <button class="row1-item button_item" data-value="4" hover-stay-time='120'>4</button>
      <button class="row1-item button_item" data-value="5" hover-stay-time='120'>5</button>
      <button class="row1-item button_item" data-value="6" hover-stay-time='120'>6</button>
      <button class="row1-item button_item" data-value="*" hover-stay-time='120'>*</button>
      <button class="row1-item button_item" data-value="." hover-stay-time='120'>.</button>
    </view>
    <button class="button_item equal" data-value="=" hover-stay-time='120'>=</button>
    <view class="row short">
      <button class="row1-item button_item" data-value="1" hover-stay-time='120'>1</button>
      <button class="row1-item button_item" data-value="2" hover-stay-time='120'>2</button>
      <button class="row1-item button_item" data-value="3" hover-stay-time='120'>3</button>
      <button class="row1-item button_item" data-value="-" hover-stay-time='120'>-</button>
    </view>
    <view class="row short">
      <button class="row1-item button_item" data-value="0" hover-stay-time='120'>0</button>
      <button class="row1-item button_item brace" data-value="(" hover-stay-time='120'>(</button>
      <button class="row1-item button_item brace" data-value=")" hover-stay-time='120'>)</button>
      <button class="row1-item button_item" data-value="+" hover-stay-time='120'>+</button>
    </view>
  </view>

在js文件中,我们使用两个数组来保存用户输入的表达式,一个用于显示给用户看,一个用于实际计算,你也可以只使用一个数组,看个人喜好。

data: {
    expression:{
      ForCustomer:[],  //用于显示给用户,存储用户输入的数据
      ForCompute:[]    //用于进行计算,存储转换后的输入数据
    },
    value:0,    //文本框的显示值
  },

下面我们就开始处理用户输入,主要在clickButton事件程序中,主要思路就是把用户每个输入都依次存入到ForCustomer中,而把数字和符号划分后的输入存入到ForCompute中。在进行表达式划分时,主要遵循以下原则:

  • 将表达式中的数字和符号分开,例如表达式是1*20-3+40,那么ForCustomer的值应该为['1','*','2','0','-','3','+','4','0'],而ForCompute的值应该为['1','*','20','-','3','+','40']
  • 小数点应该放置在数字中,而不是作为单独的符号,例如表达式是1.1+0.3,那么ForCompute的值应该为['1.1','+','0.3']
  • 当减号前面是左括号或者没有任何数字和符号时,应将其视为负号,例如表达式是-3-5+(-6),那么ForCompute的值应该为['-3','-','5','+','(','-6',')']
  • 0前面没有数字或符号时,应不许输入,防止出现01+1这样的表达式
  • 当用户点击回退按钮时,应每次都弹出一个字符

下面就是clickButton的代码,对用户每次输入进行判定,执行相应的操作

clickButton: function(event){
    var button_value = event.target.dataset.value,
        show_value = '',
        result_value = 'none',
        expression_show = this.data.expression.ForCustomer,
        expression_value = this.data.expression.ForCompute,
    var length = expression_value.length,
        show_length = expression_show.length,
        zero_flag = true;
    if (button_value){
        switch (button_value) {
          case 'back':  //用户点击后退删除按钮
                if (show_length >= 1){
                      expression_show.pop();
                      if (expression_value[length - 1].length > 1 && expression_value[length - 1] != 'ERROR' && expression_value[length - 1] != '0不能做除数'){
                        expression_value[length - 1] = expression_value[length - 1].substr(0, expression_value  [length - 1].length -1);
                      }else{
                        expression_value.pop();
                      }
                      if (show_length == 1 ){
                          show_value = '0';
                      }
                }
                break;
          case '=':  //用户点击等于按钮,进行计算
                if (length > 2){
                    result_value = this.calculate(expression_value);
                    if (result_value == 'zero'){
                        result_value = '0不能做除数';
                    }else if (isNaN(result_value)){  //若计算结果非数字,则出现错误
                        result_value = 'ERROR';
                    }
                }
                break;
          default:  
                if (isNaN(button_value)){  //用户点击非数字按钮
                    if (button_value == '.' && !isNaN(expression_value[length - 1])) {  //处理小数点问题
                        expression_value[length - 1] += button_value;
                    } else {
                        expression_value.push(button_value);
                    }
                } else {   //用户点击数字按钮
                    if (expression_value[length - 1] == '.' || ! isNaN(expression_value[length - 1])){  //处理小数点问题
                        expression_value[length - 1] += button_value;
                    } else if (expression_value[length - 1] == '-' && (length < 2 || expression_value[length - 2] == '(')) {  //处理负号问题
                        expression_value[length - 1] += button_value;

                    } else if (button_value == '0' && length == 0){   //0不能作为表达式开头
                        zero_flag = false;
                    } else {
                        expression_value.push(button_value);
                    }
                }
                if (zero_flag){
                    expression_show.push(button_value);
                }
                break;
        }

        if (show_value !== '0'){     //将表达式数组转换为字符串
            show_value = expression_show.join('');
        }

        if (result_value !== 'none'){  //当有计算结果时,清空输入的数据,并将计算结果显示
            show_value = result_value;
            expression_show.length = 0;
            expression_value.length = 0;
            expression_show.push(result_value);
            expression_value.push(result_value);
        }

        if (show_value){   //显示结果
            this.setData({
              value: show_value
            });
        }
    }
  },

计算表达式

经过上述的输入处理,用户输完表达式后,我们就可以得到相应的表达式数组。例如用户输入-0.1+(3-0.5)*2,此时ForCustomer的值应该为['-','0','.','1','+','(','3','-','0','.','5',')','*','2'],而ForCompute的值应该为['-0.1','+','(','3','-','0.5',')','*','2']。我们计算只需要ForCompute的值。**我们主要使用的是逆波兰算法,在此过程利用栈,先将中缀表达式转换为后缀表达式,再计算后缀表达式的值。该算法作为基本的算法,需要掌握,不清楚的自行百度。**有一种更简单的方法,就是直接传入表达式字符串,使用eval()函数计算表达式的值,但这样就太没有意思了。

将处理后的表达式数组传入calculate函数进行计算

calculate: function(expressions){
      var transfer_stack = [],   //用于中缀表达式转后缀表达式
          temp_stack = [],       //用于存储中缀表达式
          calculate_stack = [],  //用于计算中缀表达式
          result = 0,           //计算的结果
          priority_table = {     //符号优先级表
              '*' : 2,
              '/' : 2,
              '+' : 1,
              '-' : 1,
              '(' : 0,
              ')' : 3
          };
      /*
        将中缀表达式转换为后缀表达式
      */
      for (var value in expressions){   
        if (!isNaN(expressions[value])){  //如果是数字,直接输出
            temp_stack.push(expressions[value]);
          } else {
              if (expressions[value] == ')'){    //如果是右括号,将左括号之后的项目全部出栈
                  while(transfer_stack.length != 0 && transfer_stack[transfer_stack.length-1] != '('){
                      temp_stack.push(transfer_stack.pop());
                  }
                  transfer_stack.pop();
              } else if (expressions[value] != '(' && priority_table[expressions[value]] <= priority_table[transfer_stack[transfer_stack.length-1]]) {  //如果符号不是左括号,且符号优先级不大于栈顶项目,则依次出栈,直到项目全部出栈或者栈顶项目优先级小于当前符号
                  temp_stack.push(transfer_stack.pop());   
                  while (priority_table[expressions[value]] <= priority_table[transfer_stack[transfer_stack.length - 1]]){
                      temp_stack.push(transfer_stack.pop());
                  }
                  transfer_stack.push(expressions[value]);
              } else { //如果符号是左括号,或者优先级高于栈顶元素,则进栈
                transfer_stack.push(expressions[value]);
              }
          }
      }
      while(transfer_stack.length > 0){  //将剩余的项目全部出栈
          temp_stack.push(transfer_stack.pop());
      }

      /*
      计算后缀表达式
      */

      for (value in temp_stack){ 
          if ( !isNaN(temp_stack[value])){  //如果是数字直接进栈
              calculate_stack.push(temp_stack[value]);
          }else{   //如果是符号,则将栈顶两元素出栈,计算后,再将结果入栈
              var num_1 = Number(calculate_stack.pop()),
                  num_2 = Number(calculate_stack.pop());
              switch (temp_stack[value]){
                case '+':
                    result = num_1 + num_2;
                    break;
                case '-':
                    result = num_2 - num_1;
                    break;
                case '*':
                    result = num_2 * num_1;
                    break;
                default:
                  if (num_1 == 0){
                      result = 'zero';
                  }else{
                      result = num_2 / num_1;
                  }
                  break; 
              }
              calculate_stack.push(result);
          }

          if (isNaN(result)){  //如果出现错误,则退出循环
              break;
          }
      }
      result = calculate_stack.pop();  //取出最终计算结果
      return result;
  },

计算完成后,就返回result结果给clickButton函数,显示给用户,并把将存储表达式两个数组清空,将结果存入后,等待用户后续计算的输入,一次完整的计算过程就已经完成了。


如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

Python在线计算器(完整代码) Python实现在线计算器的完整代码。 阅读详情

相关推荐

基于Python Django后端和网页爬虫的股票信息服务微信小程序开发

主要牵涉到的技术内容,包括python django后端框架, 后端服务器搭建和部署,python网页爬虫技术,微信小程序开发,等等,是一套从后端到前端的完整流程。

weixin_45512098的博客 2490

django+微信小程序入门实战一:简单计算器

准备环境 微信开发工具 django django端 在服务器安装python3和pip3环境,并安装django pip install django 创建django项目 django-admin startproject weixintest 进入项目 cd weixintest 创建App python manage.py startapp CalculateApi 修改calculator/settings.py文件 # 修改 ALLOWED_HOSTS = [] 为

神薯片 650

基于Django创建卡路里计算器

项目使用Python进行开发,Django 框架为 Web 开发提供内置库。编写模型,添加认证和搜索功能,django管理站点创建,并构建卡路里计算器项目的最终GUI。

微信小程序开发之路(十)Django部署服务器&微信小程序第一个计算器项目搭建

1

675

Visual SLAM算法笔记

最近在学习SLAM算法,这里作为阅读笔记记录和总结一下。对经典的单目SLAM/VO算法做了摘要和总结,比如Nister VO、MonoSLAM、PTAM、ORB-SLAM、LSD-SLAM、SVO、DSO等,对几个单目和IMU的融合算法也做了简单总结,比如MSCKF、OKVIS、IMU-Preintegration等。

MulinB的技术博客 3万+

全网最详细单细胞保姆级分析教程(一) ---pbmc

通过观察热图,可以了解不同细胞在主成分上的分布情况,以及主成分与细胞特征之间的关系。数据归一化是数据分析中的常见步骤,旨在消除数据集中不同特征之间的量纲差异,并使它们在相同的尺度上进行比较。函数会根据指定的主成分维度计算数据点之间的距离,并找到每个数据点的邻居。函数会根据数据点之间的相似性将其分组到不同的聚类中。数据缩放是数据分析中的常见步骤,旨在将数据的特征值调整到相似的范围,以避免某些特征对分析结果的过度影响。通过可视化维度载荷,可以了解哪些特征对主成分的形成起到了重要作用,以及不同特征之间的相关性。

ZxVSaccount的博客 6707

Django之开发微信小程序后端-Django篇②

文章目录3-1 Request&Response对象3-2 Django的RESTful URL设计3-3 实现个人助手功能清单发布 3-1 Request&Response对象 3-2 Django的RESTful URL设计 3-3 实现个人助手功能清单发布 apis\views\menu.py 管理app 在app.js中定义全局接口地址 定义传递的应用数据 // pages/menu/menu.js const app = getApp() Page({ /**

王大阳的博客 7084

量化交易新手必看:如何用Python快速接入XTP极速交易系统(附避坑指南)

本文为量化交易新手提供了使用Python快速接入中泰证券XTP极速交易系统的完整指南。文章详细介绍了XTP系统的微秒级性能优势、与CTP系统的核心区别,并逐步讲解了环境配置、API连接、资金查询、下单撤单等关键步骤,同时分享了网络维护、订单处理等实战避坑技巧,帮助开发者高效对接专业交易柜台。

life6的博客 660

Django开发微信小程序之逆波兰计算器(一) 整体介绍

近端时间接触了微信小程序,决定编写一个迷你计算器的小程序试试水,不试不知道,一试爽到爆。总体而言,微信自带的小程序开发工具,用起来还挺方便的。网上用django开发小程序的完整文章也比较少,于是打算做个笔记。 小程序的结构 整个小程序的结构非常简单,就两个页面:index和cal,其中index页面是欢迎页面,用于获取用户授权;而cal页面就是计算器的主体页面。...

zjw_python的博客 2037

SAP 采购申请、采购订单的审批策略

采购申请、采购订单的审批策略 采购申请审批 PR审批可以分为:含分类、无分类 1、无分类PR审批: A、后台配置: 设置批准代码(批准代码可以设置多级审批): 发布批准标识使用系统已有的 “2 询价/采购订单”: 新建采购申请审批策略Z1(仅设置1级审批,一共可以设置8级审......

willieyuan的博客 2万+

【实战项目开发技术分享】机器人安全通过狭窄区域的方案

在机器人的应用领域中,有时会遇到需要机器人通过狭窄区域的情况。无论是室内还是室外,机器人需要具备适应性和灵活性,以便在狭窄的空间中进行安全、高效的导航。本文将提供一些如何让机器人通过狭窄区域的实现方案和思路,希望帮助读者可以根据实际的开发需要进行适当调整和扩展。

xiewf的博客 2万+

关于Django微信小程序本地模拟测试和真机测试

Django微信小程序后台 模拟测试和真机测试 小程序本地开发调试时需要手机与电脑处在同一局域网下

qq_16543239的博客 777

深度强化学习 | 基于SAC算法的移动机器人路径跟踪(附Pytorch实现)

软性演员-评论家(Soft Actor-Critic, SAC)算法是基于最大熵原理的离线策略方法,本节将基于深度强化学习中的SAC算法实现移动机器人的路径跟踪,介绍网络设计、动作空间设计和奖励函数设计,并提供Pytorch实现加深理解

FRIGIDWINTER的博客 5736

一步一步开发微信小程序(Django+Mysql)

微信小程序

perfectzxiny的博客 4206

[网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析

这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步。前文分享了通过Python利用永恒之蓝漏洞加载WannaCry勒索病毒,并实现对Win7文件加密的过程,但过程较为复杂,为什么不直接利用永恒之蓝呢?所以,这篇文章将直接分享MSF利用MS17-010漏洞进行反弹Shell,再上传勒索病毒进行实验复现,并详细讲解WannaCry勒索病毒的原理。基础性文章,希望对您有所帮助。

杨秀璋的专栏 1万+

下载MNIST数据集并使用python将数据转换成NumPy数组(源码解析)

下载MNIST数据集并使用python将数据转换成NumPy数组首先来分析init_mnist函数接下来继续分析load_mnist函数实现数据集转换的python脚本的代码显示MNIST图像并确认数据 下载MNIST数据集并将数据转换成NumPy数组的Python脚本里面最重要的就是load_mnist函数,其他项目想要调用数据集的话,就可以调用load_mnist函数,得到一个字典类型的数据,字典的值是一个Numpy数组。 这些过程是如何实现的,现在开始逐字逐句分析源码: 在load_mnist函数中第

及时总结 4268

Django学习------使用Django制作一个简易计算器页面

文章预览1、创建Django项目2、views.py文件3、urls.py文件4、html页面5、运行结果 最近在学习Django后台开发,以一个简单的页面来记录一下知识点 1、创建Django项目 项目结构如下 配置服务器 2、views.py文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from django.http import HttpResponse from django.shortcuts import render # 计算器 def

niulinbiao的博客 2420

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Django开发微信小程序(五)

等待更新

weixin_43419774的博客 354

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

利用Django制作简易计算器(零基础)

在templates文件夹中,我们开一个HTML文件,这里我命名为main.html(这里我的代码有点繁琐,大佬们可以自己缩减一下)在我们创建的app中,找到views.py文件,在其中编写计算器的基本程序(这里我写的也很繁琐,大佬们可以用函数缩减一下)该计算器在计算小数之间的算法时,可能会出现误差,这是由于浮点数二进制与十进制之间的转化导致的,各位大佬可以自己修改一下。在根目录Calculator_System下面,利用终端,我们再创建一个app,这里我命名为Calculator。

nianyiwu的博客 450

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

django基于微信小程序的手机点餐软件(程序+开题报告)

提高顾客用餐体验:通过手机点餐软件,顾客可以随时随地进行点餐,避免了排队等候的时间,提高了用餐的便捷性。同时,软件可以根据顾客的喜好和消费记录,为其推荐合适的菜品,提高顾客的满意度。[7] 陈佳佳, 邱晓荣, 熊宇昊, 段莉华. 基于Python的人脸识别技术研究[J]. 电脑知识与技术, 2023, 19 (08): 34-36+39.[2] 唐文军, 隆承志. 基于Python的聚焦网络爬虫的设计与实现[J]. 计算机与数字工程, 2023, 51 (04): 845-849.

暨阳程序 1086

python django + 微信小程序 商城源码

随着互联网的快速发展,线上购物越来越普及,而商城小程序作为一种便捷的购物方式,正逐渐成为消费者的首选。为了满足市场需求,我们利用Django和微信小程序技术,设计并实现了一个智能商城小程序,旨在为用户提供更加便捷、智能的购物体验。

weixin_47190619的博客 2238

基于django的微信小程序搭建

因为疫情封校被迫关起来,终于有时间整理之前的课程设计。 基于django的微信小程序搭建(不定期记录踩坑日常)开发工具(一)pycharm(二)mysql(三)微信开发者平台(四)IP穿刺 开发工具 (一)pycharm (二)mysql (三)微信开发者平台 (四)IP穿刺 建议直接安装专业版,安装好之后新建工程,打开File->Setting配置开发环境: notes:新建虚拟环境、需要先安装好pip安装包以便于后期使用pip指令进行一些安装第三方库的方便操作 几个pip 常用指令整理: 安装本

m0_45225362的博客 1万+

【DRF+Django】微信小程序入门到实战_day02(上)

# 课程内容 (1)03_页面跳转 (2)04_页面跳转 (3)05_数据绑定 (4)06_获取用户信息 (5)07_获取用户信息 # 宝剑锋从磨砺出,梅花香自苦寒来

qq_40979183的博客 682

Django小实战——在线Web计算器(利用Bootstrap进行前端开发)

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import

Force~ 4465

django+小程序的心酸过程

工具是Python3.6+Django2.0,最新版本真的很令人头疼,经常有插件不能用。 先说说我对Django做小程序的与Django普通项目感到有些不同的地方。 一、数据转换为json; 二、使用小程序的登录验证; 三、富文本在小程序中的使用。 这几点就是导致我头疼的所有点了。 其实还有一个,因为后台居然被嫌弃简陋,所以去搞了一个xadmin的模板,然而人家不兼容2.0,折腾了半天...

拉拉拉脱的博客 2517

【2025】基于python+django+uniapp的个性化阅读推荐小程序系统(源码、万字文档、图文修改、调试答疑)

不仅帮助用户快速发现优质阅读内容,提升阅读效率,还为管理员提供了高效的内容管理与数据分析工具,推动阅读平台的智能化运营。通过整合 Python 强大的数据处理能力、Django 框架的高效开发特性以及 uniapp 的跨平台开发优势,实现阅读内容的精准推送,提升用户阅读体验,同时简化内容管理流程,提高平台运营效率。管理员使用本系统涉到的功能主要有:系统首页、用户管理、图书分类管理、榜单好书管理、美文管理、美文分类管理、热门资讯管理、资讯分类管理、系统管理等功能。

java_python_php的博客 1376
上一篇: 微信小程序CSS3动画下拉菜单
下一篇: Django开发微信小程序之逆波兰计算器(三)获取用户授权和用户名
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值