C# 简易计算器

编写如下界面的简易计算器界面代码:

using System;
using System.Windows.Forms;
using exp;
namespace calculator
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        enum symbol { plus,dec,mult,div};

        private void button1_Click(object sender, EventArgs e)
        {
            Button currentButton = sender as Button;
            if(currentButton!= null)
            {
                textBox1.Text += currentButton.Text;
            }

        }

        private void equal_Click(object sender, EventArgs e)
        {
            //string text = textBox1.Text;
            // string[] value = text.Split(new char[4] { ‘+‘,‘-‘,‘x‘,‘/‘});
            //foreach (string i in value) MessageBox.Show(i);

            //com.change();
            compute cs = new compute(textBox1.Text);
            cs.PostFix();
            textBox1.Text=cs.scanpost().ToString();
         }

        private void clear_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";

        }
    }
}

功能实现:(创建computeexp类文件)

思路:数字以及运算符按钮共享一个点击事件,则文本框里的字符串为中缀表达式,将中缀表达式求值返回值到文本框即可。

在computeexp类中初始化操作符栈stack等,然后编写方法转化为后缀表达式,然后对后缀表达式求值

转化为后缀表达式string:
扫描中缀表达式,对于多位数字依次添加到string中,并在每个数字结束后添加空格作为数字的分界,对于操作符按照其优先级判断是否添加到stack或string中,注意括号()不出现在后缀表达式内。

优先级高的要先计算,所以运算符stack栈顶元素的优先级最高,因为要先pop出来先进行计算

后缀求值:
扫描后缀表达式,处理字符型数字为demical类型,进操作数栈,遇到运算符,从操作数栈中弹出两个数运算,计算结果再次push操作数栈,直至扫描结束,同时操作数栈顶即为最后结果

    问题:对于dowhile()循环条件的编写不清楚

1.do while 先执行一次在判断循环条件是否成立,成立继续执行,不成立跳出循环

2.注意:在进行按照string位数扫描时,如果是多位数字,如何让下一次遍历的位数正确,不出现没有扫描到操作符的问题,导致后缀表达式多个数字分 界符导致错误

      功能实现代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace exp
{
    class compute
    {
        private string exp;
        private string postexp;
        private Stack<char> oper=new Stack<char>();
        private Stack<decimal> opernum=new Stack<decimal>();
        public compute()
        {
            exp = "((34.51+5x2)+3)/5+6/4x2+3";
            exp += ‘#‘;
            postexp = "";
            oper.Push(‘#‘);
        }
        public int prority(char c)
        {

            if (c == ‘x‘ || c == ‘/‘) return 3;
            if (c == ‘+‘ || c == ‘-‘) return 2;
            // if (c == ‘)‘) return 0;
            if (c == ‘(‘) return 1;//遇到(直接入栈
            if (c == ‘#‘) return 0;
            return -1;
        }

        public void PostFix()
        {
            int i = 0;
            while(i<exp.Length)
            {
                     if (exp[i]==‘#‘)
                        {
                                while(true)
                                {
                                    if (oper.Peek() == ‘#‘) break;
                                    char tem = oper.Peek();
                                    postexp += tem;
                                    oper.Pop();
                                }

                        }
                         else
                        {
                                if (exp[i] >= ‘0‘ && exp[i] <= ‘9‘)
                            {//若为操作数
                                postexp += exp[i];
                                //加上小数点和多位数
                                while (exp[i + 1] >= ‘0‘ && exp[i + 1] <= ‘9‘)
                                {
                                    i++;
                                    postexp += exp[i];

                                }

                                    postexp += ‘ ‘;     

                            }
                                else
                                {//若为其他符号
                                    switch (exp[i])
                                    {
                                        case ‘(‘: oper.Push(exp[i]); break;
                                        case ‘)‘:
                                            while (true)
                                            {
                                        if (oper.Peek() == ‘(‘) break;
                                                char cur = oper.Peek();
                                                postexp += cur;
                                                oper.Pop();
                                            }
                                            oper.Pop();
                                            break;
                            case ‘.‘:
                                postexp = postexp.Substring(0,postexp.Length-1);//截取字符串
                                postexp += ‘.‘;break;
                            default:
                                            if (prority(oper.Peek()) < prority(exp[i])) oper.Push(exp[i]);
                                            else
                                            {
                                                while (true)
                                                {
                                                    if (prority(exp[i]) > prority(oper.Peek())) break;
                                                    char tem = oper.Peek();
                                                    postexp += tem;
                                                    oper.Pop();
                                                }
                                                oper.Push(exp[i]);
                                            }
                                            break;

                                    }//switch

                                }//numelse

                }//#else

                        i++;

             }//while

            }//函数

        public void show()
        {
            Console.WriteLine(exp);
            Console.WriteLine(postexp);
        }
        public decimal computepost(char c)
        {
            decimal first, second,res=0;
            second = opernum.Pop();//第二操作数
            first = opernum.Pop();//第一操作数
            if (c == ‘+‘) res = first + second;
            if (c == ‘-‘) res = first - second;
            if (c == ‘x‘) res = first * second;
            if (c == ‘/‘) res = first / second;
            return res;

        }
        public decimal scanpost()
        {
            int i = 0;
            while (i <= postexp.Length - 1)
            {
                if(postexp[i]>=‘0‘&&postexp[i]<=‘9‘)
                {//读到操作数
                    decimal num = 0;
                    string nu ="";
                    nu += postexp[i];
                    while(postexp[i+1]!=‘ ‘)
                    {
                        i++;
                        nu += postexp[i];

                    }
                    num = Convert.ToDecimal(nu);
                    opernum.Push(num);
                }
                else if(postexp[i]!=‘ ‘)
                {//读到操作符或空格
                        opernum.Push(computepost(postexp[i]));
                }
                i++;
            }
            Console.WriteLine("result="+opernum.Peek());
            return oper.Peek();
        }

    }
}

时间: 2024-10-29 19:05:44

C# 简易计算器的相关文章

函数调用_猜数字和简易计算器

package app1; import java.util.*; public class TestFunction{     public static void main(String[] args){         Scanner sc=new Scanner(System.in);         System.out.print("请选择一项应用:\n1.猜数字\n2.简易计算器");         int n=sc.nextInt();         switch(

基于mini2440简易计算器

基于mini2440简易计算器使用的是数组实现,并非逆波兰式,因此功能不够强大,仅供驱动学习,以及C语言基础编程学习之用.有时间读者可以用逆波兰式来实现强大功能计算器,原理也很简单,建议读<c程序设计第二版>里面有算法的代码.读者自行研究.此程序基于电子相册的改进,触摸屏,LCD,字符现实,数字输入等等 mini2440  索尼X35   LCD液晶屏 主函数部分: #include "def.h" #include "option.h" #includ

如何用jsp实现一个简易计算器(三)

做这个jsp页面,主要是为了实现在同一个页面提交和接受数据的功能. 这个小程序存在很多不足,希望大家多多批评指正. <%@ page language="java" contentType="text/html;" pageEncoding="gbk"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w

PyQt5 简易计算器

剩下计算函数(self.calculator)未实现,有兴趣的朋友可以实现它 [知识点] 1.利用循环添加按钮部件,及给每个按钮设置信号/槽 2.给按钮设置固定大小:button.setFixedSize(QtCore.QSize(60,30)) 3.取事件的的发送者(此例为各个按钮)的文本: self.sender().text() [效果图] [源代码] 1 import sys 2 from PyQt5 import QtWidgets,QtCore,QtGui 3 4 5 class E

java简易计算器

此小程序实现了计算器的基本功能: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SimpleCalc extends JFrame{ private static final long serialVersionUID = 1L; String[] labels = {"←","CE","±","√", "

js css 实现简易计算器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

结对-简易计算器-设计文档

项目:简易计算器 本设计的大概需要的功能:1.可以判断是小数点前还是后 2.需要初始化小数点后的倍率 3.可以标记加减乘除 4.需要记录上一轮结果 5.实现每个数字按钮和算数按钮

【C++探索之旅】第一部分第五课:简易计算器

内容简介 1.第一部分第五课:简易计算器 2.第一部分第六课预告:控制流程,随心所至 简易计算器 上一课<[C++探索之旅]第一部分第四课:内存,变量和引用>中,我们已经学习了挺重要的内存的概念,变量的知识,对引用这个C++中常用的技术也有了初步的了解. 我们在上一课开头处用一个小小计算器的存储技术引出内存的概念.其实我们的电脑兄也是一个计算器,只不过高端大气上档次了很多,不然怎么会被称为 computer呢?英语中compute这个词,正是<计算>的意思,而加上r就构成了名词.c

C++实现简易计算器(正则表达式计算)

说明:简单高效的C++代码,实现简易计算器(正则表达式计算),允许小数.括号.但没有表达式正误检验功能,所以测试前请确保式子正确哦 数据结构:栈 示范输入: ((1.5+2.5)*3-4)+5 42/7-(12+3)*0.5 标准输出: the answer is 13 the answer is -1.5 源代码: #include <iostream>#include <stack> using namespace std; stack<double> number