Windows Phone简易计算器

本文介绍了一个使用C#实现的逆波兰表达式计算器,能够处理包含小数的数学表达式。该计算器通过将中缀表达式转换为后缀表达式(逆波兰表示法),并进行计算得出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天又修改了几个BUG,加了小数点的处理。


程序主体是封装了转换逆波兰表达式并计算的类。


运行图片:


代码如下(仅后台):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace demo
{
    public partial class MainPage : PhoneApplicationPage
    {
        // 构造函数
        public MainPage()
        {
            InitializeComponent();
        }

        public class calc//运算类
        {
            List<string> sourceList = new List<string>();//中缀表达式
            List<string> destList = new List<string>();//后缀表达式
            private Stack<string> ListStack = new Stack<string>();
            public List<string> SourceList { set { sourceList = value; } get { return sourceList; } }   //访问器
            public List<string> DestList { set { destList = value; } get { return destList; } } //访问器 

            private void changeList()//中缀转后缀
            {
                ListStack.Clear();
                if (0 == this.sourceList.Count) return;
                for (int i = 0; i < sourceList.Count; i++)
                {
                    switch (sourceList[i])
                    {
                        case "+":
                        case "-":
                        case "*":
                        case "/":
                        case "(":
                            operatorStack(sourceList[i]);
                            break;
                        case ")":
                            operatorStack();
                            break;
                        default: //如果是数字,则直接转移
                            this.DestList.Add(sourceList[i]);
                            break;
                    }
                }
                while (ListStack.Count != 0) DestList.Add(ListStack.Pop());
            }

            public double Result() //后缀计算结果
            {
                double Res = 0;
                this.changeList();
                ListStack.Clear();
                foreach (string ch in destList)
                {
                    switch (ch)
                    {
                        case "+":
                            Res = Convert.ToDouble(ListStack.Pop()) + Convert.ToDouble(ListStack.Pop());
                            ListStack.Push(Convert.ToString(Res));
                            break;
                        case "-":
                            Res = 0 - (Convert.ToDouble(ListStack.Pop()) - Convert.ToDouble(ListStack.Pop()));
                            ListStack.Push(Convert.ToString(Res));
                            break;
                        case "*":
                            Res = Convert.ToDouble(ListStack.Pop()) * Convert.ToDouble(ListStack.Pop());
                            ListStack.Push(Convert.ToString(Res));
                            break;
                        case "/":
                            Res = 1 / (Convert.ToDouble(ListStack.Pop()) / Convert.ToDouble(ListStack.Pop()));
                            ListStack.Push(Convert.ToString(Res));
                            break;
                        default://如果是数字,则入栈
                            ListStack.Push(ch);
                            break;
                    }
                }
                return Res;
            }

            public bool compare(string a, string b)//比较优先级
            {
                if (a == "(") return false;//若为左括号,单纯入栈
                if (a == "+" || a == "-")
                {
                    if (b == "*" || b == "/")//若后者优先于前者,返回true
                        return true;
                }
                else
                    if (a == "*" && b == "/") return true;
                return false;
            }
            private void operatorStack(string str)
            {
                if (ListStack.Count != 0)//若栈不为空
                {
                    if (compare(str, this.ListStack.Peek()))
                        this.DestList.Add(ListStack.Pop());
                    this.ListStack.Push(str);
                }
                else
                    this.ListStack.Push(str);
            }
            private void operatorStack()//重载,用于单独处理右括号事件
            {
                string tmp;
                while (ListStack.Count != 0)
                {
                    tmp = ListStack.Pop();
                    if (tmp != "(")
                        DestList.Add(tmp);
                    else
                        return;
                }
            }
        };

        calc cal = new calc();//实例化运算类

        private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {
            //MessageBox.Show( cal.Result().ToString() );
            //========绑定控件数组============
            Button[] btnNum = new Button[10];
            btnNum[0] = btnNum0;
            btnNum[1] = btnNum1;
            btnNum[2] = btnNum2;
            btnNum[3] = btnNum3;
            btnNum[4] = btnNum4;
            btnNum[5] = btnNum5;
            btnNum[6] = btnNum6;
            btnNum[7] = btnNum7;
            btnNum[8] = btnNum8;
            btnNum[9] = btnNum9;

            Button[] btnOperator = new Button[4];
            btnOperator[0] = btnOperator1;
            btnOperator[1] = btnOperator2;
            btnOperator[2] = btnOperator3;
            btnOperator[3] = btnOperator4;

            // ==========添加事件处理=================
            for (int i = 0; i <= 9; i++)
                btnNum[i].Click += new System.Windows.RoutedEventHandler(this.btnNums_Click);
            for (int j = 0; j <= 3; j++)
                btnOperator[j].Click += new System.Windows.RoutedEventHandler(this.btnOperators_Click);
            //==========初始化变量====================
        }
        private void btnNums_Click(object sender, System.EventArgs e)//数字按钮单击事件
        {
            //==========数字连贯输入===============
            if (txtProg.Text == "" && txtResult.Text != "") txtResult.Text = "";//即是判断是否需要重新开始(把上一次计算结果清空)
            txtResult.Text += ((Button)sender).Content.ToString();
            txtProg.Text += ((Button)sender).Content.ToString();
        }
        private void btnOperators_Click(object sender, System.EventArgs e)//运算符按钮单击事件
        {
            if (txtResult.Text != "") cal.SourceList.Add(txtResult.Text);
            else if( txtProg.Text[txtProg.Text.Length-1]!=')' )  return;
            cal.SourceList.Add(((Button)sender).Content.ToString());
            txtProg.Text += ((Button)sender).Content.ToString();
            txtResult.Text = "";
        }

        //等于号处理
        private void btnResult_Tap(object sender, GestureEventArgs e)
        {
            if (txtResult.Text != "") cal.SourceList.Add(txtResult.Text);
            else if (txtProg.Text[txtProg.Text.Length - 1] != ')')  return;
            try
            {
                txtResult.Text = cal.Result().ToString();
            }
            catch (Exception ex) { MessageBox.Show("表达式非法,请按Clear后重新输入~"); }
            txtProg.Text = "";
            cal.SourceList.Clear();
            cal.SourceList.Add(txtResult.Text);//保存结果为左值
        }
        //处理左括号
        private void btnLB_Tap(object sender, GestureEventArgs e)
        {
            try
            {
                txtProg.Text += ((Button)sender).Content.ToString();
                cal.SourceList.Add(((Button)sender).Content.ToString());
            } catch(Exception ex){ }
        }
        //处理右括号
        private void btnRB_Tap(object sender, GestureEventArgs e)
        {
            try
            {
                txtProg.Text += ((Button)sender).Content.ToString();
                cal.SourceList.Add(txtResult.Text);
                cal.SourceList.Add(((Button)sender).Content.ToString());
                txtResult.Text = "";
            }
            catch (Exception ex) { }
        }
        //删除,退格处理
        private void btnOpreaBack_Tap(object sender, GestureEventArgs e)
        {
            if (txtResult.Text != "")
            {
                txtResult.Text = txtResult.Text.Remove(txtResult.Text.Length - 1);
                txtProg.Text = txtProg.Text.Remove(txtProg.Text.Length - 1);
            }
        }
        //清空数据,重新计算
        private void btnOpreaClear_Tap(object sender, GestureEventArgs e)
        {
            txtResult.Text = "";
            txtProg.Text = "";
            cal.SourceList.Clear();
            cal.DestList.Clear();
        }
        //正负转换
        private void btnPM_Tap(object sender, GestureEventArgs e)
        {
            try
            {
                double tmp = Convert.ToDouble(txtResult.Text);
                tmp = 0 - tmp;
                txtResult.Text = tmp.ToString();
            }
            catch (Exception ex) {  }
        }
        //小数点处理
        private void btnDot_Tap(object sender, GestureEventArgs e)
        {
            if (txtProg.Text == "" && txtResult.Text != "") txtResult.Text = "";//即是判断是否需要重新开始(把上一次计算结果清空)
            if (txtResult.Text.Contains('.')) return;
            txtResult.Text += ((Button)sender).Content.ToString();
            txtProg.Text += ((Button)sender).Content.ToString();
        }
    }
}


标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值