1.自己写一个计算器demo

知识点:

1.System.Math.Pow() 实现乘方

2.实现计算器的运算优先级,依次调用的流程

问题:

还未实现“()”功能

解决方案

UI:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Windows.Forms;
 8
 9 namespace CaculationTest
10 {
11     public partial class Form1 : Form
12     {
13         public Form1()
14         {
15             InitializeComponent();
16         }
17
18         private void button_Click(object sender, EventArgs e)
19         {
20             var text=((Button)sender).Text;
21             if (text == "=")
22             {
23                 Evaluate();
24             }
25             else
26             {
27                 txtExpression.Text = txtExpression.Text + text;
28             }
29         }
30
31         private void Evaluate()
32         {
33             txtExpression.Text = new Caculator().Evaluate(txtExpression.Text).ToString();
34         }
35
36         private void button16_Click(object sender, EventArgs e)
37         {
38             txtExpression.Clear();
39         }
40
41
42     }
43 }

Form1.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4
 5 namespace CaculationTest
 6 {
 7    enum TokenType
 8    {
 9        Add,Sub,
10        Mul,Div,
11        Int,
12        Expo,
13        Start,End
14    }
15
16    class Token
17    {
18        public TokenType Type;
19        public object Value;
20
21
22        public Token(TokenType type , object value = null)
23        {
24            Type = type;
25            Value = value;
26        }
27    }
28 }

Token.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4
 5 namespace CaculationTest
 6 {
 7     /// <summary>   </summary>
 8     abstract class Expression
 9     {
10         public abstract int GetValue();
11     }
12
13     class UnaryExpress : Expression
14     {
15         int _value;
16
17         public UnaryExpress(int value)
18         {
19             _value = value;
20         }
21
22
23         public override int GetValue()
24         {
25             return _value;
26         }
27     }
28
29
30     class BinaryExpression : Expression
31     {
32         TokenType _tokenType;
33         int _left;
34         int _right;
35
36
37         public BinaryExpression(TokenType tokenType, Expression left, Expression right)
38         {
39             _tokenType = tokenType;
40             _left = left.GetValue();
41             _right = right.GetValue();
42         }
43
44         public override int GetValue()
45         {
46             switch (_tokenType)
47             {
48                 case TokenType.Add:
49                     return _left + _right;
50                 case TokenType.Sub:
51                     return _left - _right;
52                 case TokenType.Mul:
53                     return _left * _right;
54                 case TokenType.Div:
55                     return _left / _right;
56                 case TokenType.Expo:
57                     return Convert.ToInt32(Math.Pow(_left,_right));
58                 default:
59                     throw new Exception("unexceptional token!");
60             }
61         }
62     }
63 }

Expression.cs

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4
  5
  6 namespace CaculationTest
  7 {
  8     /// <summary>   </summary>
  9     class Caculator
 10     {
 11         string _exp;
 12
 13         int _pos;
 14         Token _token;
 15         int _len;
 16
 17
 18         public int Evaluate(string expression)
 19         {
 20             _exp = expression;
 21             _len = expression.Length;
 22             var exp = ParseExpression();
 23             return exp.GetValue();
 24         }
 25
 26         Expression ParseExpression()
 27         {
 28             //先解析一次,解析内容存在_token中
 29             ParseToken();
 30             return ParseAddSub();
 31         }
 32
 33         //解析加减
 34         Expression ParseAddSub()
 35         {
 36             //左操作数为优先级理高的运算符
 37             var l = ParseMulDiv();
 38             while (_token.Type == TokenType.Add || _token.Type == TokenType.Sub)
 39             {
 40                 var t = _token.Type;
 41                 ParseToken();
 42                 var r = ParseMulDiv();//解析右操作数
 43                 l = new BinaryExpression(t, l, r);
 44             }
 45             return l;
 46         }
 47
 48         #region 老逻辑
 49         ////解析乘除
 50         //Expression ParseMulDiv()
 51         //{
 52         //    var l = ParseUnary();
 53         //    while (_token.Type == TokenType.Mul || _token.Type == TokenType.Div)
 54         //    {
 55         //        var t = _token.Type;
 56         //        ParseToken();
 57         //        var r=ParseUnary();
 58         //        l = new BinaryExpression(t, l, r);
 59         //    }
 60         //    return l;
 61         //}
 62         #endregion
 63
 64         //解析乘除
 65         Expression ParseMulDiv()
 66         {
 67             var l = ParseExpo();
 68             while (_token.Type == TokenType.Mul || _token.Type == TokenType.Div)
 69             {
 70                 var t = _token.Type;
 71                 ParseToken();
 72                 var r = ParseExpo();
 73                 l = new BinaryExpression(t, l, r);
 74             }
 75             return l;
 76         }
 77
 78         //解析乘方
 79         Expression ParseExpo()
 80         {
 81             var l = ParseUnary();
 82             while (_token.Type==TokenType.Expo)
 83             {
 84                 var t = _token.Type;
 85                 ParseToken();
 86                 var r = ParseUnary();
 87                 l = new BinaryExpression(t, l, r);
 88             }
 89             return l;
 90         }
 91
 92         //解析一元表达式(目前只有单个整数)
 93         Expression ParseUnary()
 94         {
 95             Expression ret = null;
 96             if (_token.Type == TokenType.Int)
 97             {
 98                 ret= new UnaryExpress((int)_token.Value);
 99             }
100
101             //解析完int后,移到下一个token处,即+-*/
102             ParseToken();
103             return ret;
104         }
105
106
107         void ParseToken()
108         {
109             //已结束
110             if (_pos >= _len)
111             {
112                 _token= new Token(TokenType.End);
113                 return;
114             }
115
116             //跳过空格
117             while (_exp[_pos] == ‘ ‘)
118             {
119                 _pos++;
120             }
121
122             //如果以数字开头,解析整数
123             if (_exp[_pos] >= ‘0‘ && _exp[_pos] <= ‘9‘)
124             {
125                 for (int i = 0; i + _pos <= _len; i++)
126                 {
127                     //如果以数字结尾,或者到达了数字的边界
128                     if( i+_pos==_len||(_exp[_pos + i] < ‘0‘ || _exp[_pos + i] > ‘9‘))
129                     {
130                         var intStr = _exp.Substring(_pos, i);
131                         var value = int.Parse(intStr);
132                         _token= new Token(TokenType.Int, value);
133                         _pos += i;  //解析成功后,更新当前位置
134                         break;
135                     }
136                 }
137             }
138             else
139             {
140                 switch (_exp[_pos])
141                 {
142                     case ‘+‘:
143                         _token=new Token(TokenType.Add);
144                         break;
145                     case ‘-‘:
146                         _token = new Token(TokenType.Sub);
147                         break;
148                     case ‘*‘:
149                         _token=new  Token(TokenType.Mul);
150                         break;
151                     case ‘/‘:
152                         _token = new Token(TokenType.Div);
153                         break;
154                     case ‘^‘:
155                         _token=new Token(TokenType.Expo);
156                         break;
157                     default:
158                         throw new Exception("unexpected token: " + _exp[_pos]);
159                 }
160                 _pos++;//解析成功后,更新当前位置
161             }
162         }
163
164     }
165 }

Calculator.cs

验证结果

时间: 2024-11-10 14:34:42

1.自己写一个计算器demo的相关文章

利用面向对象写一个计算器

本文参考了程杰的<大话设计模式>,使用C#语言利用面向对象的模式来写一个计算器. 如果是我本人来写计算器,也就加减乘除的话,估计我会全部写进控制台里面,写4个if语句出来......或者我会利用switch,但是这样的效果都不好,有更好的方法,就是如下所示的代码啦: 先定义一个Operation类,主要实现运算框架: class Operation { public double Number1 { get; set;} public double Number2 { get; set; }

如何写一个计算器

考虑这样一个问题,给定一个字符串,"1+1+(3+4)-2*3+8/2",如何将它转化为如下形式, "1+1=2" "3+4=7" "2+7=9" "2*3=6" "9-6=3" "8/2=4" "3+4=7" 换句话说,就是如何将字符串按照四则运算计算出来,如何写一个计算器.拿java来举例,并且为了简单,我们只考虑个位数.这个过程大概分为这几个

用VBA写一个计算器

着急的 玩家 可以 跳过“============”部分 ======================================可以跳过的 部分   开始====================================================== 之所以 要有今天这样一篇博客是因为. 之前领导让找几组数据.从excel表格里面. 要求是 主号码 一致,副号码 一致,名称为 XXX 的 项目发生变化的数据 需要被找到. 这样的 项目 有 11个. 我找的真的是眼要花. 变动前

用PHP写一个计算器

本篇文章介绍了使用PHP+HTML+Javascript技术编写一个计算器的方法,希望对各位学习PHP开发的同学有帮助! 用PHP写一个计算器 <body> <?php if (!empty($_POST)) { $op=$_POST['point']; $sum1 = $_POST['sum1']; $sum2 = $_POST['sum2']; $sum = 0; if ($sum1 != '' && is_numeric($sum1) && $sum

今天学习了在一般处理程序中写一个计算器

今天看了看前面的javascript以及学习的jquery,感觉刚开始学习时间就赶得比较紧,练习是做啦,基础的知识都是知道的,但是在写一些小小的程序时间还是陌生,感觉练习的还是很不够的,其实怎么说那,想好好的学习还是把他们使用到项目中练习就会学习的更快些吧,然后我又做啦一个增删改查的一般处理程序,但是还没有总结好,现在就简单的先总结一个小小的计算器使用html和ashx来实现一下其功能,如下所示: 一.html样式 <script> //@Script; </script> <

用JS写一个计算器

<!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-Typ

用JS写一个计算器(兼容手机端)

先看成果:1.PC端2. 首先确立html,有哪些东西我们要知道.布局大概的样子在心里有个数 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>瑞雪的计算器</t

五一放假作业4.30 用正则表达式写一个计算器!去掉括号,计算式子结果!

作业要求:去掉括号,计算式子结果. 1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2017/4/30 7:44# @Author : Olivia Su# @File : 作业.py# @Softw

PyQt5 写一个计算器框架

import sys from PyQt5.QtWidgets import QWidget, QLabel, QApplication, QPushButton, QHBoxLayout, QVBoxLayout, QGridLayout class Example(QWidget): def __init__(self): super().__init__() self.initUI() #---------------------------------------------------